Rendern von theme_item_list-Elementen

8

Mein Modul bietet einen einfachen Block, der eine ungeordnete Liste mit einigen Bildern enthalten muss. Von einer Blockfunktion gebe ich ein renderbares Array zurück:

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

Ich möchte einige renderbare Arrays als Elemente in der Elementliste haben , aber ich kann anscheinend keine Arrays in das #itemsArray einfügen .

In den API- Dokumenten zu Drupal 7 theme_item_list heißt es:

Elemente: Ein Array von Elementen, die in der Liste angezeigt werden sollen. Wenn ein Element eine Zeichenfolge ist, wird es unverändert verwendet. Wenn ein Element ein Array ist, wird das Element "data" des Arrays als Inhalt des Listenelements verwendet. Wenn ein Element ein Array mit einem "untergeordneten" Element ist, werden diese untergeordneten Elemente in einer verschachtelten Liste angezeigt. Alle anderen Elemente werden als Attribute des Listenelementelements behandelt.

Ich habe versucht, sowohl "Daten" - als auch "Kinder" -Elemente zu verwenden, aber ich erhalte entweder leere <li>oder es ist ein Wort Arrayin ihnen.

Was ist der richtige Weg, um dies zu tun? Ist theme_item_list die richtige / aktuelle Lösung?

Dominik Stożek
quelle
'#items' => array('data' => 'my data')scheint nicht wirklich mehr zu tun als '#items' => 'my data'(siehe den Code für theme_item_list ). 'children'wird speziell zum Erstellen einer verschachtelten Liste verwendet. Ich bin mir nicht sicher, warum es so eingerichtet ist.
Thirdender

Antworten:

5

Etwas wie das:

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
quelle
1
Das funktioniert und ist einfacher als meine Antwort. Der einzige Vorteil meiner Antwort ist, dass sich alles noch in Render-Arrays befindet und von anderen Modulen / Themen bearbeitet werden kann. Wenn Ihnen das nicht wichtig ist, ist dies definitiv ein guter Weg.
SoftArtisans
Ich habe über diese Lösung nachgedacht. Wie oben erwähnt, besteht das einzige Problem darin, die Seitenstruktur nicht als renderbares Array beizubehalten. Wenn andere Module die Elemente ändern möchten, ist dies viel schwieriger. Aber ich denke es ist gut genug :) Danke!
Dominik Stożek
4

Ich bin auf genau das gleiche Problem gestoßen. theme_item_list()Nach allem, was ich beim Lesen des Quellcodes sagen kann, können keine renderbaren Arrays als Elemente für die Liste verwendet werden. Am Ende habe ich das renderbare Array mit allen Bildern an meine eigene Themenfunktion übergeben, um die Liste auszugeben. Sie können grundsätzlich Ihren aktuellen Code verwenden und die #themeEigenschaft in Ihre benutzerdefinierte Designfunktion ändern und Ihre renderbaren Arrays als untergeordnete Elemente Ihres Arrays hinzufügen list. Um Ihre Funktion zu erleichtern, können Sie die hinzufügen <li>und </li>Tags als #prefixund #suffixjeweils zu Ihrem Bild machen Arrays und Anruf drupal_render_children()auf dem Array, dann wickeln Sie es einfach in einem <ul>und Ihre gut.

SoftArtisans
quelle
0

Ich verwende folgenden Code und er rendert die Liste nach einem Ajax-Aufruf

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

Hauptunterschied ist das "#". Wenn Sie den Code der Funktion in der Drupal-API-Funktion theme_item_list lesen , werden Sie feststellen , dass für die Variablen keine Hashes vorhanden sind

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