Abril 25, 2013
estebanvalerioh
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 Ctools ”Titulo 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.