私が使用しています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
、通常の方法で段落全体を表示します(スチールが含まれています)。