Sono consapevole che oggigiorno parlare di Drupal 7 "puzza un po' di vecchio" dal momento che tutta la community è giustamente orientata verso l'utilizzo e l'evoluzione di Drupal 8. Certo è che a me capita ancora di lavorare su numerosi progetti web sviluppati in D7 e secondo le ultime notizie sarà supportato fino a Novembre 2021. Quindi non trovo fuori luogo trattare argomenti per migliorare il codice dei propri progetti in D7.
Il motivo che mi ha spinto a scrivere questo articolo nasce dal fatto che nelle manutenzioni di cui mi sto occupando trovo in continuazione l'utilizzo dei field array per recuperare i valori contenuti nelle entità di Drupal. Nulla di personale contro questa struttura dati, ma sono sempre alla ricerca del modo più pulito e sicuro di scrivere codice. D'accordo che istruzioni come
print $node->field_my_field_name['und'][0]['value'];
oppure
print $node->field_my_field_name[LANUGAGE_NONE][0]['value'];
fanno il loro dovere, ma cosa succede quando stiamo lavorando su un sito multi lingua? Ovviamente saremo noi programmatori a dover fare attenzione alla scelta del codice lingua da utilizzare come chiave. Ma dico io: se lo strumento che stiamo utilizzando, ovvero Drupal, ci da la possibilità di evitarci questo onere, perché farci del male e rischiare di sbagliare? Ecco perché anni fa giunsi alla conclusione che utilizzare la funzione field_get_items()
fosse la strada giusta.
$my_field_items = field_get_items('node', $node, 'field_my_field_name');
if ($my_field_items) {
$my_field_first_item = reset($my_field_items);
$my_field_value = $my_field_first_item['value'];
}
Ma presto mi dovetti ricredere. Sì perché... ho capito che non devo più preoccuparmi della lingua, ma un modo meno ingombrante per recuperare il valore di un campo? Soprattutto se devo manipolare strutture dati più complesse di un semplice campo di testo?
Un giorno di un paio d'anni fa, durante le mie consuete letture su Drupal.org, scoprii l'esistenza dell'oggetto Entity metadata wrappers che rivoluzionò il mio modo di manipolare le entità di Drupal: due righe di codice ed il gioco è fatto.
$node_wrapper = entity_metadata_wrapper('node', $node);
$node_wrapper->field_my_field_name->value();
Ovviamente bisogna fare i conti con la memoria consumata durante l'utilizzo di questo wrapper, ma di sicuro ne guadagnerai in salute vista la semplicità di utilizzo e la pulizia che avrà il tuo codice. Per avere un'idea di cosa sto parlando vi invito a leggere questo utilissimo articolo "Death to Field Arrays!" scritto da Derek di Mediacurrent.
...e per chi si chiedesse "a cosa serve scrivere codice pulito?" rispondo con una frase presa dal libro "Structure and Interpretation of Computer Programs" di Abelson e Sussman che tradotta recita più o meno così
"I programmi sono destinati ad essere letti dagli umani e solo incidentalmente eseguiti dai computer."