Skip to Content
RSSGrab the RSS feed! ->

Como crear un CCK formatter

Categorías

CCK formatters son piezas de código que permiten renderizar el contenido de un campo CCK de forma diferente. En Drupal 6 esto es básicamente una función theme.

Como ejemplo, vamos a hacer un formatter para el tipo de campo 'nodereference'.
Este tipo de campo, que forma parte del paquete CCK por defecto de Drupal 6, permite "referenciar" un nodo dentro de otro.

El cck formatter que tiene nodreference por defecto, imprime un link normal y corriente a ese nodo referenciado.

Nosotros vamos a dar otras opciones al usuario, permitiendole elegir si quiere que se abra una ventana nueva en su navegador o, si tiene el módulo popups activado, que lo haga en un popup de jQuery (modal window).

Llamaremos a nuestro modulo 'formattertest'.

Paso 1: Declarar nuestro CCK formatter

Para hacer esto, lo unico que tenemos que hacer es implementar hook_field_formatter_info() en nuestro módulo:

<?php
/**
* Implementation of hook_field_formatter_info().
*
* Aqui definimos en un array las opciones que vamos a ofrecer en display fields
* los keys se usan para luego en hook_theme y theme_
*/

function formattertest_field_formatter_info() {
 
$formatters = array(
   
'newwindow' => array(
     
'label' => t('Open in new window link'),
     
'field types' => array('nodereference'),
     
'description' => t('Displays a link to the referenced node that opens in a new window.'),
    ),
  );
  if (
module_exists('popups')) {
   
$formatters['popup'] = array(
     
'label' => t('Open in a popup window'),
     
'field types' => array('nodereference'),
     
'description' => t('Displays a link to the referenced node that opens in a jQuery modal window.'),
    );
  }
  return
$formatters;
}
?>

En esta función, has de retornar un array de arrays, que definen cada formatter que tu modulo provee.

  • label: El nombre que el usuario podrá elegir en la página de display fields
  • field tylpes: un array con los tipos de campos cck con los que funciona tu cck formatter.

Importante recordar que los keys del array, en este caso 'newwindow' y 'popup', se utilizaran mas adelante para construir nuestra función de hook_theme y theme_.
Nota que en el segundo formatter, primero chequeamos que el modulo popups esta en el sistema, y entonces añadimos al array nuestro formatter que hace uso del módulo.

2. Implemetnar hook_theme

En hook_theme() hay que retornar también un array de arrays, definiendo las funciones de theme_ que se encargaran de renderizar el contenido. 'element' será el contenido del campo cck a renderizar, que tendrá como parametro nuestra funcion theme_.

<?php
/**
* Implementation of hook_theme().
*
* Declaramos nuestras funciones de theme_ de acuerdo a los keys en hook_field_formatter_info
*/
function formattertest_theme() {
 
$theme = array(
   
'formattertest_formatter_newwindow' => array(
     
'arguments' => array('element' => NULL),
    ),
  );
  if (
module_exists('popups')) {
   
$theme['formattertest_formatter_popup'] = array('arguments' => array('element' => NULL));
  }
  return
$theme;
}
?>

'formattertest_formatter_newwindow' y 'formattertest_formatter_popup' sera usado para construir nuestras funciones en el paso siguiente.

3. Crear nuestras funciones de theme.

Recuerda que puedes hacer dsm($element); (si tienes devel instalado), para ver que tienes para jugar ;)

<?php
/**
* Theming functions for our formatters
*
* Y aqui ya hacemos lo que queremos. usar dsm($element) para ver que tienes para trastear.
*/
function theme_formattertest_formatter_newwindow($element) {
 
$output = '';
  if (!empty(
$element['#item']['nid']) && is_numeric($element['#item']['nid']) && ($title = _nodereference_titles($element['#item']['nid']))) {
   
$output = l($title, 'node/'. $element['#item']['nid'], array('attributes' => array('target' => 'blank_')));
  }
  return
$output;
}

/* Theme function for popup links */
function theme_formattertest_formatter_popup($element) {
 
$nid = $element['#item']['nid'];
 
$link_id = 'popup-'. $nid; // we want an unique id for each link so we can tell popups api to only do those =)
 
$output = '';
  if (!empty(
$nid) && is_numeric($nid) && ($title = _nodereference_titles($nid))) {
   
$output = l($title, 'node/'. $nid, array('attributes' => array('id' => $link_id)));
  }
 
popups_add_popups(array('#'. $link_id));
  return
$output;
}
?>

En la primera función, partimos del formatter que nodreference tiene por defecto, y le añadimos target="_blank" para que el navegador lo abra en una nueva ventana.

En la segunda función, primero metemos en una variable $nid el nid del nodo referenciado, para construir el id del link que usaremos con popups api ($link_id). Construimos el link incluyendo el id, y luego le decimos al módulo popup que solo ese link tiene esa funcionalidad, evitando hacer que el js escanee toda la pagina, y mejorando así el rendimiento de nuestra web, de cara al usuario final.

Conclusión.

Imagina por ejemplo, que tu módulo provee también de una view, puedes usar esta view para sacar información de contenidos dependiendo del valor del campo cck en tu formatter - al implementarlo de esta manera, puedes reusarlo en cualquier tipo de campo que tu formatter soporte, una y otra vez. Sin tener que hacer auténticos malabarismos en tu template.php cada vez que quieras usar otro campo de esa manera.

AttachmentSize
formattertest.tar.gz1.22 KB

6 respuestas a este artículo.

#1

Muy, muy interesante este

Muy, muy interesante este apunto sobre todo por lo claro del mismo así da gusto XD

Por cierto enhorabuena por el blog

#2

Me alegra que te sirva

Me alegra que te sirva Karlos! A ver que os sacáis de la manga con esto, los CCK formatters son muy potentes.

Y gracias por la enhorabuena, al fin pude echarle tiempo y montar la página =)

#3

Sencillo y efectivo,

Sencillo y efectivo, enhorabuena

#4

Justo lo que necesitaba.

Justo lo que necesitaba. Muchas gracias, llevaba horas intentando hacer algo así.
Me sumo a las enhorabuenas.

#5

Muy bueno el post y un tema

Muy bueno el post y un tema extraordinariamente práctico.
Enhorabuena!

#6

Muchas gracias por estos

Muchas gracias por estos buenos aportes....queria preguntarte si sabes como crear un campo CCK pero con codigo osea no construyendolo directamente sino creandolo con codigo.

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.

Idiomas

Contact