read

Crear plugins de ctools (context, relationship, content type) (Parte 3/3)

En esta tercer entrada crearemos un content type que utilice nuestro contexto (parte 1/3) y que tenga una pequeña interfaz de configuración.

Para empezar, tenemos que declararle a ctools la ubicación de nuestros plugins de tipo content_type al igual que lo hicimos con los anteriores; para ello, modificamos nuestro hook_ctools_plugin_directory para que quede así:

/**
 * Implements hook_ctools_plugin_directory().
 */
function ctools_demo_ctools_plugin_directory($owner, $plugin_type) {
  if ($owner === 'ctools' && $plugin_type === 'contexts') {
    return 'plugins/contexts';
  }
  if ($owner === 'ctools' && $plugin_type === 'relationships') {
    return 'plugins/relationships';
  }
  if ($owner === 'ctools' && $plugin_type === 'content_types') {
    return 'plugins/content_types';
  }
}

Con lo anterior, le decimos a ctools que los plugins de tipo content_type los puede encontrar en la carpeta plugins/content_types. Ahora, el siguiente paso es declarar e implementar nuestro content_type; para ello, en la carpeta antes mencionada creamos un archivo al que vamos a llamarle en este ejemplo demo_content_type.inc y que contiene el siguiente código:

<?php

/**
 * @file
 * Demo content type.
 */

$plugin = array(
  'single' => TRUE,
  'title' => t('Demo Content Type'),
  'content_types' => 'demo_content_type',
  'description' => t('Example content type.'),
  'render callback' => 'demo_content_type_render',
  'edit form' => 'demo_content_type_edit_form',
  'category' => t('Demo'),
  'required context' => array(
    new ctools_context_required(t('Demo Context'), 'demo_context'),
  ),
);

/**
 * Render the custom content type.
 */
function demo_content_type_render($subtype, $conf, $panel_args, $context) {
  // Single variable for required context.
  list($demo_context) = $context;

  if (empty($demo_context) || empty($demo_context->data['demo_context_select'])) {
    return;
  }

  // Build the content type block.
  $block = new stdClass();
  $block->title   = '';
  $block->content = array(
    'content' => array(
      '#markup' => '',
    ),
  );

  $select_value = $demo_context->data['demo_context_select'];
  for ($index = 0; $index < $conf['repeat_times']; $index++) {
    $block['content']['#markup'] .= '<p>' . $select_value . '</p>';
  }

  return $block;
}

/**
 * Returns an edit form for custom type settings.
 */
function demo_content_type_edit_form($form, &$form_state) {
  $form['repeat_times'] = array(
    '#title' => t('Repeat Times'),
    '#type' => 'select',
    '#options' => array(
      '1' => t('One'),
      '2' => t('Two'),
      '3' => t('Three'),
      '4' => t('Four'),
      '5' => t('Five'),
    ),
    '#default_value' => isset($form_state['conf']['repeat_times']) ? $form_state['conf']['repeat_times'] : '1',
    '#required' => TRUE,
  );

  return $form;
}

/**
 * Submit handler for the custom type settings form.
 */
function demo_content_type_edit_form_submit($form, &$form_state) {
  foreach ($form_state['values'] as $key => $value) {
    $form_state['conf'][$key] = $value;
  }
}

Como el form y el submit no hay nada nuevo en comparación con lo que hemos visto en las entradas anteriores; entonces pasaremos directamente a hablar del render callback.

En las primeras 4 líneas nos aseguramos de tener los datos necesarios para poder hacer render de nuestro content type. Luego, empezamos a construir el bloque de nuestro content type con los datos que tenemos. En nuestro contexto ($demo_content), en la propiedad data tenemos la información proveniente del contexto y en $conf tenemos la información proveniente del form; entonces, usamos esto para construir un array de render y returnarlo en la propiedad content de nuestro objeto.

Esta es la última entrada de esta serie de entradas en las que hemos aprendido a crear contextos, relaciones y content types de ctools. Espero les hayan sido útiles.

Blog Logo

Kevin Jesús Porras Zumbado

Drupal Backend Developer y un poco de site-builder. Me gustan los retos con las tecnologías y siempre aprender cosas nuevas.


Published

blog comments powered by Disqus
Image

Blog de Kporras07

Un intento personal de documentación

Back to Overview