Hero

Como crear un Ctools plugin de tipo content type en Panels

Abril 25, 2013

estebanvalerioh
Desarrollo de Modulos

Si estamos trabajando con Paneles, puede ser muy útil tener plugins propios que generen contenido que pudiéramos agregar a una región específica de nuestro paneles.

A continuación crearemos un plugin para Ctools de clase “Content Type”, esto es diferente a los Content Type creados por el Entity:

1- Estructura de los directorios.

Para mantener los estándares, nos aseguramos de tener los directorios de la siguiente forma:

custom_module/
custom_module/custom_module.info
custom_module/custom_module.module
custom_module/plugins/
custom_module/plugins/content_types/
custom_module/plugins/content_types/nombre_del_plugin.inc

2- Indicarle al módulo Ctools de nuestro plugin.

Manteniendo la estructura de directorios mencionada, copiamos en custom_module.module la siguiente función.

/**
 * Implements hook_ctools_plugin_directory().
 */
function custom_module_ctools_plugin_directory($module, $plugin) {
 if ($module == 'ctools' && !empty($plugin)) {
 return "plugins/$plugin";
 }
}

3- Indicarle al módulo de Panels que incorpore nuestro plugin.

Siempre en nuestro archivo custom_module.module, copiamos la siguiente función.

/**
 * Implement hook_ctools_plugin_api().
 */
function custom_module_ctools_plugin_api($module, $api) {
 if ($module == 'panels_mini' && $api == 'panels_default') {
 return array('version' => 1);
 }
 if ($module == 'page_manager' && $api == 'pages_default') {
 return array('version' => 1);
 }
}

4- Definición de nuestro plugin.

Al inicio de nuestro archivo nombre_del_plugin.inc, creamos un arreglo con las características principales de nuestro plugin

$plugin = array(
 'title' => t('Titulo del Plugin'),
 'description' => t('Breve descripción.'),
 'single' => TRUE,
 'content_types' => 'nombre_del_plugin',
 'render callback' => 'nombre_del_plugin_render',
 'edit form' => 'nombre_del_plugin_edit_form',
 'category' => array(t('Custom Plugin'), -9),
 'defaults' => array(),
);

En este punto vamos a poder ver nuestra categoría Custom Plugin en la lista de opciones para agregar, como en la siguiente imágen:

En la siguiente imágen podemos ver la opción de selección del Tipo de Contenido de CtoolsTitulo del Plugin“.

5- Función de edición/configuración.

Cuando agregamos nuestro plugin como contenido de una región de un Panel, podemos mostrarle al usuario un formulario donde puede ingresar datos, los cuales posteriormente vamos a utilizar para desplegar el contenido con el que estemos trabajando. Eso lo hacemos de la siguiente forma

function nombre_del_plugin_edit_form($form, &$form_state) {
 $conf = $form_state['conf'];
 $form['config_number'] = array(
 '#type' => 'textfield',
 '#title' => t('Ingrese un número'),
 '#size' => 20,
 '#description' => t('Número para mostrar al usuario.'),
 '#default_value' => !empty($conf['config_number']) ? $conf['config_number'] : '',
 '#prefix' => '<div class="clear-block no-float">',
 '#suffix' => '</div>',
 );
 return $form;
}


function nombre_del_plugin_edit_form_submit($form, &$form_state) {
 foreach (element_children($form) as $key) {
 if (!empty($form_state['values'][$key])) {
 $form_state['conf'][$key] = $form_state['values'][$key];
 }
 }
}

El formulario de configuración creado anteriormente sería similar al presentado en la siguiente imágen.

6- Desplegando el contenido.

Esta función, se encarga de generar el bloque que va a renderizar el contenido con el que estamos trabajando. En la variable $conf encontraremos los valores definidos en nuestra función de edición, y en la variable $args, los valores que pueden venir en la URL definida de nuestro Panel.

function nombre_del_plugin_render($subtype, $conf, $args, $context) {
 $numero = !empty($conf['config_number']) ? $conf['config_number'] : 0;
 $block = new stdClass();
 $block->title = "Mi primer plugin";
 $block->content = "Contenido de mi bloque, el número ingresado es: $numero.";
 return $block;
}

La forma de desplegar el contenido va a depender de la configuración que cada usuario tenga con el css y html.

Espero les sea de utilidad.

Recibe consejos y oportunidades de trabajo 100% remotas y en dólares de weKnow Inc.