渲染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文档说:

items:要在列表中显示的项目数组。如果项目是字符串,则按原样使用它。如果一项是数组,则该数组的“数据”元素用作列表项的内容。如果项目是带有“子项”元素的数组,则这些子项将显示在嵌套列表中。所有其他元素都被视为列表项元素的属性。

我尝试同时使用“ data”和“ children”元素,但是我得到的是empty <li>或里面有一个单词Array

正确的方法是什么?theme_item_list是正确/最新的解决方案吗?


'#items' => array('data' => 'my data')似乎并没有做更多的事情'#items' => 'my data'(请查看theme_item_list的代码)。'children'专门用于创建嵌套列表。我不确定为什么要这样设置。
第三方2014年

Answers:


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

我一直在思考这个解决方案。如上所述,唯一的问题不是将页面结构保持为可渲染数组-如果其他模块想要更改项目,则难度会更大。但是我想这已经足够了:)谢谢!
DominikStożek2011年

4

我遇到了这个完全相同的问题。据我所知,读取源代码theme_item_list()不能将可渲染数组用作列表项。我最终将所有图像的可渲染数组传递给我自己的主题函数,以输出列表。您基本上可以采用当前代码并将#theme属性更改为自定义主题函数,然后将可渲染数组添加为list数组的子级。为了使您的功能更轻松,您可以将<li></li>标签分别作为#prefix#suffix分别添加到图像渲染数组并调用drupal_render_children()数组,然后将其包装在<ul>和中。


0

我正在使用以下代码,它在ajax调用后呈现列表

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

主要区别是“#”,如果您在Drupal API函数theme_item_list上阅读了该函数的代码,则会看到该变量没有散列

    function theme_item_list($variables) {
        $items = $variables ['items'];
        $title = $variables ['title'];
        $type = $variables ['type'];
        $attributes = $variables ['attributes'];
    ... }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.