Drupal 7: Aggiungere dei campi calcolati a una entità

Tags: 

Caso d'uso: state creando un modulo che deve aggiungere dei campi visibili a una entità. Il valore di questi campi è generato dal modulo stesso, e volete che questi campi fittizi siano visti nella pagina "Gestisci visualizzazione" dell'entità in modo da poter definire l'ordinamento, e in generale il layout, della visualizzazione in maniera tradizionale.

Per fare questo dovete usare l'hook hook_field_extra_fields (o l'analogo hook_field_extra_fields_alter).

https://api.drupal.org/api/drupal/modules!field!field.api.php/function/h...

Scopo di questo hook è dichiarare dei campi aggiuntivi (sia visibili che editabili) da mostrare nelle pagine di gestione dell'entità, in modo da poterne definire l'ordine. Da notare che la generazione dell'output effettivo legato al campo si fa con i metodi tradizionali (ad esempio tramite hook_node_view), che non hanno bisogno di dichiarare l'extra field. Questa dichiarazione serve solo per avere il "placeholder" nella pagina dei campi e quindi poter definire l'ordine di visualizzazione (o l'effettiva visualizzazione). In particolare l'hook agisce in fase di "pre_render" dell'entità (dopo che è stato generato tutto l'output da visualizzare e si decide COME visualizzarlo).

Un semplice esempio completo per aggiungere un campo visibile "test" a tutte le entità:

function example_field_extra_fields() {
  $items = array( 'node' => array());
  foreach (node_type_get_types() as $type) {
    $items['node'][$type] = array(
      'display' => array(
        'example_test' => array(
          'label' => t('Test'),
          'description' => t('Test field description'),
          'weight' => 0,
        ),
      ),
    );
  }
  return $items;
}
 
function example_node_view($node, $build_mode = 'full') {
  $node->content['example_test'] = array(
    '#markup' => t('Example field value'),
  );
}

Da notare che l'hook extra_fields permette di specificare anche dei campi di editing in maniera similare, usando la chiave "form" invece di "display".

Aggiungi un commento