Добавление атрибутов в ссылку на загруженный файл


Меня попросили добавить target="_blank" к ссылкам, которые создаются, когда пользователь загружает файл на сайт Drupal 8.

Тип поля - "Файл". Допускается несколько загрузок.

Отладка Twig показывает мне, что поле создается основным шаблоном "файл-ссылка.html.twig". Все содержимое этого шаблона без комментариев:

<span{{ attributes }}>{{ link }}</span>
{% if file_size %}
  {# @todo remove class before Drupal 9.0.0 #}
  <span class="file-size">({{ file_size }})</span>
{% endif %}

Я перенес этот шаблон в свою пользовательскую тему и попытался добавить атрибут в ссылку. Я думал, что буду редактирование части {{ссылка}} шаблона, изменение ее для прикрепления атрибутов. Я сделал вариации этого:

{{ссылка (элемент.заголовок, элемент.url, атрибуты.setAttribute("цель","_blank')) }}

Каждый синтаксис, который я пробовал, приводил к фатальной ошибке PHP. Думая, что я неправильно использую синтаксис атрибутов, я проверил, просто попытавшись добавить один класс.

{{ link(item.title, item.url, { 'class': ['bananas'] }) }}

Это все еще был белый экран смерти, поэтому я думаю, что не могу использовать этот синтаксис в поле {{ссылка}} в моей ссылке на файл шаблон.

Я гуглил свои глазные яблоки из головы. Я нашел эту классную идею:

{% for item in items %}
  {{ item.content|merge({'#attributes': {'class': ['button', 'button--arrow', 'button--centered']}}) }}
{% endfor %}

Поэтому я адаптировал его для своего шаблона field.html.twig вот так, изменив эту часть:

{% for item in items %}
    <div{{ item.attributes }}>{{ item.content }}</div>
{% endfor %}

К этому:

{% for item in items %}
      <div{{ item.attributes }}>{{ item.content|merge({'#attributes': {'target': ['_blank']}}) }}</div>
{% endfor %}

И хотя, по крайней мере, страница загрузилась и не имела фатальной ошибки, целевой атрибут не появился в ссылке.

Есть ли у кого-нибудь какие-либо советы, как мне добавить атрибут в ссылку для загрузки файла? Почти все, что я нашел, связано со ссылкой поле, а не поле загрузки файла. Спасибо, что уделили мне время.

 1
Author: LeraA, 2020-10-19

1 answers

Файл-ссылка.html.веточка

<span{{ attributes }}>{{ link|merge({'#attributes': {'target': '_blank'}}) }}</span>
{% if file_size %}
  {# @todo remove class before Drupal 9.0.0 #}
  <span class="file-size">({{ file_size }})</span>
{% endif %}

В качестве альтернативы вы также можете решить эту проблему с помощью предварительной обработки.

Мифема.тема

/**
 * Implements hook_preprocess_HOOK().
 */
function mytheme_preprocess_file_link(&$variables) {
  $variables['link']['#url']->setOption('attributes', ['target' => '_blank']);
}
 1
Author: No Sssweat, 2020-10-20 08:07:52