Переопределение поля.html.twig в моем модуле
Я пишу средство форматирования полей, и мне нужно переопределить форматирование полей по умолчанию. Я уже реализовал темы для самих элементов, но не могу заставить свою тему работать для контейнера полей.
Я установил #theme в следующем коде, и мое поле-image.html.twig найдено Drupal и обработано:
class ImageGalleryFormatter extends ImageFormatter {
/**
* {@inheritdoc}
*/
public function viewElements(FieldItemListInterface $items) {
$elements = parent::viewElements($items);
foreach ($elements as &$element) {
$element['#theme'] = 'imagegallery_format';
}
$elements['#theme'] = 'field_image';
$elements['#attached']['library'][] = 'imagegallery_formatter/light-gallery';
return $elements;
}
}
Но на самом деле это работает неправильно, я не получаю никакого контента для {{item.content}}. Это и есть суть моей поле-изображение.html.ветка:
{% for item in items %}
<div>{{ item.content }}</div>
{% endfor %}
Я подозреваю, что я неправильно реализовал hook_theme(), я попробовал несколько вариантов, но ни один не сработал.
function imagegallery_formatter_theme() {
return array(
'imagegallery_format' => array(
'variables' => array('item' => NULL, 'item_attributes' => NULL, 'url' => NULL, 'image_style' => NULL),
),
'igimage' => array(
'variables' => array(
'style_name' => NULL,
'uri' => NULL,
'width' => NULL,
'height' => NULL,
'alt' => '',
'title' => NULL,
'attributes' => array(),
),),
'field_image' => array(
'render element' => 'element',),
);
}
Первые две темы работают, для них я просто скопировал массив переменных из существующего кода. Третий вариант не работает, и я не смог найти ни одного существующего кода, который мог бы использовать в качестве шаблона. Я попытался определить переменные вместо использования "элемента визуализации", но я не знаю, как определить там переменную items
. Я попытался установить для него значение NULL или пустой массив, но ничего не работало. Когда я помещаю массив переменных в hook_theme, я получаю просто четыре пустых div, с массивом элементов визуализации я получаю один пустой div.
Что я здесь делаю не так и как мне правильно переопределить эту тему в своем модуле?
1 answers
Мне удалось отследить место в ядре, где находится код для этой конкретной темы, оно было в core/includes/theme.inc
, а не в поле или системном модуле, где я ранее искал. Копирование оттуда в конце концов сработало, использование render element
в hook_theme() правильно, но мне не хватало важной функции предварительной обработки.
Я определил следующую функцию и вызвал оттуда исходную функцию предварительной обработки:
function template_preprocess_field_image(&$vars, $hook) {
template_preprocess_field($vars, $hook);
}