Como renderizar um tipo de conteúdo ctools programaticamente?

12

Eu tenho um plugin ctools aka. também conhecido como tipo de conteúdo. painel de painel. Como alguém a processa programaticamente?

roGi
fonte
+1, pergunta muito interessante. Estou pensando, porém, pode um plugin ctools ser renderizado fora de uma página do gerenciador de páginas? Como isso seria nulo de um contexto, a renderização e o tipo de conteúdo ainda fazem sentido?
Letharion
O uso de contextos não é obrigatório. Além disso, forçar um contexto manualmente é sempre uma opção. Como aqui - gist.github.com/3076130
roGi

Respostas:

4

ctools_content_render() é a solução.

roGi
fonte
2
Você pode fornecer um exemplo de como isso funcionaria? Estou lendo os documentos e tentar coisas, mas não chegando a lugar nenhum
Paul Sheldrake
Dependendo de onde você chama ctools_content_render (), também pode ser necessário colocar o código ctools no escopo, caso contrário, você receberá erros fatais. Isso pode ser alcançado com "module_load_include (" inc "," ctools "," includes / content ");"
Alexkb
Não se esqueça de incluir ctools_include('content');antes ctools_content_render(), porque em outro caso você receberá um erro fatal.
Andrey Rudenko 07/07
3

Há um exemplo excelente e simples de como fazer isso no ctools_ajax_samplemódulo (no pacote CTools).

Como foi apontado, a chave é usar a função ctools_content_render().

O exemplo mostra como preencher os argumentos da função, embora você obviamente precise personalizá-lo de acordo com suas necessidades.

Esse tópico no Drupal Groups fornece mais informações sobre como carregar o contexto correto.

Arquivo ctools/ctools_ajax_sample/ctools_ajax_sample.module

function ctools_ajax_simple_form() {
  ctools_include('content');
  ctools_include('context');
  $node = node_load(1);
  $context = ctools_context_create('node', $node);
  $context = array('context_node_1' => $context);
  return ctools_content_render('node_comment_form', 'node_comment_form', ctools_ajax_simple_form_pane(), array(), array(), $context);
}

function ctools_ajax_simple_form_pane() {
  $configuration = array(
    'anon_links' => 0,
    'context' => 'context_node_1',
    'override_title' => 0,
    'override_title_text' => '',
  );
  return $configuration;
}
bmunslow
fonte
2

Se você carregar o arquivo necessário, tudo o que você realmente precisa fazer é chamar a função render ( hook_content_type_render), que retornará um objeto de classe padrão, assim como hook_block_viewfaz.
Tudo o que você precisa é uma função de tema, a menos que você queira renderizar diretamente a saída bruta.

No código, poderia ser algo como isto:

function render_ctools_content($subtype, $conf, $panel_args, $context, $function, $file, $theme = TRUE) {
  require_once $file;
  $pane = new stdClass();
  if (function_exists($function)) {
    $pane = $function($subtype, $conf, $panel_args, $context); // hook_content_type_render
  }
  if ($theme) {
    return theme('module_ctools_content', array('pane' => $pane));
  }
  return $pane->content;
}
googletorp
fonte
1
Obrigado pela sua resposta. Chamar a função render diretamente é, obviamente, a escolha óbvia. Mas essa solução parece mais um hack. Eu estou procurando algo ao longo das linhas de "ctools_render_ctype ( 'ctype_name')" :)
rogi
@roGi Essa função não existe, o que eu mostrei acima é a essência de como ela seria, mas provavelmente não será viável tornar algo tão simples como você sugere, já que os tipos de conteúdo ctools não são assim simples.
googletorp
0

Consegui extrair uma página em painel em panopólio usando o seguinte código:

module_load_include('inc', 'page_manager', 'plugins/tasks/node_view');
$node = node_load($nid);
$render = page_manager_node_view_page($node);
echo drupal_render($render);
chadpeppers
fonte
Ao incluir o arquivo de plug-in, module_load_include()você pode interromper o processo de carregamento de plug-ins do ctools. O CTools usa o require_oncemétodo, portanto, se o arquivo foi incluído anteriormente pelo script de terceiros, não será possível incluí-lo pelo ctools (e pela $pluginmatriz de análise ). Portanto, como novo teste, seu painel não funcionará em outros lugares.
Andrey Rudenko