Representación de elementos de theme_item_list

8

Mi módulo proporciona un bloque simple que debe contener una lista desordenada con algunas imágenes. Desde una función de bloque, estoy devolviendo una matriz renderizable:

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

Me gustaría tener algunas matrices renderizables como elementos en la lista de elementos, pero parece que no puedo insertar ninguna matriz en la #itemsmatriz.

La documentación de la API theme_item_list de Drupal 7 dice:

elementos: una matriz de elementos que se mostrarán en la lista. Si un elemento es una cadena, se usa tal cual. Si un elemento es una matriz, entonces el elemento "datos" de la matriz se usa como el contenido del elemento de la lista. Si un elemento es una matriz con un elemento "hijos", esos hijos se muestran en una lista anidada. Todos los demás elementos se tratan como atributos del elemento del elemento de la lista.

Intenté usar los elementos "datos" y "hijos", pero obtengo vacíos <li>o hay una palabra Arraydentro de ellos.

¿Cuál es la forma apropiada de hacer esto? ¿Theme_item_list es la solución correcta / actualizada?

Dominik Stożek
fuente
'#items' => array('data' => 'my data')no parece hacer nada más que '#items' => 'my data'(mira el código para theme_item_list ). 'children'se usa específicamente para crear una lista anidada. No estoy seguro de por qué está configurado de esta manera.
Thirdender

Respuestas:

5

Algo como esto:

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
fuente
1
Esto funciona y es más fácil que mi respuesta. La única ventaja de mi respuesta es que todo todavía está en matrices de renderizado y puede ser manipulado por otros módulos / temas. Si eso no es importante para usted, entonces esta es definitivamente una buena manera de hacerlo.
SoftArtisans
He estado reflexionando sobre esta solución. Como se mencionó anteriormente, el único problema es no mantener la estructura de la página como una matriz renderizable; si otros módulos quisieran cambiar los itemes, sería mucho más difícil. Pero supongo que es lo suficientemente bueno :) ¡Gracias!
Dominik Stożek
4

Me encontré con este mismo problema. Por lo que puedo decir al leer el código fuente, theme_item_list()no puede usar matrices renderizables como elementos para la lista. Terminé pasando la matriz renderizable con todas las imágenes a mi propia función de tema para generar la lista. Básicamente, puede tomar su código actual y cambiar la #themepropiedad a su función de tema personalizado y agregar sus matrices renderizables como elementos secundarios de su listmatriz. Para facilitar su función, puede agregar las etiquetas <li>y </li>como #prefixy #suffixrespectivamente a sus matrices de representación de imágenes y llamar drupal_render_children()a su matriz, luego simplemente envolverlo en un<ul> su bien.

SoftArtisans
fuente
0

Estoy usando el siguiente código y representa la lista después de una llamada ajax

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

La principal diferencia es el "#", si lee el código de la función en la función API de Drupal theme_item_list , verá que no hay valores hash para las variables

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