¿Cómo representar un tipo de contenido de ctools mediante programación?

12

Tengo un complemento de ctools aka. tipo de contenido aka. panel de panel. ¿Cómo se renderiza mediante programación?

roGi
fuente
+1, pregunta muy interesante. Sin embargo, me pregunto, ¿se puede representar un complemento de ctools fuera de una página de administrador de página? Dado que eso sería nulo en un contexto, ¿todavía tiene sentido representar el tipo de contenido?
Letharion
Usar contextos no es obligatorio. Además, forzar un contexto manualmente siempre es una opción. Como aquí - gist.github.com/3076130
roGi

Respuestas:

4

ctools_content_render() Es la solución.

roGi
fuente
2
¿Puedes dar un ejemplo de cómo funcionaría esto? Estoy leyendo los documentos y probando cosas, pero no llego a ninguna parte
Paul Sheldrake
Dependiendo de dónde llame a ctools_content_render (), es posible que también deba poner el código de ctools al alcance, de lo contrario obtendrá errores fatales. Esto se puede lograr con "module_load_include (" inc "," ctools "," incluye / content ");"
alexkb
No olvide incluir ctools_include('content');antes ctools_content_render(), porque en otro caso obtendrá un error fatal.
Andrey Rudenko
3

Hay un excelente y simple ejemplo de cómo hacer esto en el ctools_ajax_samplemó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;
}
bmunslow
fuente
2

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_viewhace.
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;
}
googletorp
fuente
1
gracias por su respuesta. Llamar directamente al func de render es, por supuesto, la opción obvia. Pero esta solución se siente más como un truco. Estoy buscando algo similar a "ctools_render_ctype ('ctype_name')" :)
roGi
@roGi Esa función no existe, lo que he mostrado arriba es la esencia de cómo se vería, pero probablemente no sea factible hacer algo tan simple como sugieres, ya que los tipos de contenido de ctools no son tan sencillo.
googletorp
0

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);
chadpeppers
fuente
Al incluir el archivo de complemento module_load_include(), puede interrumpir el proceso de carga de complementos de ctools. CTools usa el require_oncemétodo, por lo que si el archivo fue incluido previamente por un script de terceros, no será posible incluirlo por ctools (y parse $pluginarray). Como resultado, su panel no funcionará en otros lugares.
Andrey Rudenko