Wie erhalte ich programmgesteuert eine Liste aller ausgewählten Werte für ein Feld?

7

Wie kann ich eine Liste aller ausgewählten Werte für ein Feld erhalten?

Zum Beispiel habe ich ein Feld namens Länder und möchte, dass alle Länder für einen bestimmten Knoten ausgewählt werden.

Ich benötige diese Liste, da die Region je nach ausgewähltem Land automatisch in einem anderen Feld (Regionen) ausgewählt werden soll.

Beispiel: Ich wähle Frankreich in den Ländern, dann wird automatisch die europäische Region in Regionen ausgewählt

Im Moment kann ich nur die ausgewählten Werte im Feld "Länder", im Feld "Regionen" auf folgende Weise kopieren:

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

Hier ist das Ergebnis, wenn ich Frankreich im Feld Länder auswähle:

Country: France

Regions: France

Bearbeiten : Ich habe es mit der Funktion versucht: field_get_items (), aber alles was ich bekomme ist ein Array:

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

Irgendwas stimmt nicht? Ich habe es auch versucht, aber ich bekomme das gleiche Ergebnis ...

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

Antworten:

7

Da Felder mehrere Werte haben können, geben beide von Ihnen beschriebenen Methoden ein Array zurück. Jedes dieser Array-Elemente ist selbst ein Array aller möglichen Spalten für das Feld. Bei Textfeldern ist die einzige Spalte, über die Sie sich wirklich Sorgen machen müssen, die valueSpalte.

Angenommen, Ihr bestimmtes Feld akzeptiert nicht mehrere Werte oder Sie möchten nur den ersten Wert, dann sollte Folgendes funktionieren:

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

oder

$value = $node->field_countries[$node->language][0]['value'];
Clive
quelle
Danke, das ist genau das, was ich brauche. Nur noch eine Sache. Mein Länderfeld akzeptiert mehrere Werte. Wie bekomme ich alle Werte? Ich weiß, dass ich PHP
118218
1
Normalerweise durchlaufen Sie sie mit einem foreach, wie:foreach ($node->field_countries[$node->language] as $item) { $val = $item['value']; // Do something with $val }
Clive
Es ist wichtig, immer zu überprüfen, ob das Array von Elementen leer ist oder ob es überhaupt ein Array ist! Ich werde eine neue Antwort schreiben, weil es zu viel Änderung für eine Bearbeitung ist.
Donquijote
6

field_get_items()ist die Lösung, die normalerweise empfohlen wird. Es gibt jedoch einige Einschränkungen.

Es ist wichtig zu überprüfen, ob das Feld leer ist. In diesem Fall gibt field_get_items () false zurück (was scheiße ist).

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

Ich denke, Sie können im Allgemeinen sicher sein, dass ein Element, wenn es existiert, im Index Null [0] liegt. Und isset () ist eine sehr robuste Sache. Also funktioniert auch folgendes:

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

Bei einigen Feldtypen befindet sich der Wert nicht in $ item ['value'], sondern in $ item ['tid'] oder etwas anderem.
Im Normalfall (ich kann mir keine Ausnahme atm vorstellen) ist der Wert das erste im Array $ item. Das Folgende wird also auch funktionieren, aber dies ist eher zufällig als beabsichtigt. Ich persönlich würde mich also nicht darauf verlassen.
(Wenn $ items ein (nicht leeres) Array ist, können wir sicher (*) davon ausgehen, dass jedes $ item auch ein Array ist und nicht etwas anderes.)

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

Der Rückgabewert von field_get_items () ist by-value, daher ist es im Allgemeinen in Ordnung, das Array $ items zu ändern. Dies bedeutet, dass Sie array_shift () verwenden können.

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

(*) Die meisten Annahmen, die wir hier treffen, basieren nicht auf Garantien auf Sprachebene, sondern nur darauf, wie Drupal im Allgemeinen funktioniert.

Übrigens kann der folgende Trick manchmal hilfreich sein, aber er ist keine vollständige Lösung der ursprünglichen Frage:

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

Dies garantiert, dass $ items immer ein Array ist. Aber für Schnipsel darüber hilft uns das nicht wirklich.

Donquijote
quelle