Merender item theme_item_list

8

Modul saya menyediakan blok sederhana yang perlu berisi daftar tidak terurut dengan beberapa gambar. Dari fungsi blok, saya mengembalikan array yang dapat diulang:

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

Saya ingin memiliki beberapa array yang dapat di render sebagai item dalam daftar item, tetapi saya tampaknya tidak dapat memasukkan array apa pun ke dalam #itemsarray.

The Drupal 7 API theme_item_list docs mengatakan:

item: Array item yang akan ditampilkan dalam daftar. Jika item adalah string, maka item itu digunakan apa adanya. Jika item adalah array, maka elemen "data" dari array digunakan sebagai konten dari item daftar. Jika item adalah array dengan elemen "anak-anak", anak-anak tersebut ditampilkan dalam daftar bersarang. Semua elemen lain diperlakukan sebagai atribut elemen item daftar.

Saya mencoba menggunakan elemen "data" dan "anak-anak", tetapi saya mendapatkan data kosong <li>atau ada kata Arraydi dalamnya.

Apa cara yang tepat untuk melakukan ini? Apakah theme_item_list solusi yang tepat / terbaru?

Dominik Stożek
sumber
'#items' => array('data' => 'my data')tampaknya tidak benar-benar melakukan apa pun lebih dari '#items' => 'my data'(lihat kode untuk theme_item_list ). 'children'digunakan khusus untuk membuat daftar bersarang. Saya tidak yakin mengapa ini diatur dengan cara ini.
thirdender

Jawaban:

5

Sesuatu seperti ini:

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
sumber
1
Ini bekerja dan lebih mudah daripada jawaban saya. Satu-satunya keuntungan dari jawaban saya adalah bahwa semuanya masih dalam render array dan dapat dimanipulasi oleh modul / tema lainnya. Jika itu tidak penting bagi Anda, maka ini pasti cara yang baik untuk pergi.
SoftArtisans
Saya telah mempertimbangkan solusi ini. Seperti disebutkan di atas, satu-satunya masalah adalah tidak menjaga struktur halaman sebagai array yang dapat diulang - jika modul lain ingin mengubah itemes, itu akan jauh lebih sulit. Tapi kurasa sudah cukup bagus :) Terima kasih!
Dominik Stożek
4

Saya mengalami masalah yang sama persis ini. Dari apa yang saya tahu membaca kode sumber untuk theme_item_list()itu tidak dapat menggunakan array yang dapat di render sebagai item untuk daftar. Saya akhirnya melewati array yang dapat diulang dengan semua gambar ke fungsi tema saya sendiri untuk menampilkan daftar. Pada dasarnya Anda dapat mengambil kode Anda saat ini dan mengubah #themeproperti ke fungsi tema khusus Anda dan menambahkan array yang dapat diurai sebagai anak-anak dari listarray Anda . Untuk membuat fungsi Anda lebih mudah, Anda dapat menambahkan <li>dan </li>tag sebagai #prefixdan #suffixmasing - masing ke array render gambar Anda dan memanggil drupal_render_children()array Anda, maka Anda hanya membungkusnya dalam <ul>dan barang Anda.

SoftArtisans
sumber
0

Saya menggunakan kode berikut dan membuat daftar setelah panggilan ajax

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

perbedaan utama adalah "#", jika Anda membaca kode fungsi di fungsi Drupal API theme_item_list , Anda akan melihat tidak ada hash untuk variabel

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