Rendering degli elementi di theme_item_list


8

Il mio modulo fornisce un semplice blocco che deve contenere un elenco non ordinato con alcune immagini. Da una funzione di blocco, sto restituendo un array renderizzabile:

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

Vorrei avere alcuni array renderizzabili come elementi nell'elenco degli elementi, ma non riesco a inserire alcun array #itemsnell'array.

I documenti dell'API theme_item_list di Drupal 7 dicono:

articoli: una serie di elementi da visualizzare nell'elenco. Se un elemento è una stringa, viene utilizzato così com'è. Se un elemento è un array, l'elemento "data" dell'array viene utilizzato come contenuto dell'elemento dell'elenco. Se un elemento è un array con un elemento "children", tali elementi secondari vengono visualizzati in un elenco nidificato. Tutti gli altri elementi vengono trattati come attributi dell'elemento della voce di elenco.

Ho provato a usare sia gli elementi "data" che "children", ma ottengo vuoti <li>o c'è una parola Arrayal loro interno.

Qual è il modo corretto per farlo? Theme_item_list è la soluzione giusta / aggiornata?


'#items' => array('data' => 'my data')non sembra fare davvero altro che '#items' => 'my data'(guarda il codice per theme_item_list ). 'children'viene utilizzato specificamente per creare un elenco nidificato. Non sono sicuro del perché sia ​​impostato in questo modo.
terzo

Risposte:


5

Qualcosa come questo:

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
Funziona ed è più facile della mia risposta. L'unico vantaggio della mia risposta è che tutto è ancora in array di rendering e può essere manipolato da altri moduli / temi. Se questo non è importante per te, questo è sicuramente un buon modo per andare.
SoftArtisans,

Ho riflettuto su questa soluzione. Come accennato in precedenza, l'unico problema non è mantenere la struttura della pagina come un array renderizzabile - se altri moduli volessero modificare gli elementi, sarebbe molto più difficile. Ma immagino che sia abbastanza buono :) Grazie!
Dominik Stożek,

4

Ho riscontrato questo stesso identico problema. Da quello che posso dire leggendo il codice sorgente per theme_item_list()esso non è possibile utilizzare matrici renderizzabili come elementi per l'elenco. Ho finito per passare la matrice renderizzabile con tutte le immagini alla mia funzione tema per generare l'elenco. In pratica puoi prendere il tuo codice attuale e cambiare la #themeproprietà con la tua funzione di tema personalizzata e aggiungere i tuoi array renderizzabili come figli del tuo listarray. Per semplificare la tua funzione, puoi aggiungere i tag <li>e </li>come #prefixe #suffixrispettivamente alle matrici di rendering delle immagini e chiamare drupal_render_children()il tuo array, quindi avvolgilo in un <ul>e il tuo bene.


0

Sto usando il seguente codice e viene visualizzato l'elenco dopo una chiamata Ajax

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

la differenza principale è "#", se leggi il codice della funzione nella funzione API Drupal theme_item_list , vedrai che non ci sono hash per le variabili

    function theme_item_list($variables) {
        $items = $variables ['items'];
        $title = $variables ['title'];
        $type = $variables ['type'];
        $attributes = $variables ['attributes'];
    ... }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.