Визуализация элементов theme_item_list

8

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

$block['content'] = array(
    'list' => array(
        '#theme' => 'item_list',
        '#type' => 'ul',
        '#attributes' => array('class' => 'foo1'),
        '#items' => array(
          /* ...  what should go here? */
        ),
    ),
);

Я хотел бы иметь несколько отображаемых массивов в качестве элементов в списке элементов, но мне кажется, что я не могу вставить какие-либо массивы в #itemsмассив.

В Drupal 7 theme_item_list API Docs говорит:

items: массив элементов для отображения в списке. Если элемент является строкой, то он используется как есть. Если элемент является массивом, то элемент «массив» данных используется в качестве содержимого элемента списка. Если элемент является массивом с элементом «children», эти дочерние элементы отображаются во вложенном списке. Все остальные элементы рассматриваются как атрибуты элемента элемента списка.

Я пытался использовать элементы «data» и «children», но я получаю либо пустые элементы, либо внутри них <li>есть слово Array.

Как правильно это сделать? Является ли theme_item_list правильным / актуальным решением?

Доминик Стожек
источник
'#items' => array('data' => 'my data')кажется, на самом деле ничего не делает больше, чем '#items' => 'my data'(посмотрите на код для theme_item_list ). 'children'используется специально для создания вложенного списка. Я не уверен, почему это настроено так.
Третий

Ответы:

5

Что-то вроде этого:

foreach ($images as $image) {

  // New array for readability
  $options = array(
    'path' => $image->url,
    'alt' => $image->alt,
  );

  // Push the image tag onto the items array
  $block['content']['list']['#items'][] = theme('image', $options);
}
Барт
источник
1
Это работает и проще, чем мой ответ. Единственное преимущество моего ответа состоит в том, что все еще находится в массивах рендеринга и может управляться другими модулями / темами. Если это не важно для вас, тогда это определенно хороший путь.
SoftArtisans
Я обдумывал это решение. Как упомянуто выше, единственная проблема заключается в том, чтобы не сохранять структуру страницы в качестве рендеринга массива - если бы другие модули хотели изменить итемы, это было бы намного сложнее. Но я думаю, что это достаточно хорошо :) Спасибо!
Доминик Стожек
4

Я столкнулся с этой же проблемой. Из того, что я могу сказать, читая исходный код, theme_item_list()он не может использовать рендеринг массивов в качестве элементов списка. В итоге я передал рендеринг-массив со всеми изображениями в свою собственную функцию темы для вывода списка. Вы можете взять свой текущий код и изменить #themeсвойство на свою пользовательскую функцию темы и добавить свои рендерируемые массивы как дочерние элементы вашего listмассива. Для того, чтобы ваша функция проще, вы можете добавить <li>и </li>теги , как #prefixи , #suffixсоответственно , к изображению визуализации массивов и вызов drupal_render_children()в массиве, то вы просто обернуть его в <ul>и ваше благо.

SoftArtisans
источник
0

Я использую следующий код, и он отображает список после вызова AJAX

$test = array("type"=>"ol","items"=>array('data'=>'1'),'attributes'=>array());
$commands[] = ajax_command_replace('#item-'.$ot->nid,theme_item_list($test));

Основным отличием является "#", если вы прочитаете код функции в функции API Drupal theme_item_list , вы увидите, что для переменных нет хэшей

    function theme_item_list($variables) {
        $items = $variables ['items'];
        $title = $variables ['title'];
        $type = $variables ['type'];
        $attributes = $variables ['attributes'];
    ... }
user49593
источник