Rendern Sie ein Feld, das in einem anderen Feld enthalten ist

7

Ich verwende das Drupal-Absatzmodul , mit dem Sie "Bündel" von Feldern in anderen Feldern erstellen können. (Dies geschieht mit Entitäten). Jedes Bundle hat eine eigene tpl.php-Datei.

Darüber hinaus können Sie "Unterbündel" in den "Hauptbündeln" für komplexe Layouts verschachteln.

Ich habe ein "Haupt-Bundle" namens erstellt field_panels_content.

Darin befindet sich ein weiteres "Subbundle", das a enthält field_body_text. Das "Hauptbündel" kann eine unbegrenzte Anzahl von "Unterbündeln" enthalten.

In meinem Thema muss ich auf alle field_body_textFelder aus dem mehrfachen "Unterbündel" aus der Datei tpl.php zugreifen, die für das "Hauptbündel" vorgesehen ist.

Ich habe devel_themer verwendet und festgestellt, dass ich field_body_textwie folgt zu den Feldern gelangen kann :

<?php print render($content['field_panels_content'][0]['entity']['paragraphs_item'][9]['field_body_text']); ?>
<?php print render($content['field_panels_content'][2]['entity']['paragraphs_item'][10]['field_body_text']); ?>
<?php print render($content['field_panels_content'][2]['entity']['paragraphs_item'][12]['field_body_text']); ?>

Wie Sie sehen, ist dies kein effizientes Theming, da ich den zweiten Array-Wert kennen müsste, um ihn auszudrucken (z. B. [9] [10] [12]).

Kann ich eine Schleife oder eine andere PHP-Funktion verwenden, um automatisch zum zweiten Array-Wert zu gelangen, ohne es zu wissen?

Dieser zweite Array-Wert ändert sich mit jedem neuen Inhalt (z. B. wenn ich ein neues Subbundle hinzufüge, hat es den Wert [13]. Der Grund, warum die Zahlen von [10] nach [12] springen, ist, dass ich das Subbundle gelöscht habe, das war [11].



Aktualisieren

Hier sind einige weitere Schritte, die ich versucht habe (von dieser Seite ):

Hier ist eine Beispielschleife:

<?php
foreach ( $content['field_panels_content'] as $wrapper) {
  foreach ( $wrapper['entity']['paragraphs_item'] as $item ) {
    if ( !empty($item['field_body_text']) ) {
      print render($item['field_body_text']);
    }
  }
}
?>

Es werden die folgenden Ergebnisse angezeigt: Objekt vom Typ ParagraphsItemEntity kann nicht als Array in foreach verwendet werden ($ wrapper ['entity'] ['agraphs_item '] als $ item) {

Hier ist eine überarbeitete Version:

<?php
foreach ( $content['field_panels_content'] as $wrapper) {
  foreach ( $wrapper['entity'].paragraphs_item as $item ) {
    if ( !empty($item.field_body_text) ) {
      print render($item.field_body_text);
    }
  }
}
?>

Fehlermeldung: Fatal error: Cannot use object of type ParagraphsItemEntity as array in line "foreach ( $wrapper['entity'].paragraphs_item as $item ) {"

Wenn Sie den Code so bearbeiten, dass nur field_body_text in eckigen Klammern steht (z. B. $item['field_body_text']), wird folgende Fehlermeldung ausgegeben : Fatal error: Cannot use object of type ParagraphsItemEntity as array

Wenn Sie den Code so bearbeiten, dass nuragraphs_item in eckigen Klammern steht (z. B. $wrapper['entity']['paragraphs_item']), wird folgende Fehlermeldung ausgegeben: Fatal error: Only variables can be passed by reference in line print render($item.field_body_text);

Wenn ich print anstelle von render verwende, wird folgende Fehlermeldung angezeigt: Fatal error: Cannot use object of type ParagraphsItemEntity as array



Weitere Hinweise

Der folgende Code funktioniert perfekt:

<?php print render($content['field_panels_content'][0]['entity']['paragraphs_item'][9]['field_body_text']); ?>
<?php print render($content['field_panels_content'][1]['entity']['paragraphs_item'][10]['field_body_text']); ?>

Es sollte also sicher ein einfacher Fall sein, den Code in eine Schleife umzugestalten, um das gewünschte Ergebnis zu erzielen.


bitte beachten Sie

Ich möchte keine anderen Module verwenden.

Ich werde den gesamten field_body_text separat oben in der tpl-Datei ausdrucken. Ich werde dann den gesamten Absatz (mit dem field_body_textStandbild darin) auf normale Weise anzeigen .

big_smile
quelle

Antworten:

4

Ich denke, das Problem hier ist, dass jede dieser Absatzgruppierungen verschiedene Elemente enthält, die Array-Schlüssel sind. Wenn Sie beispielsweise bis zu $ ​​content ['field_paragraph'] dpm verwenden, werden möglicherweise folgende Werte angezeigt:

Geben Sie hier die Bildbeschreibung ein

Ich denke, das Problem ist, dass Sie aufgrund Ihrer Schleifen versuchen, Dinge zu rendern, die keine Objekte sind. Um dies zu umgehen, sollten Sie versuchen, einzuchecken, ob der Schlüssel numerisch ist, bevor Sie fortfahren.

Etwas in dieser Richtung:

<?php
    foreach($content['field_paragraph'] as $key=>$array){
  if (is_int($key)) {
    foreach ( $array['entity']['paragraphs_item'] as $key2=>$item ) {
    if ( is_int($key2) ) {
      print render($item['field_body']);
    }
  }
  }
}

?>

Beachten Sie das is_int ($ key), das ist es, was Sie brauchen, um die Fehler zu beseitigen. Beachten Sie, dass mein Code meine eigenen Feldnamen enthält, sodass Sie nur Ihren eingeben müssen.

Jance
quelle
Ich habe eine Antwort gestartet und diese dann erneut gelesen. Das ist genau richtig.
Darvanen
2

Anstatt Vorlagen zu überschreiben und zu erstellen, verwalten Sie die gesamte Anzeige der Entität über die Benutzeroberfläche und erstellen Sie Feldformatierer für Feldtypen, wenn der Kern Ihre Anzeigeanforderungen nicht abdeckt.

Dies ist eine viel übersichtlichere Methode zum Definieren von Anzeigen. Vorlagen werden schnell unübersichtlich, insbesondere beim Eintauchen in Referenzen.

Sam152
quelle
In meinem Fall muss ich eine Liste aller im "Hauptpaket" gespeicherten Titel ausgeben. Ich kann wissen, dass ich eine Ansicht einbetten kann, um dies zu tun, aber ich möchte nur eine Liste mit Titeln haben, da dies die Arbeit vereinfachen würde. Außerdem muss ich den Titel auf verschiedene Arten auf einer einzelnen Seite ausgeben, damit eine Vorlage sauberer ist als viele verschiedene Formatierer (und auf der Benutzeroberfläche können Sie nur einen Formatierer pro Anzeige verwenden)
big_smile