Renderizando itens theme_item_list

8

Meu módulo fornece um bloco simples que precisa conter uma lista não ordenada com algumas imagens. De uma função de bloco, estou retornando uma matriz renderizável:

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

Gostaria de ter algumas matrizes renderizáveis como itens na lista de itens, mas parece que não consigo inserir nenhuma matriz na #itemsmatriz.

Os documentos da API theme_item_list do Drupal 7 dizem:

itens: uma matriz de itens a serem exibidos na lista. Se um item for uma string, ele será usado como está. Se um item é uma matriz, o elemento "data" da matriz é usado como o conteúdo do item da lista. Se um item for uma matriz com um elemento "filhos", esses filhos serão exibidos em uma lista aninhada. Todos os outros elementos são tratados como atributos do elemento do item da lista.

Tentei usar os elementos "data" e "children", mas fico vazio <li>ou há uma palavra Arraydentro deles.

Qual é a maneira correta de fazer isso? Theme_item_list é a solução correta / atualizada?

Dominik Stożek
fonte
'#items' => array('data' => 'my data')parece realmente não fazer nada além de '#items' => 'my data'(veja o código para theme_item_list ). 'children'é usado especificamente para criar uma lista aninhada. Não sei por que está configurado dessa maneira.
thirdender

Respostas:

5

Algo assim:

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);
}
Bart
fonte
11
Isso funciona e é mais fácil do que minha resposta. A única vantagem da minha resposta é que tudo ainda está em matrizes de renderização e pode ser manipulado por outros módulos / temas. Se isso não for importante para você, esse é definitivamente um bom caminho a percorrer.
SoftArtisans
Eu tenho ponderado sobre esta solução. Como mencionado acima, o único problema não é manter a estrutura da página como uma matriz renderizável - se outros módulos desejassem alterar os itens, seria muito mais difícil. Mas acho que é bom o suficiente :) Obrigado!
Dominik Stożek
4

Eu encontrei exatamente esse mesmo problema. Pelo que sei, a leitura do código-fonte theme_item_list()não pode usar matrizes renderizáveis ​​como itens da lista. Acabei passando a matriz renderizável com todas as imagens para minha própria função de tema para exibir a lista. Basicamente, você pode pegar seu código atual e alterar a #themepropriedade para sua função de tema personalizada e adicionar suas matrizes renderizáveis ​​como filhos da sua listmatriz. Para facilitar sua função, você pode adicionar as tags <li>e </li>como #prefixe #suffixrespectivamente às suas matrizes de renderização de imagem e chamar drupal_render_children()sua matriz e, em seguida, envolvê-la em um <ul>e seu bem.

SoftArtisans
fonte
0

Eu estou usando o código a seguir e renderiza a lista após uma chamada ajax

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

A principal diferença é o "#", se você ler o código da função na função Drupal API theme_item_list , verá que não há hashes para as variáveis

    function theme_item_list($variables) {
        $items = $variables ['items'];
        $title = $variables ['title'];
        $type = $variables ['type'];
        $attributes = $variables ['attributes'];
    ... }
user49593
fonte