Quali sono le migliori pratiche quando si lavora con la lingua [und]?


51

Sto iniziando a utilizzare questo modulo per accedere ai dati nel mio modulo. (Vedi commento n . 1 ).

$node->field_test[$node->language][0]['value']

Ho pensato che sembrava una soluzione abbastanza buona, ma più in basso quella stessa domanda ho trovato questo :

Non dare per scontato che "und" sia per i campi di entità senza lingua, ma anche per i campi che non sono traducibili e senza il modulo di traduzione delle entità che è tutti i campi. Inoltre, ci sono differenze tra le varie versioni 7.x di Drupal.
Meglio usare la field_get_items()funzione che risolverà per te in quale codice lingua i dati sono memorizzati.

E ora non so se ciò che sto usando potrebbe interrompere qualcosa lungo la strada.

Risposte:


39

Trovo che l'utilizzo del modulo API Entity sia di grande aiuto e renda anche il codice più leggibile. Il codice sopra non funzionerà sempre, poiché la lingua del nodo e la lingua del campo possono essere diverse.

Con il modulo API entità e il relativo wrapper, è possibile utilizzare il seguente codice:

 $node_wrapper = entity_metadata_wrapper('node', $node);
 $field_val = $node_wrapper->field_test->value();

Questo dovrebbe essere a prova di proiettile. Una cosa sull'uso del modulo entità è che se si tenta di accedere a un campo che non esiste, si otterrà un brutto errore e verrà generata un'eccezione invece di un avviso e un comportamento errato.

Per evitarlo, potresti provare / catturare in questo modo

try {
  $field_val = $node_wrapper->field_doesnt_exist->value();
} catch (EntityMetadataWrapperException $e) {
  $field_val = 'default/fallback value';
}

Oppure si può usare isset()che EntityMetadataWrappergestisce internamente:

$field_val = 'default/fallback value';
if (isset($node_wrapper->field_doesnt_exist)) {
  $field_val = $node_wrapper->field_doesnt_exist->value();
}

Questa funzione è entity_metadata_wrapper()stata deprecata? Ho provato a chiamarlo nel mio modulo e ho ottenuto Fatal error: Call to undefined function entity_metadata_wrapper(): ho anche fatto una ricerca sorgente sull'installazione di Drupal 7.12 in Dreamweaver e ho trovato 0 risultati in qualsiasi altra parte del codice!
Aditya MP,

1
aditya - questo è nel modulo API Entity - non nel core.
lazysoundsystem

1
@adityamenon Come pigro dice che questo non è nel core ... eppure, probabilmente lo sarà per Drupal 8. Le API delle entità almeno miglioreranno notevolmente. Non è stato davvero il momento di creare tutte le API necessarie per il sistema di entità per Drupal 7, quindi questo è ciò che il modulo API dell'entità cerca di raggiungere.
googletorp

Grazie ragazzi, sono stato stupido a non leggere correttamente la risposta e seguire il link alla pagina del progetto Entity API :)
Aditya MP

1
Quando guardo il codice sorgente per entity_metadata_wrapper e seguo la traccia del coniglio attraverso tutte le classi che sono istanziate ed estese per darmi una manipolazione del campo più semplice, mi chiedo se ne valga la pena. Aggiungendo altre 3k + righe di codice al mio bootstrap e occupando più memoria per gestire tutte le assegnazioni di variabili ... c'è qualcosa di più leggero? Sembra proprio che $node->field_name[LANGUAGE_NONE][0]['value'] = 'foo';sia davvero il modo più efficiente.
Charlie Schliesser,

19

Per la lettura, dovresti sempre essere in grado di utilizzare field_get_items () , che sceglierà la lingua corretta per te e controllerà anche se il campo ha valori.

Sfortunatamente, l'API di campo è molto limitata in 7.x, non c'è modo di ottenere ad esempio il primo elemento di campo, non osare nemmeno chiedere di ottenere il valore con una singola chiamata di funzione ... E non c'è field_set_items ( ) controparte.

Quindi sì, modulo entità API non fornire un'API migliore con l'inconveniente che viene anche con un po 'di overhead (Converte praticamente ogni singolo valore di oggetti wrapper che hanno tonnellate di informazioni della struttura nidificata array ad essi). Cercare di scaricare un wrapper di entità di solito non porta a nulla o a un muro di array illeggibili.


1
Ho l'impressione da quello che stai dicendo che questo genere di cose potrebbe essere migliorato in Drupal 8? In tal caso, come si fa a scoprire come stanno andando queste cose? A parte le pagine del modulo, Do è come un labirinto per me! :)
Clive

1
Bene, c'è sempre speranza :) Ed è difficile mantenere anche una panoramica di alto livello di ciò che sta accadendo in Drupal 8, un modo è seguire le iniziative. Tuttavia, questo non è un obiettivo diretto delle direttive esistenti. Parti del modulo API entità vengono spostate / spostate nel core (ora esiste la classe Entity e le entità esistenti vengono convertite nel nuovo sistema). Quindi c'è la possibilità che ad esempio otterremo metodi direttamente su quelle classi per gestire i campi. Per le modifiche eseguite, una buona risorsa è il nuovo sistema di registrazione delle modifiche, consultare drupal.org/list-changes/drupal .
Berdir,

Fantastico, è esattamente il genere di cosa che stavo cercando, grazie mille! :) Spero non ti dispiaccia che io ti chieda So che non è davvero in tema per il sito ... Mi piacerebbe essere coinvolto nel contribuire al core ma non essendo mai stato veramente coinvolto nell'open-source, trovo tutto un po 'scoraggiante ... è bello avere un buon punto di partenza :)
Clive

Clive: Dai un'occhiata a drupalofficehours.org : è proprio per aiutare le persone a iniziare a contribuire. Più risorse lì. Consiglierei anche di andare a una riunione di un gruppo di utenti che gli sviluppatori core frequentano o più probabilmente un DrupalCamp dove si troveranno uno o due sviluppatori core. Trova il tuo gruppo locale su groups.drupal.org e dovresti riuscire a risolverlo. drupical.org può anche essere utile.
wizonesolutions,

-2
$node = node_load($lot_id);
$field_language = field_language('node', $node, 'field_name');
$node->field_name[$field_language][0]['value'] = $custom_value;

Puoi aggiungere una breve spiegazione del perché questo risponde alla domanda?
Free Radical
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.