Рейтинг:0

Как правильно отображать ссылки в пользовательском списке элементов при использовании сложного массива рендеринга?

флаг ar

Я хочу использовать пользовательский шаблон списка элементов в модуле, который изменяет <h3> тег. Элементы, которые я отображаю, представляют собой массивы рендеринга ссылок.

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

Это код, который я использую в модуле.

функция mymodule_theme ($ существующая, $ тип, $ тема, $ путь) {
  возвращаться [
    'mymodule__item_list' => [
      'переменные' => [
        'предметы' => [
          'атрибуты' => [],
          'значение' => [],
        ],
        'название' => '',
        'list_type' => 'ул',
        'wrapper_attributes' => [],
        'атрибуты' => [],
        'пустой' => NULL,
        'контекст' => [],
      ],
      'template' => 'mymodule--item-list',
    ],
  ];
}

Файл шаблона /templates/mymodule--item-list.html.twig содержит следующий код.

{#
/**
 * @файл
 * Реализация пользовательской темы для списка элементов.
 *
 * Доступные переменные:
 * - items: Список предметов.Каждый элемент содержит:
 * - атрибуты: атрибуты HTML, которые будут применяться к каждому элементу списка.
 * - значение: содержимое элемента списка.
 * - title: Название списка.
 * - list_type: Тег для элемента списка ("ul" или "ol").
 * - wrapper_attributes: HTML-атрибуты, применяемые к обёртке списка.
 * - атрибуты: атрибуты HTML, которые будут применяться к списку.
 * - пусто: сообщение, отображаемое при отсутствии элементов. Допустимое значение
 * строка или массив рендеринга.
 * - контекст: список контекстных данных, связанных со списком. Может содержать:
 * - list_style: Пользовательский стиль списка.
 *
 * @см. template_preprocess_item_list()
 *
 * Тема @ingroup
 */
#}
{% если context.list_style %}
  {%- установить атрибуты = атрибуты.addClass('item-list__' ~ context.list_style) %}
{% конец%}
{% если элементы или пусто %}
  {%- если заголовок не пустой -%}
    <p><strong>{{ title }}</strong></p>
  {%-конец-%}

  {%- если элементы -%}
    <{{ list_type }}{{ атрибуты }}>
    {%- для элемента в элементах -%}
      <li{{ item.attributes }}>{{ item.value }}</li>
    {%- конец для -%}
    </{{ тип_списка }}>
  {%- еще -%}
    {{- пустой -}}
  {%-конец-%}
{%-конец%}

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

// $foo и $bar устанавливаются из предыдущего кода.
$commonlyUsedForItems = [];

foreach ($commonlyUsedfor as $name) {
  $url = Url::fromRoute('mymodule.page', [], [
    'запрос' => [
      'фу' => $фу,
      'бар' => $бар,
      'имя' => $имя,
    ],
  ]);

  // Создаем массив массивов рендеринга ссылок.
  $commonlyUsedForItems[] = [
    '#тип' => 'ссылка',
    '#title' => $this->t($name),
    '#url' => $url,
  ];
}

$commonlyUsedForRenderArray = [
  '#theme' => 'mymodule__item_list',
  '#тип' => 'ул',
  '#title' => 'Обычно используется для:',
  '#items' => $commonlyUsedForItems,
  '#attributes' => ['class' => 'commonlyUsedFor'],
  '#wrapper_attributes' => ['класс' => 'контейнер'],
];

Приведенный выше код работает корректно, меняя '#theme' => 'mymodule__item_list', к '#theme' => 'item_list',.

Код как бы работает, но он выводит пустые маркеры.

Я знаю, что могу вернуть $commonlyUsedForItems array для разметки и жесткого кодирования HTML, но я стараюсь максимально разделить HTML и PHP.

Есть ли у вас какие-либо идеи?

Kevin avatar
флаг in
https://drupal.stackexchange.com/a/136772/57
Protomancer avatar
флаг ar
@Kevin хорошо знать, но не помогает решать пустые пункты. Продолжает работать так же.
4uk4 avatar
флаг cn
Чтобы использовать базовый шаблон в качестве базового хука, вам нужно имя вроде `item_list__mymodule`.
флаг cn
Который вызывает [`template_preprocess_item_list`](https://api.drupal.org/api/drupal/core%21includes%21theme.inc/function/template_preprocess_item_list/9.2.x) и правильно настраивает каждый из `item` структура с ключами `value` и `attributes`, которые используются в вашем шаблоне), это то, что вам сейчас не хватает

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.