Как программно передать значение поля 1 в массив класса поля 2 в.тема


Мотивация

Контекст между массивами переменных шаблона - это старая проблема, уже известная в D6 и 7 на уровне тематизации. А как насчет D8 сейчас? Есть какой-нибудь свет на горизонте? Есть ли шанс сделать это доступным без использования просмотров модуля настроек и обходных путей?

Давайте воспользуемся примером:

Стандартный тип контента по умолчанию Статья имеет 4 поля ввода:

  • метка (название)
  • текст (основной текст площадь)
  • изображение
  • теги (термины, ссылка на сущность)

Этот тип контента также имеет альтернативный Параметр Управления отображением полей для режима просмотра тизера , где форматирование поля изображения настраивается с использованием меньшего стиля изображения и с возможностью ссылки на файл или полную страницу узла. Это создает элемент <a> с URL-адресом, но без заголовка или каких-либо других атрибутов вокруг разметки изображения статьи в представлении тизера режим.

Вопрос:

Как я могу передать, например, первое значение тегов (входных терминов) программно в массив классов элемента обертывания <a>?

В node--view--frontpage.html.twig этом...

`<a href="#" class="image icon fa-{{ (content.field_tags['0']['#title']) }}">{{ content.field_image }}</a>` 

... работает. Конечно, потому что мы берем его из переменной страницы. Но image-formatter.html.twig глубже вложен во всю систему шаблонов, и было бы перегрузкой иметь здесь весь массив переменных страницы. Конечно, его там нет.

Мое предположение состояло в том, чтобы использовать следующие функции предварительной обработки:

  • function theme_preprocess_field(&$variables) {} и или
  • function theme_preprocess_image_formatter(&$variables) {}

Проблема:

Похоже - даже если _preprocess_image_formatter было предложено в комментариях к веточке image-formatter.html.twig - 1.) нет места для передачи строки в массив атрибутов для элемента <a> в этом файле ветки, так как в массиве для этого нет места. 2.) Передача. Как? Глобальные переменные в большинстве случаев не являются лучшим решением.

Основной код шаблона image-formatter.html.twig:

{% if url %}
  <a href="{{ url }}">{{ image }}</a>
{% else %}
  {{ image }}
{% endif %}

Составленное изменение для демонстрации необходимого эффекта:

{% if url %}
  <a href="{{ url }}"{{ some defined attributes }}>{{ image }}</a>
{% else %}
  {{ image }}
{% endif %}

ПРИМЕЧАНИЕ: добавление значений вручную и непосредственно в файл темы twig, например

<a href="{{ url }}" class="hallo-classes">{{ image }}</a>` 

Показывает, что это правильный шаблон ветки. Но, похоже, нет способа передать другие значения (здесь), так как массив _preprocess_image_formatter $variables, конечно, не знает никаких значений других полей (например, тегов поле терминов). И _preprocess_field() не достигает уровня форматирования изображения, так что добавление массив атрибутов скорее влияет на окружающий div, но не на элемент <a>.

Author: nilsun, 2016-04-10

1 answers

Контекст между массивами переменных шаблона - это старая проблема, уже известная в D6 и 7 на уровне тематизации. А как насчет D8 сейчас? Есть какой-нибудь свет на горизонте?

Нет, на горизонте нет света, совсем наоборот. Из-за концепции вложенных элементов визуализации, которые отображаются независимо. В D8 это становится намного сложнее из-за динамического кэша. И это совсем не сработало бы с планами на будущее с заполнителями и ленивыми здание.

 1
Author: 4k4, 2016-04-10 15:23:02