別のフィールド内に含まれるフィールドをレンダリングする


7

私が使用していますDrupalの段落のあなたが他のフィールド内のフィールドの「バンドル」を作成することができますモジュールを。(これはエンティティを使用して行われます)。各バンドルには、独自のtpl.phpファイルがあります。

さらに、複雑なレイアウトの場合、「メインバンドル」内に「サブバンドル」をネストすることができます。

というメインバンドルを作成しましたfield_panels_content

内部には、を保持する別の「サブバンドル」がありますfield_body_text。「メインバンドル」は、無制限の「サブバンドル」を保持できます。

私のテーマでfield_body_textは、「main-bundle」用のtpl.phpファイルから複数の「subbundle」のすべてのフィールドにアクセスする必要があります。

devel_themerを使用して、次のfield_body_textようなフィールドにアクセスできることがわかりました。

<?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']); ?>

ご覧のとおり、これを印刷するには2番目の配列の値を知る必要があるため(たとえば[9] [10] [12])、効率的なテーマ設定にはなりません。

ループや他のPHP関数を使用して、知らないうちに2番目の配列値に自動的にアクセスできる場所はありますか?

この2番目の配列の値は、コンテンツの新しい部分ごとに変化します(たとえば、新しいサブバンドルを追加すると、値は[13]になります。数値が[10]から[12]にジャンプするのは、以前のサブバンドルを削除したためです[11]。



更新

これが私が試したいくつかのステップです(このページから):

次にループの例を示します。

<?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']);
    }
  }
}
?>

次の結果が生成されます:タイプParagraphsItemEntityのオブジェクトをforeachの配列として使用できません($ wrapper ['entity'] ['paragraphs_item'] as $ item){

これは修正されたバージョンです:

<?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);
    }
  }
}
?>

エラーメッセージ: Fatal error: Cannot use object of type ParagraphsItemEntity as array in line "foreach ( $wrapper['entity'].paragraphs_item as $item ) {"

field_body_textのみが角かっこ内にあるようにコードを編集すると(例:)$item['field_body_text']、次のエラーメッセージが生成されます。 Fatal error: Cannot use object of type ParagraphsItemEntity as array

コードを編集して、paragraphs_itemのみが角かっこ内にあるように(例:)$wrapper['entity']['paragraphs_item']、次のエラーメッセージを生成します。 Fatal error: Only variables can be passed by reference in line print render($item.field_body_text);

レンダリングではなく印刷を使用すると、次のエラーメッセージが表示されます。 Fatal error: Cannot use object of type ParagraphsItemEntity as array



その他の注意事項

次のコードは完全に機能します。

<?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']); ?>

そのため、コードをループにリファクタリングして目的の結果を得るのは簡単なケースです。


ご注意ください

他のモジュールを使いたくない。

すべてのfield_body_textをtplファイルの上部に個別に出力します。次にfield_body_text、通常の方法で段落全体を表示します(スチールが含まれています)。

回答:


4

ここでの問題は、これらの段落の各グループに配列キーであるさまざまな要素が含まれていることだと思います。たとえば、最大$ content ['field_paragraph']までdpmすると、次のような値が表示されることがあります。

ここに画像の説明を入力してください

問題は、ループが原因で、オブジェクトではないものをレンダリング/ループしようとしていることだと思います。これを回避するには、先に進む前に、キーが数値であるかどうかをチェックインすることをお勧めします。

このような線に沿った何か:

<?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']);
    }
  }
  }
}

?>

is_int($ key)に注意してください。これは、エラーを解消するために必要なものです。私のコードには独自のフィールド名が含まれているので、フィールド名を切り替えるだけで十分です。


私は答えを始めて、これを読み直しました。これは正解です。
Darvanen 2015

2

テンプレートをオーバーライドして作成する代わりに、UIを介してエンティティのすべての表示を管理し、コアが表示要件をカバーしていない場合はフィールドタイプのフィールドフォーマッターを作成します。

これは表示を定義するためのよりすっきりした方法であり、特に参照に飛び込んだときにテンプレートが乱雑に速くなります。


私の場合、「メインバンドル」に保存されているすべてのタイトルのリストを出力する必要があります。これを行うためにビューaを埋め込むことができることはわかっていますが、タイトルのリストを用意しておくと、簡単になります。また、1つのページにさまざまな方法でタイトルを出力する必要があるため、テンプレートは多数のさまざまなフォーマッタを使用するよりもきれいです(UIでは、ディスプレイごとに1つのフォーマッタしか使用できません)
big_smile
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.