Wie lade ich eine Feldsammlung von einem Knoten?

72

Ich habe einen Knoten, auf dem sich einige Feldsammlungen befinden.

Wenn ich mir die node_load()Ausgabe anschaue , sehe ich:

[field_rich_text_group] => Array
        (
            [und] => Array
                (
                    [0] => Array
                        (
                            [value] => 6
                        )

                    [1] => Array
                        (
                            [value] => 7
                        )

                    [2] => Array
                        (
                            [value] => 8
                        )

                )

        )

Welche API-Funktion kann ich verwenden, um die in der Auflistung enthaltenen Felddaten mit einer Entity-ID von 6, 7, 8 usw. tatsächlich zu laden?

Justin
quelle

Antworten:

88

Doh! Ich hätte in das Feldsammelmodul schauen sollen:

entity_load('field_collection_item', array($item_id))
Justin
quelle
1
Ich suche nach einer ähnlichen Lösung. Wie schreibt man die Ausgabe und platziert sie in einem gerenderten Array? Danke
Swan
Ich habe eine Reihe von benutzerdefinierten Funktionen geschrieben, um das Layout für diese Elemente zu erstellen. Leider geben sie HTML zurück, keine darstellbaren Arrays. Es wäre schön, renderbare Arrays zu verwenden, aber ich bin mir nicht ganz sicher (ich bin mir sicher, dass es einen guten Grund dafür gibt, ich habe nur keine Erklärung gefunden, die mitschwingt).
Justin
Vielen Dank. Feldkollektion ist in der Tat nützlich, um Formulare und Ausgaben zu vereinfachen, aber wenn es um benutzerdefinierte Abfragen geht, muss ich anscheinend in die verschachtelten Arrays eintauchen, selbst mit entity_metadata_wrapper.
Schwan
Oh yah, ich habe Wrapper geschrieben, die die dichten Arrays in das verwandeln, was ich brauche.
Justin
entity_load () gibt eine Menge von Knoten zurück, die spezifisch für "entity" sind, und zusammen mit diesen erhalten wir auch die benutzerdefinierten Felder. Wie unterscheiden wir die Benutzerfelder von den Feldern einer Entität? Irgendwelche Hinweise?
Raj Pawan Gumdal
38

Es gibt auch eine Wrapper-Funktion, die denselben Trick ausführt:

field_collection_item_load($id, $reset = FALSE)

oder laut Kommentar verwenden:

field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE)

um mehrere Sammlungen zu laden (z. B. wenn Sie eine Schaltfläche Weitere hinzufügen haben).

Vasiliy Grotov
quelle
5
Gemäß der obigen Antwort von @ vasiliy-grotov können Sie auch verwenden field_collection_item_load_multiple($ids = array(), $conditions = array(), $reset = FALSE), um mehrere Sammlungen zu laden (zum Beispiel, wenn Sie ein "Add more" -Btn haben).
Mediaashley
21

field_collection_field_get_entity () sollte verwendet werden, um die korrekte Revision zu laden.

Anwendungsbeispiel:

$node = node_load(1);
$items = field_get_items('node', $node, 'field_fc');
foreach ($items as $item) {
 $fc = field_collection_field_get_entity($item);
 // Do something.
}
jonhattan
quelle
1
Wie werden die Datumsfelder in der Feldsammlung zugewiesen? Ich habe folgendes benutzt: $ item = field_collection_field_get_entity ($ itemid); print $ item-> field_course_starts_on ['und'] [0] ['safe_value']; Es werden jedoch keine Werte gedruckt.
Harikris
Danke dafür. Ich wurde konstant Warnung: array_flip (): Kann nur STRING- und INTEGER-Werte spiegeln! mit ... item_load () und dies löste das Problem.
Naidim
11

Sie können entity_metadata_wrapperaus dem Entity-API- Modul Folgendes verwenden :

$node_wrapper = entity_metadata_wrapper('node', $node);
$field_collection = $node_wrapper->field_rich_text_group[0]->value();
dpm($field_collection);

Sie können auch alle Sammlungen durchlaufen:

$node_wrapper = entity_metadata_wrapper('node', $node);
foreach ($node_wrapper->field_rich_text_group as $field_collection_wrapper) {
  $field_collection = $field_collection_wrapper->value();
  dpm($field_collection);
}
milkovsky
quelle