Tengo un complemento de ctools aka. tipo de contenido aka. panel de panel. ¿Cómo se renderiza mediante programación?
Tengo un complemento de ctools aka. tipo de contenido aka. panel de panel. ¿Cómo se renderiza mediante programación?
Respuestas:
ctools_content_render()
Es la solución.
ctools_include('content');
antes ctools_content_render()
, porque en otro caso obtendrá un error fatal.
Hay un excelente y simple ejemplo de cómo hacer esto en el ctools_ajax_sample
módulo (en la suite CTools).
Como se ha señalado, la clave es usar la función ctools_content_render()
.
El ejemplo muestra cómo llenar los argumentos de la función, aunque obviamente debe personalizarla según sus necesidades.
Este hilo en Drupal Groups da más información sobre cómo cargar el contexto correcto.
Archivo 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;
}
Si carga el archivo requerido, todo lo que realmente necesita hacer es llamar a la función de representación ( hook_content_type_render
) que devolverá un objeto de clase estándar, al igual que lo hook_block_view
hace.
Todo lo que necesita a partir de ahí es una función de tema, a menos que solo desee renderizar la salida sin formato directamente.
En código, podría verse más o menos así:
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;
}
Pude extraer una página panelizada en panopolia usando el siguiente 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);
module_load_include()
, puede interrumpir el proceso de carga de complementos de ctools. CTools usa el require_once
método, por lo que si el archivo fue incluido previamente por un script de terceros, no será posible incluirlo por ctools (y parse $plugin
array). Como resultado, su panel no funcionará en otros lugares.