Apa itu properti "#"?

22

Saat membaca dokumentasi kerangka Ajax saya menemukan menyebutkan #ajaxproperti. Saya tahu dari menyodok kode bahwa ada orang lain dari properti ini dengan tanda-tanda hash di depan mereka. Apa yang ditandakan oleh tanda hash? Tentang apakah semua properti ini?

beth
sumber
Semoga tidak apa-apa bagi saya untuk ingin menambahkan "tanda pon" di suatu tempat di sini di halaman ini (karena itu adalah istilah pencarian yang saya gunakan untuk mencoba mencari tahu ini, ketika "hash" tidak membuat saya hasil yang terlalu membantu).
Max Starkenburg

Jawaban:

23

Ini berkaitan dengan array render secara umum, ini bukan hanya khusus untuk AJAX atau API form (meskipun API form menggunakan array render secara eksklusif untuk membangun kontennya).

Sederhananya, kunci array dalam array render tanpa #di depan nama dipandang sebagai anak-anak dari array render, dan kemudian diberikan sendiri (secara rekursif).

Mereka dengan sebuah #di depan mereka dilihat sebagai meta data / variabel untuk membuat array untuk digunakan sebagai diperlukan, dan diri mereka sendiri tidak diberikan.

Documents render array (ditautkan ke atas) sebenarnya menempatkan ini dengan bagus dan ringkas:

Array render adalah array terstruktur Drupal klasik yang menyediakan data (mungkin bersarang) bersama dengan petunjuk tentang bagaimana harus dirender (properti, seperti #type).

The #kunci adalah 'petunjuk' bahwa ayat di atas berbicara tentang, non- #kunci adalah data bersarang.

Saya benar-benar akan merekomendasikan agar halaman itu dibaca, itu melakukan pekerjaan yang baik untuk menghilangkan mistis seluruh hal array render, dan memberikan contoh kode.

Ada juga penjelasan kecil / contoh kode lain pada halaman Dokumen yang mungkin berguna.

Render array digunakan di semua tempat di Drupal (bentuk, tema, markup umum, dll.) Sehingga mengetahui sedikit tentang mereka akan banyak membantu pengembangan Drupal di masa depan.

Clive
sumber
Baik kalahkan saya untuk itu.
chrisjlee
4

Formulir API menggunakan # di depan semua properti, untuk membuat perbedaan antara properti, dan elemen anak. Dalam kode berikut, $form['choice_wrapper']['choice']adalah elemen turunan, sementara $form['choice_wrapper']['#tree']adalah properti.

  // Add a wrapper for the choices and more button.
  $form['choice_wrapper'] = array(
    '#tree' => FALSE, 
    '#weight' => -4, 
    '#prefix' => '<div class="clearfix" id="poll-choice-wrapper">', 
    '#suffix' => '</div>',
  );

  // Container for just the poll choices.
  $form['choice_wrapper']['choice'] = array(
    '#prefix' => '<div id="poll-choices">', 
    '#suffix' => '</div>', 
    '#theme' => 'poll_choices',
  );

Semua properti tersebut tercantum dalam referensi API Formulir . Ada banyak properti, tetapi semuanya tentang rendering, validasi, dan pengiriman.

Alasan untuk menggunakan awalan untuk properti adalah untuk dapat dengan cepat menyaring properti dari elemen turunan , yang berguna ketika mereka perlu dirender, misalnya dengan drupal_render () , yang berisi kode berikut.

  // Get the children of the element, sorted by weight.
  $children = element_children($elements, TRUE);

  // Initialize this element's #children, unless a #pre_render callback already
  // preset #children.
  if (!isset($elements['#children'])) {
    $elements['#children'] = '';
  }
  // Call the element's #theme function if it is set. Then any children of the
  // element have to be rendered there.
  if (isset($elements['#theme'])) {
    $elements['#children'] = theme($elements['#theme'], $elements);
  }
  // If #theme was not set and the element has children, render them now.
  // This is the same process as drupal_render_children() but is inlined
  // for speed.
  if ($elements['#children'] == '') {
    foreach ($children as $key) {
      $elements['#children'] .= drupal_render($elements[$key]);
    }
  }

Jika Anda melihat element_children () , Anda akan melihat kode untuk menyaring properti adalah yang berikut.

  // Filter out properties from the element, leaving only children.
  $children = array();
  $sortable = FALSE;
  foreach ($elements as $key => $value) {
    if ($key === '' || $key[0] !== '#') {
      $children[$key] = $value;
      if (is_array($value) && isset($value['#weight'])) {
        $sortable = TRUE;
      }
    }
  }
kiamlaluno
sumber