Extrahieren eines bestimmten Datenteils eines Feldsammlungselements

7

Ich habe jetzt fast ein paar Tage damit herumgespielt, ohne Glück. Hier sind meine Sammlungsdaten:

Sammlungsname: field_video_collection

Innerhalb der Sammlung gibt es ein Feld mit dem Namen: field_video_file_col

Meine Felder werden in meiner benutzerdefinierten field-collection-item--field_video_collection.tpl.phpVorlage einwandfrei gedruckt. Ich habe die Dokumentation gemäß diesem Problem befolgt , um meinen Vorlagennamen zu erhalten, und ich drucke die Felder einfach als <?php print render($content['field_video_file_col']); ?>etc ... in dieser Vorlage.

Nun zum lustigen Teil möchte ich das fidfür jedes field_video_file_colElement in der Sammlung in einem bestimmten Knoten extrahieren und als gedruckte Variable rendern. Ich habe die Antwort in dieser Frage hier auf Stack befolgt, aber es scheint für mich nicht zu funktionieren. wenn ich mache:

print '<pre>';
var_dump(get_defined_vars());
print '</pre>';

Ich sehe, dass ich dies als Teil der Daten habe, die mir zur Verfügung stehen field_video_file_col

["field_video_file_col"]=>
          array(1) {
            ["und"]=>
            array(1) {
              [0]=>
              array(12) {
                ["fid"]=>
                string(3) "888"

Es scheint mir also, dass die FID in diesem Fall 888 ist und ich möchte das in meiner Vorlage rendern. Meine Knotenvorverarbeitungsfunktion ist als solche:

function MYTHEME_preprocess_node(&$vars, $hook) {

    $entity_type = 'field_collection_item';
    $bundle_name = 'field_field_video_collection'; // Field name the collection is attached to
    $field_name = 'field_video_file_col'; // Field name within the field collection
    $video_file_fid = field_info_instance($entity_type, $field_name, $bundle_name);
    if ($video_file_fid) {
      $my_fid = $video_file_fid['fid'];
    }
}

Das Endergebnis ist, dass ich die Variable in meinem Feldfeldsammlungselement - field_video_collection.tpl.php- Vorlage wie folgt rendern muss :

<?php print $video_file_fid; ?>

... aber das scheint nicht zu funktionieren. Ich habe überall gesucht und viele verschiedene Inkarnationen dieses Codes und dieser Kombinationen ausprobiert, aber immer noch keine Freude.

Danny Englander
quelle
Sie haben MYTHEME in Ihren Themennamen geändert, oder? :)
Lance
@Lance - ja ich habe es geändert.
Danny Englander

Antworten:

8

Ich verwende die Entitäts-API, wenn ich mit Feldsammlungselementen arbeite. Siehe: Programmgesteuertes Erstellen und Aktualisieren der Feldsammlung mit der Entitäts-API

Die Arbeit mit Feldsammlungen kann Folgendes bewirken:

// Wrap node with Entity API
$node_wrapper = entity_metadata_wrapper('node', $node);
// Get the first item from the muli-value field collection
$raw_collection = $node_wrapper->field_video_collection[0]->value();
// Wrap it with Entity API
$collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
//dsm the old value
debug($collection->field_video_file_col->value());

Wenn Sie Ihre field_collection-ID bereits kennen, können Sie einfach Folgendes tun:

$collection = entity_metadata_wrapper('field_collection_item', $fid);
//dsm the old value
debug($collection->field_video_file_col->value());

AKTUALISIEREN:

Verwenden Sie den obigen Code in MYTHEME_preprocess_node

UPDATE 2:

In Ihrem Fall wird es also sein:

function MYTHEME_preprocess_node(&$vars, $hook) {
  if (empty($vars['nid'])) {
    return;
  }
  // Wrap node with Entity API
  $node_wrapper = entity_metadata_wrapper('node', $vars['nid']);
  // Get the first item from the muli-value field collection
  $raw_collection = $node_wrapper->field_video_collection[0]->value();
  // Wrap field collection with Entity API
  $collection = entity_metadata_wrapper('field_collection_item', $raw_collection);
  // print value
  $fid = $collection->field_video_file_col->value();
  debug($fid);
}

Eine Antwort finden Sie auch unter Grundlegendes zu Feldsammlungswerten

melkowski
quelle
Ich folge Ihrem obigen Code etwas, aber ich sehe nicht, wie dies eine Variable in meiner benutzerdefinierten Feldsammlungsvorlage erstellt und rendert, sodass ich nicht sicher bin, ob diese Antwort für mich von praktischem Nutzen ist.
Danny Englander
1
Sie würden seinen Code in Ihre MYTHEME_preprocess_nodeFunktion einfügen und Ihre Variable in einen $variablesWert setzen, den Ihr Beispielcode nicht tut. Er zeigt Ihnen, wie Sie field_collectionvon ihrem Knoten aus einen Verweis auf die Entität selbst erhalten und dann das betreffende Feld aus der Sammlung entfernen. Sie übernehmen Ihre Vorverarbeitungsfunktion und fügen seinen Code ein. Sie können also die folgende Variable in Ihre Vorverarbeitungsfunktion schreiben. $vars['video_file_fid'] = $collection->field_video_file_col->value();
Tenken
@tenken danke. Danny folgt dem Kommentar des Tenkens. Verwenden Sie einfach entity_metadata_wrapper in MYTHEME_preprocess_node
milchovsky
Ich habe die Beiträge gelesen, die Sie auch verlinkt haben, bevor ich diese Frage tatsächlich gestellt habe, und konnte nicht wirklich Köpfe oder Geschichten daraus machen. Wenn ich den Code von oben verwende, erhalte ich WSODs. Außerdem wird die Meldung angezeigt, dass die Variable node_wrappernirgendwo verwendet wird.
Danny Englander
Siehe Beispiel in meinem UPDATE 2. Bitte überprüfen Sie die Feldnamen ("field_video_collection" und "field_video_file_col"). PS Sie haben Recht, es sollte $ node_wrapper anstelle von $ node geben.
Milkovsky
-1

Sie können diesen versuchen. Die erste Zeile erhält das Objekt, die zweite Zeile die FID.

$field_video_col=current(current($vars["field_video_file_col"]));
$video_file_fid=$field_video_col['fid'];
Mauro Sardu
quelle
currentNimmt das Argument als Referenz, daher müssen Sie diese in separate Variablen einfügen.
Das hat nicht funktioniert. Ich bekomme eine Nachricht:Unused local variable 'video_file_fid'. The value of the variable is not used anywhere.A variable is considered unused in the following cases: * The value of the variable is not used anywhere or is overwritten immediately. * The reference stored in the variable is not used anywhere or is overwritten immediately
Danny Englander
Lassen Sie uns so umgestalten, dann $ tmp = current ($ vars ["field_video_file_col"]); $ field_video_col = current ($ tmp); $ video_file_fid = $ field_video_col ['fid]; echo ($ video_file_fid);
Mauro Sardu
Der neue Code oben hat auch nicht funktioniert. Es sollte auch einen Syntaxfehler geben ['fid], ['fid']aber das ist nebensächlich.
Danny Englander
-1

Der Code von dropbucket kann hilfreich sein, um alle Daten der Feldsammlung in einem Array abzurufen und vorzubereiten:

$fieldname = 'field_lorem_slides';

// Get the items
$slides = array();
foreach($vars[$fieldname] as $delta => $item_id){
    $data = field_collection_item_load($item_id['value']);
    if ($data)){
                $l = isset($data->language) ? $data->language : LANGUAGE_NONE;
        $slides[$delta] = array();

                // Get the field collection's data prepared in an array
                // Alternatively, you could do $slides[$delta] = $data; in order to get the full objects in the array 
        $slides[$delta]['lorem_image'] = '<img src="'.file_create_url($data->field_image[$l][0]['uri']).'">';
        $slides[$delta]['lorem_data'] = isset($data->field_heading[$l]) ? $data->field_heading[$l][0]['safe_value'] : null;
    }
}

// Send the information to the template file
// $vars['slides'] = $slides;
Alfred Armstrong
quelle
Ist dies eine Vorlagenvorverarbeitungsfunktion? Wenn ja, handelt es sich um eine Vorverarbeitungsseite oder eine Knotenfunktion? Ich sehe keinen Kontext, daher denke ich, dass es nicht allzu nützlich ist, einfach auf ein Code-Snippet ohne Erklärung zu verlinken.
Danny Englander
Ja, es ist für die Verwendung in Vorverarbeitungsfunktionen vorgesehen. Übrigens, als das Team, mit dem ich zusammenarbeite, mit Feldsammlungen zu kämpfen hatte, war es am produktivsten, das Entwicklungsmodul zu installieren und dsm () zu verwenden, um die Variablen in Vorlagen und Vorverarbeitungsfunktionen zu untersuchen. Feldsammlungen sind ein Thema, zum Teil, weil (meiner Ansicht nach fälschlicherweise) ihre Feldvorverarbeitungsfunktion sowohl für das Feldsammlungsfeld als auch für einzelne darin enthaltene Elemente aufgerufen wird.
Alfred Armstrong
So ist es eine _preprocess_node, _preprocess_pageFunktion oder andere?
Danny Englander
Das wäre ein preprocess_node.
Alfred Armstrong
Ich habe diese vielen verschiedenen Arten müde gemacht, konnte es aber im Kontext meiner Arbeit nicht zum Laufen bringen. Es scheint einfach nicht Äpfel für Äpfel zu sein.
Danny Englander