2016-05-01 11 views
0

私は、タブとしてレンダリングされるべきいくつかのノードを含むフィールドを持っています。Drupal 8の "field"テンプレート内の "item"ラベルにアクセスします。

マークアップは、タブコントロールの後ろにタブの内容で構成されます。

{# Tab controls #} 
<dl class="tabs"> 
{% for item in items %} 
    <dd><a>Insert tab label here</a></dd> 
{% endfor %} 
</dl> 

{# Tab content #} 
<div class="tabs-content"> 
{% for item in items %} 
    <div{{ attributes }}> 
    {{ item.content }} 
    </div> 
{% endfor %} 
</div> 

doccommentsによると、項目が「タブの内容が」完全にレンダリングするだけで二つの属性

* - items: List of all the field items. Each item contains: 
* - attributes: List of HTML attributes for each item. 
* - content: The field item's content. 

があります 私はレンダリングオーバーライドさfieldテンプレートを持っています。私はタブのコンテンツとしてノードをレンダリングするテンプレートを持っています。

私が項目を反復処理していますので、私は、タブコントロールの正しい数を得るが、item.labelが存在しないので、私は、正確にコントロールをレンダリングするアイテム・ラベル(タイトル)にアクセスすることはできません。

私は2つのアプローチを考えることができます:

  • は何とかitemにノードラベルを追加するためのフックを作成します。
  • タブコントロールとタブコンテンツの2つのテンプレートを作成します。タブコントロールとタブコンテンツはどちらもノードアイテムを選択しますが、コントロールまたはコンテンツはレンダリングします。

いずれかが可能かどうかわかりません。あなたが簡単にあなたのモジュールやテーマで定義された前処理機能(仮定する参照フィールドがfield_articlesと呼ばれている)でこれを行うことができます

答えて

2

/** 
* Implements hook_preprocess_HOOK(). 
*/ 
function my_module_preprocess_field(&$variables) { 
    switch ($variables['field_name']) { 
    case 'field_articles': 
     foreach ($variables['items'] as $delta => $item) { 
     if (!empty($item['content']['#node'])) { 
      /** @var Node $node */ 
      $node = $item['content']['#node']; // This is referenced node. 
      $variables['items'][$delta]['label'] = [ 
      '#markup' => $node->label(), 
      ]; 
     } 
     } 
     break; 
    } 
} 

、あなたのフィールドの小枝テンプレートはitem.labelの要素を持つことになります。

+0

ありがとうございます!完璧に働いた。 – Tim

関連する問題