web-dev-qa-db-fra.com

Comment obtenir une liste de toutes les valeurs sélectionnées pour un champ par programme?

Comment obtenir une liste de toutes les valeurs sélectionnées pour un champ?

Par exemple, j'ai un champ appelé country et je souhaite que tous les pays soient sélectionnés pour un certain noeud.

J'ai besoin de cette liste, car je veux que la région soit automatiquement sélectionnée dans un autre champ (régions), selon le pays choisi.

Ex: je choisis la France dans les pays, puis automatiquement la région européenne est sélectionnée dans les régions

Pour l'instant je ne peux copier les valeurs sélectionnées que dans le champ "pays", dans le champ "régions", en procédant comme suit:

$node->field_regions = $node->field_countries;

Voici le résultat lorsque je sélectionne la France dans le champ pays:

Country: France

Regions: France

Edit: J'ai essayé avec la fonction: field_get_items (), mais tout ce que j'obtiens est un tableau:

$items = field_get_items('node', $node, 'field_countries', $node->language);

Quelque chose ne va pas? J'ai aussi essayé avec ça mais j'obtiens le même résultat ...

$items = $node->field_countries[$node->language][0]
7
118218

Étant donné que les champs peuvent avoir plusieurs valeurs, les deux méthodes que vous décrivez renvoient un tableau. Chacun de ces éléments du tableau sera lui-même un tableau de toutes les colonnes possibles du champ. Dans le cas des champs de texte, la seule colonne dont vous devez vraiment vous soucier est la colonne value.

En supposant que votre champ particulier n'accepte pas plusieurs valeurs, ou il le fait et que vous ne souhaitez que la première valeur, les éléments suivants devraient fonctionner:

$items = field_get_items('node', $node, 'field_countries', $node->language);
$item = array_shift($items);
$value = $item['value'];

ou

$value = $node->field_countries[$node->language][0]['value'];
7
Clive

field_get_items() est la solution généralement recommandée. Cependant, il y a quelques mises en garde.

Il est important de vérifier si le champ est vide. Dans ce cas, field_get_items () renvoie false (ce qui est nul).

$items = field_get_items('node', $node, 'field_countries', $node->language);
if (!empty($items)) {
  $item = reset($items);
  return $item['value'];
}
else {
  return NULL;
}

Je pense que vous pouvez généralement être sûr que si un élément existe, il sera dans l'index zéro [0]. Et isset () est une chose très robuste. Donc, ce qui suit fonctionne également:

$items = field_get_items('node', $node, 'field_countries', $node->language);
return isset($items[0]['value']) ? $items[0]['value'] : NULL;

Pour certains types de champs, la valeur n'est pas dans $ item ['value'] mais dans $ item ['tid'] ou autre chose.
Dans le cas habituel (je ne peux pas penser à un atm d'exception), la valeur sera la première chose dans le tableau $ item. Donc, ce qui suit fonctionnera également, mais c'est plus par hasard que par conception. Donc, personnellement, je ne compterais pas là-dessus.
(Si $ items est un tableau (non vide), alors nous pouvons sans risque (*) supposer que chaque $ item sera aussi un tableau, et pas autre chose.)

$items = field_get_items('node', $node, 'field_countries', $node->language);
return isset($items[0]) ? reset($items[0]) : NULL;

La valeur de retour de field_get_items () est une valeur par défaut, il est donc généralement correct de modifier le tableau $ items. Cela signifie que vous pouvez utiliser array_shift ().

$items = field_get_items('node', $node, 'field_countries', $node->language);
return !empty($items) ? array_shift(array_shift($items)) : NULL;

(*) La plupart des hypothèses que nous faisons ici ne sont pas basées sur des garanties au niveau de la langue, mais uniquement sur le fonctionnement de Drupal généralement).

Btw l'astuce suivante peut parfois être utile, mais ce n'est pas une solution complète de la question d'origine:

$items = field_get_items(..) ?: array();

Cela garantit que $ items est toujours un tableau. Mais pour les extraits ci-dessus, cela ne nous aide pas vraiment.

6
donquixote