Переопределение поля.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.

Что я здесь делаю не так и как мне правильно переопределить эту тему в своем модуле?

 2
Author: Mad Scientist, 2015-08-16

1 answers

Мне удалось отследить место в ядре, где находится код для этой конкретной темы, оно было в core/includes/theme.inc, а не в поле или системном модуле, где я ранее искал. Копирование оттуда в конце концов сработало, использование render element в hook_theme() правильно, но мне не хватало важной функции предварительной обработки.

Я определил следующую функцию и вызвал оттуда исходную функцию предварительной обработки:

function template_preprocess_field_image(&$vars, $hook) {
    template_preprocess_field($vars, $hook);
}
 0
Author: Mad Scientist, 2015-08-16 18:43:49