Rendu des éléments theme_item_list

8

Mon module fournit un bloc simple qui doit contenir une liste non ordonnée avec quelques images. À partir d'une fonction de bloc, je renvoie un tableau pouvant être rendu:

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

Je voudrais avoir des tableaux rendables en tant qu'éléments dans la liste des éléments, mais il semble que je ne puisse pas insérer de tableaux dans le #itemstableau.

La documentation de l'API theme_item_list de Drupal 7 indique:

éléments: un tableau d'éléments à afficher dans la liste. Si un élément est une chaîne, il est utilisé tel quel. Si un élément est un tableau, l'élément "data" du tableau est utilisé comme contenu de l'élément de liste. Si un élément est un tableau avec un élément "enfants", ces enfants sont affichés dans une liste imbriquée. Tous les autres éléments sont traités comme des attributs de l'élément d'élément de liste.

J'ai essayé d'utiliser à la fois les éléments "data" et "children", mais j'obtiens des vides <li>ou il y a un mot à l' Arrayintérieur.

Quelle est la bonne façon de procéder? Theme_item_list est-il la bonne solution / à jour?

Dominik Stożek
la source
'#items' => array('data' => 'my data')ne semble pas vraiment faire plus que '#items' => 'my data'(regardez le code de theme_item_list ). 'children'est utilisé spécifiquement pour créer une liste imbriquée. Je ne sais pas pourquoi il est configuré de cette façon.
Thirdender

Réponses:

5

Quelque chose comme ça:

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
la source
1
Cela fonctionne et est plus facile que ma réponse. Le seul avantage de ma réponse est que tout est encore dans des tableaux de rendu et peut être manipulé par d'autres modules / thèmes. Si cela n'est pas important pour vous, c'est certainement une bonne façon de procéder.
SoftArtisans
J'ai réfléchi à cette solution. Comme mentionné ci-dessus, le seul problème n'est pas de conserver la structure de la page comme un tableau pouvant être rendu - si d'autres modules voulaient changer les éléments, ce serait beaucoup plus difficile. Mais je suppose que c'est assez bon :) Merci!
Dominik Stożek
4

J'ai rencontré exactement le même problème. D'après ce que je peux dire, la lecture du code source theme_item_list()ne peut pas utiliser de tableaux rendables comme éléments de la liste. J'ai fini par passer le tableau rendable avec toutes les images à ma propre fonction de thème pour sortir la liste. Vous pouvez essentiellement prendre votre code actuel et modifier la #themepropriété en fonction de votre thème personnalisé et ajouter vos tableaux rendables en tant qu'enfants de votre listtableau. Pour rendre votre fonction plus facile, vous pouvez ajouter les balises <li>et en </li>tant que #prefixet #suffixrespectivement à vos tableaux de rendu d'image et appeler drupal_render_children()votre tableau, puis il vous suffit de l'envelopper dans un <ul>et votre bien.

SoftArtisans
la source
0

J'utilise le code suivant et il rend la liste après un appel ajax

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

la principale différence est le "#", si vous lisez le code de la fonction sur la fonction theme_item_list de l'API Drupal , vous verrez qu'il n'y a pas de hachage pour les variables

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