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?


+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.


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;
}

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;
}

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);

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.