从Drupal 8中的“field”模板中访问“item”标签

时间:2016-05-01 07:50:39

标签: drupal drupal-8

我有一个字段,其中包含许多应该呈现为标签的节点。

标记包含选项卡控件,后跟选项卡内容。 我有一个重写的field模板,可以呈现:

{# 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>

根据文件说明,项目只有两个属性

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

“标签内容”呈现完美。我有一个模板,将节点呈现为标签内容。

我得到正确数量的制表符控件,因为我正在遍历这些项目,但我无法访问项目标签(标题)来正确呈现控件,因为item.label不存在。

我可以想到两种方法:

  • 创建一个钩子以某种方式将节点标签添加到item
  • 创建两个模板:选项卡控件和选项卡内容,它们既选择节点项,又渲染控件或内容。

我不确定是否有可能。

1 个答案:

答案 0 :(得分:2)

您可以在模块或主题中定义的预处理函数中轻松执行此操作(假设引用字段称为field_articles):

/**
 * 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元素。