it-swarm.it

Rendering degli elementi di theme_item_list

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 articoli, ma non riesco a inserire alcun array nell'array #items.

La Drupal 7 theme_item_list API docs dice:

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 ad usare sia gli elementi "data" che "children", ma ottengo vuoti <li> O c'è una parola Array al loro interno.

Qual è il modo corretto per farlo? Il tema elenco_item è la soluzione giusta/aggiornata?

8
Dominik Stożek

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);
}
5
Bart

Ho riscontrato questo stesso identico problema. Da quello che posso dire leggendo il codice sorgente per theme_item_list() non può usare array renderizzabili come elementi per l'elenco. Ho finito per passare la matrice renderizzabile con tutte le immagini alla mia funzione tema per produrre l'elenco. In pratica, puoi prendere il tuo codice attuale e cambiare la proprietà #theme Nella tua funzione tema personalizzata e aggiungere le tue matrici renderizzabili come figli del tuo array list. Per semplificare la tua funzione, puoi aggiungere i tag <li> E </li> Come #prefix E #suffix Rispettivamente alle matrici di rendering delle immagini e chiamare drupal_render_children() sul tuo array, quindi lo avvolgi in un <ul> e il tuo bene.

4
SoftArtisans

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 su Drupal API function 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'];
    ... }
0
user49593