Hero

Como crear un panel "content type" utilizando context en Drupal 7

Mayo 13, 2013

estebanvalerioh
PHP
Programación
Drupal
Panels

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” utilizando context de panels, 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
  1. 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";
 }
}
  1. 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);
 }
}
  1. 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 y es aquí donde indicamos que nuestro plugin requiere de un contexto para poder ser utilizado, en este caso el contexto será de tipo NODE.

$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',
 'required context' => array(
    new ctools_context_required(t('Node'), 'node'),
  ), 
 'edit form' => 'nombre_del_plugin_edit_form',
 'category' => array(t('Custom Plugin'), -9),
 'defaults' => array(),
);

Agregamos el context al panel, como en la siguiente imagen:

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

En la siguiente imagen podemos ver la opción de selección del Tipo de Contenido de Ctools “Titulo del Plugin”, pero debemos tener en cuenta que esta opción estará disponible si y solo sí el panel tiene un context de tipo NODE asociado.

  1. 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 imagen.

  1. 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;

  if (empty($context) ) {
    return;
  }

  $context = array_shift($context);

  if (isset($context->data) && empty($context->data)) {
    return;
  }

  $node = $context->data;
  $block = new stdClass();

  $block->title = "Mi primer plugin";
  $block->content = "Contenido de mi bloque, el número ingresado es: $numero y el título del nodo es: {$node->title}.";
  return $block;
}

En la variable $context contendrá la información proveniente del contexto del panel, que es este caso será la información del Nodo.

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

Espero les sea de utilidad.

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