树枝中重复字段的唯一 ID - Drupal 8

Unique id to recurring field in twig - Drupal 8

我有一个 Drupal 内容类型,它使用多个相同类型的引用实体(例如,“相关产品”)

我想给每个相关产品的标题字段一个唯一的 ID。可以是产品名、迭代器、产品节点ID,取最简单的。

我创建了一个树枝模板,它覆盖了所述内容类型中所述节点的标题:field--node--title--my-content-type.html.twig但我不知道从这里去哪里。

我可以添加自定义 ID

{% set attributes = attributes.setAttribute('id', 'customID') %}

但这是静态的,并且在多次调用该字段时不会是唯一的。

{% set node = element['#object'] %}{{ item.content['#node'].field_name.value }} 推荐的 here 不适合我。

如果可能的话,我想解决它 twig-only,不需要任何额外的 php 代码。

非常感谢任何指点或建议

您可以修改循环遍历 items 数组的代码。

比如我加了一个迭代索引:

字段--节点--标题--my-content-type.html.twig

{# Here I coppied template from web/core/modules/system/templates/field.html.twig and modified it #}
{%
  set title_classes = [
  label_display == 'visually_hidden' ? 'visually-hidden',
]
%}

{% if label_hidden %}
  {% if multiple %}
    <div{{ attributes }}>
      {% for item in items %}
        <div{{ item.attributes }}>{{ item.content }}</div>
      {% endfor %}
    </div>
  {% else %}
    {% for item in items %}
      <div{{ attributes }}>{{ item.content }}</div>
    {% endfor %}
  {% endif %}
{% else %}
  <div{{ attributes }}>
    <div{{ title_attributes.addClass(title_classes) }}>{{ label }}</div>
    {% if multiple %}
    <div>
      {% endif %}
      {% for index, item in items %}                                     {# use index #}
        <span>{{ index }}</span>                                         {# and print it #}
        <div{{ item.attributes }}>{{ item.content }}</div>
      {% endfor %}
      {% if multiple %}
    </div>
    {% endif %}
  </div>
{% endif %}

结果:

Kien Nguyen 的回答并不完全适合我,因为虽然有多个引用实体,但每个实体只有一个标题,所以索引总是以“0”结束,这不是“这正是我可以用作唯一 ID 的值。

但是根据他的逻辑,现在很容易找到解决方案:

我没有将索引用作索引,而是将其用作访问 item.content 中的值的键。 (因为我要使用 item.content 作为唯一 ID,所以我不得不去掉空格,但为了做到这一点,我不得不直接访问 item.content 数组中的值。

在我的场景中,该项目是 'related product' 类型节点的标题,因此它是

  • 足够短,可以用作 HTML id
  • 独一无二(即没有两个不同的产品同名)

所以

{% for index, item in items %}                                     {# use index #}
        <span>{{ index }}</span>                                         {# and print it #}
        <div{{ item.attributes }}>{{ item.content }}</div>

Kien 代码中的部分变为

{% for key, item in items %}
      <span id="{{element['#items'][key].value|replace({' ':''}) }}"></span>
      <div{{ item.attributes }}>{{ item.content }}</div>
    

在我的实现中,它为每个引用的节点提供了一个唯一的 ID,正如最初预期的那样。

感谢您的帮助,Kien!