web-dev-qa-db-fra.com

Quelle est la meilleure pratique lorsque vous travaillez avec la langue [und]?

Je commence à utiliser ce formulaire pour accéder aux données de mon module. (Voir commentaire # 1 .)

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

Je pensais que cela ressemblait à une assez bonne solution, mais plus loin, j'ai trouvé la même question this :

Ne présumez pas que "und" est pour les champs d'entités sans langue, c'est aussi pour les champs qui ne sont pas traduisibles, et sans le module de traduction d'entité qui est tous les champs. De plus, il existe des différences entre les différentes versions 7.x de Drupal.
Mieux vaut utiliser la fonction field_get_items() qui triera pour vous sous quel code de langue les données sont stockées.

Et maintenant, je ne sais pas si ce que j'utilise pourrait casser quelque chose sur la route.

51
Merrick

Je trouve que l'utilisation du module Entity API est d'une grande aide et rend également le code plus lisible. Le code ci-dessus ne fonctionnera pas toujours, car la langue du nœud et la langue du champ peuvent être différentes.

Avec le module API d'entité et son wrapper, vous pouvez utiliser le code suivant:

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

Cela devrait être à l'épreuve des balles. Une chose à propos de l'utilisation du module d'entité est que si vous essayez d'accéder à un champ qui n'existe pas, vous obtiendrez une erreur désagréable et une exception levée au lieu d'un avis et d'un comportement incorrect.

Pour éviter cela, vous pouvez essayer/attraper comme ça

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

Ou vous pouvez utiliser isset() que EntityMetadataWrapper gère en interne:

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

Pour la lecture, vous devriez toujours pouvoir utiliser field_get_items () , qui choisira la langue qui vous convient et vérifiera également si le champ a des valeurs.

Malheureusement, l'API de champ est très limitée dans 7.x, il n'y a aucun moyen d'obtenir par exemple le premier élément de champ, n'osez même pas demander à obtenir la valeur avec un seul appel de fonction ... Et il n'y a pas d'homologue field_set_items ().

Alors oui, le module API d'entité fournit une API plus agréable avec l'inconvénient qu'il est également livré avec un peu de surcharge (il convertit fondamentalement chaque valeur unique en objets wrapper qui ont des tonnes de tableaux d'informations de propriété imbriqués qui leur sont attachés). Essayer de vider un wrapper d'entité ne vous donnera généralement rien ou un mur de tableaux illisibles.

19
Berdir