Bagaimana cara saya membungkus dua elemen array render dalam div?


12

Diberikan array yang dapat diurai ini:

$output = array(
    'twitter-icon' => array(
      '#type' => 'markup',
      '#markup' => '<div class="twitter-icon"></div>'
    ),
    'twitter-link' => array(
      '#type' => 'markup',
      '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/zujava'),
    ), 
  );

Bagaimana cara membungkus kedua elemen ini dalam DIV tunggal?

Jawaban:


29

Anda juga bisa menggunakan #containerelemen formulir, dan kode yang mirip dengan yang berikut:

$wrapper = array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('class-name'),
  ),
);

$wrapper['twitter-icon'] => array(
  '#type' => 'markup',
  '#markup' => '<div class="twitter-icon"></div>'
);

$wrapper['twitter-link'] => array(
  '#type' => 'markup',
  '#markup' => l(t('follow us on Twitter'), 'https://twitter.com/#!/zujava'),
); 

The #container elemen membungkus elemen anak-anaknya dengan <div>tag, yang kelas CSS adalah salah satu berlalu di #attributesproperti.

Anda bahkan bisa menggunakan wadah untuk elemen "ikon-twitter", tetapi itu tidak memberi Anda pro, kecuali jika Anda bisa menambahkan elemen ke dalamnya, seperti dengan kode berikut:

$wrapper = array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('class-name'),
  ),
);

$wrapper['twitter-icon'] => array(
  '#type' => 'container',
  '#attributes' => array(
    'class' => array('twitter-icon'),
  ),
);

if ($condition) {
  $wrapper['twitter-icon']['twitter-icon-text'] => array(
    '#type' => 'markup',
    '#markup' => t('Icon text'),
  );
}

$wrapper['twitter-link'] => array(
  '#type' => 'markup',
  '#markup' => l(t('follow us on Twitter'), 'https://twitter.com/#!/zujava'),
); 

Bagi saya ini adalah jawaban terbaik, karena menggunakan struktur array fisik untuk mewakili apa yang sedang dibungkus, akan menyalin dan menempel lebih baik (memindahkan elemen dalam jawaban @ninjascorner dapat mematahkan pembukaan / penutupan DIVs), dan tidak memerlukan tambahan fungsi tema. Terima kasih!
Justin

Itu benar: Anda bisa menambahkan elemen lain yang dirender di wadah yang sama, tanpa memindahkan #suffixproperti dari elemen terakhir, atau #prefixproperti dari elemen pertama, ke elemen baru yang ditambahkan. Seperti yang Anda katakan, ini lebih rentan kesalahan.
kiamlaluno

6

Apakah ini yang kamu cari?

$output = array(
    'twitter-icon' => array(
      '#type' => 'markup',
      '#markup' => '<div class="twitter-icon"></div>'
      '#prefix' => '<div class="test">',
    ),
    'twitter-link' => array(
      '#type' => 'markup',
      '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/fdgf'),
      '#suffix' => '</div>',
    ), 
);

Semoga itu bisa membantu!


@nija +1, jawaban Hebat Saya lupa atribut itu. Silakan baca jawaban saya, dapatkah ini dicapai melalui theming alternatif berdasarkan akhiran dan awalan Anda.
stefgosselin

@stefgosselin, maksud Anda Anda ingin membuat file tpl dengan tema?
ninjascorner

Terima kasih atas jawaban ini. Saya tahu bagaimana melakukan ini pada satu elemen, tetapi tidak terpikir oleh saya untuk membagi akhiran dan awalan. Menarik. Rasanya berantakan bagi saya, tetapi saya tidak bisa mengartikulasikan mengapa jadi saya tidak bisa benar-benar memiliki masalah.
Justin

@ninjascorner Maaf atas keterlambatan ini, saya tidak dapat menemukan catatan yang saya miliki tentang hal ini. Ada juga saya pikir cara yang mungkin kurang elegan daripada jawaban lain, dapat digunakan dalam tema atau modul yang menggunakan kait tema theme_render_example_add_div Lihat api.drupal.org/api/examples/… )
stefgosselin

Ini hanya baik jika Anda sangat yakin bahwa kedua elemen akan selalu ditampilkan. Sangat mudah untuk berakhir dengan <div> tertutup ketika membelah seperti ini.
kufeiko

2

Anda juga dapat membuat tema untuk ini.

$form['twitter']['#theme'] = 'my_twitter_theme';

$form['twitter']['icon'] = array(
'twitter-icon' => array(
  '#type' => 'markup',
  '#markup' => '<div class="twitter-icon"></div>'
);

$form['twitter']['link'] = array(
  '#type' => 'markup',
  '#markup' => l('follow us on Twitter', 'https://twitter.com/#!/zujava'),
);

Dan di kait tema Anda:

function my_hook_theme(){
  return array(
    'my_twitter_theme' => array('form' => NULL)
  );
} 

Dan dalam fungsi tema:

function theme_my_twitter_theme($form){
  $output = "";

  $output .= "<div class=\"twitter\">";
  $output .= drupal_render($form['icon']);
  $output .= drupal_render($form['link']);
  $output .= "</div>";    

  $output .= drupal_render($form);
  return $output;
}

Saya menggunakan ini di Drupal 6, saya tidak yakin apakah berfungsi juga di D7 tapi saya harap begitu


Ya, saya menemukan metode ini setelah memposting (well, saya menyalin modul contoh). Ini berfungsi dengan baik, tetapi saya tidak menganggapnya sebagai metode terbaik karena (jika saya mengerti dengan benar), Anda harus memasukkan nama kelas Anda ke dalam fungsinya, mengurangi penggunaannya kembali.
Justin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.