Crear pseudofields en entidades.

Ya se que parece raro la idea de un pseudofield, o lo que es lo mismo un campo falso. Pero lo cierto es que puede ser de ayuda.

Lo primero es entender que son los pseudofields.

Los no-fields son elementos que colocamos dentro de un nodo, para gestionarlos como fields, pero que a diferencia de los fields no podemos agregar valor en el formulario, ya sea porque este valor se genera automáticamente, o porque es una constante.

Por ejemplo queremos agregar botones de redes sociales, pero queremos tener la opción de que aparezcan como fields para poder ordenarlos, o queremos generar un menú de navegación de Anchors, que nos lleven a diferentes partes del nodo. En ambos casos podríamos resolverlos de múltiples maneras, podriamos generar una variable y pintar el contenido de la variable, agregarlo en el content links, etc...

La ventaja de generar un pseudofield, es que podemos controlar el peso/orden del elemento dentro del nodo, y se puede usar la UX para posicionar el pseudofield donde queramos.

Veamos como se hace en dos sencillos paso, primero usamos el hook_field_extra_fields para definir el pseudofield, y luego usamos el hook_node_view o el hook_entity_view para agregarlos a un nodo.

<?php
/**
 * Implements hook_field_extra_fields().
 */
function example_pseudofields_field_extra_fields() {
 
   
 
$extra['node']['item1']['display'][item1_PSEUDOFIELD] = array(
   
'label' => t('item1 pseudomenu'),
   
'description' => t('Generate pseudomenu'),
   
'weight' => 50, // default weight, can be changed on display form by site-builder.
 
);
   
  
$extra['node']['item2']['display'][item2_PSEUDOFIELD] = array(
   
'label' => t('item2 pseudomenu'),
   
'description' => t('Generate pseudomenu'),
   
'weight' => 50, // default weight, can be changed on display form by site-builder.
 
);  
  return
$extra;
}
/**
 * Implements hook_node_view().
 * Also HOOK_entity_view() can be used.
 */
function example_pseudofields_node_view($node, $view_mode, $langcode) {
 
$extrafields = field_extra_fields_get_display('node', $node->type, $view_mode);
  if (  isset(
$extrafields[item1_PSEUDOFIELD])   &&
        isset(
$extrafields[item1_PSEUDOFIELD]['visible'])    &&        
       
$extrafields[item1_PSEUDOFIELD]['visible'])
  {

    $items = _example_pseudofields_build_menu($node, 'pseudomenu_item1');
   
$node->content[item1_PSEUDOFIELD] = array('#markup' =>$items);   
  }
  if (isset(
$extrafields[item2_PSEUDOFIELD])   &&
      isset(
$extrafields[item2_PSEUDOFIELD]['visible'])  &&
     
$extrafields[item2_PSEUDOFIELD]['visible'])
  {

    $items = _example_pseudofields_build_menu($node, 'pseudomenu_item2');
   
$node->content[item2_PSEUDOFIELD] = array('#markup' =>$items);   
  }
}
?>