Nonaktifkan opsi untuk bidang formulir pilih


9

Bagaimana cara menonaktifkan opsi di bidang formulir pilih?

$form['feed'] = array(
  '#type' => 'select', 
  '#title' => t('Display of XML feed items'), 
  '#options' => array(
    'title' => t('Titles only'), 
    'teaser' => t('Titles plus teaser'), 
    'fulltext' => t('Full text'),
  ),
  '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

Bagaimana saya bisa menonaktifkan, misalnya, opsi "Judul saja"?


Ini bagus untuk mengetahui bagaimana melakukannya, saya masih ingin opsi muncul dalam daftar, tetapi tidak dapat dipilih ...
DrCord

Jawaban:


6

Satu-satunya cara untuk menonaktifkan salah satu opsi untuk bidang formulir "pilih" adalah dengan mengesampingkan fungsi theme_select () yang mengimplementasikan hook_theme_registry_alter () .

theme_select() mengeksekusi kode berikut:

function theme_select($variables) {
  $element = $variables['element'];
  element_set_attributes($element, array('id', 'name', 'size'));
  _form_set_class($element, array('form-select'));

  return '<select' . drupal_attributes($element['#attributes']) . '>' . form_select_options($element) . '</select>';
}

Fungsi yang Anda implementasikan harus menjalankan fungsi Anda sendiri, bukan form_select_options () .

Seperti theme_select()yang dipanggil untuk setiap bidang pilih yang digunakan dalam bentuk Drupal apa pun, saya lebih suka mempertimbangkan untuk mengimplementasikan hook_form_alter () untuk menghapus opsi dari bidang formulir yang Anda inginkan.


6

Menonaktifkan opsi mungkin sulit dilakukan ( Menggunakan form_alter untuk menonaktifkan SATU opsi bidang pilihan ) jadi saya akan merekomendasikan Anda untuk melihat optgroup sebagai alternatif. Dokumentasi bentuk API Drupal tidak menjelaskannya tetapi API memungkinkan array bersarang untuk opsi, lihat form_select_options () dan <optgroup>bagian.
Anda dapat menulis kode ini:

$form['feed'] = array(
    '#type' => 'select', 
    '#title' => t('Display of XML feed items'), 
    '#options' => array(
        'Titles only' => array(, 
          'teaser' => t('Titles plus teaser'), 
          'fulltext' => t('Full text'),
        ),
        'Titles only 2' => array(, 
          'teaser2' => t('Titles plus teaser 2'), 
          'fulltext2' => t('Full text 2'),
        ),
    ),
    '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

Lihatlah formulir Drupal 6 dan array optgroup .

Sunting : untuk memperjelas ini adalah alternatif dan bukan jawaban langsung.


Pertanyaannya adalah tentang menonaktifkan salah satu opsi, bukan mengelompokkannya.
kiamlaluno

Saya mengerti itu tetapi saya pikir optgroup memberikan alternatif yang baik.
tostinni

cemerlang! Itulah tepatnya yang saya cari, terima kasih !!!
uwe

3

Saya tidak tahu dan belum dapat menemukan cara untuk menonaktifkan opsi individual. Sepertinya mereka mencoba memasukkan sesuatu seperti ini ke Drupal. Mungkin beberapa alternatif, bisakah yang Anda inginkan dilakukan dengan css ?:

$form['feed']['#attributes'] = array('class' => array('options-styles-class'));

Atau, jika Anda tidak ingin nilai ditampilkan sama sekali, Anda dapat menghapusnya

unset($form['feed']['#options']['title']);

3

Saya punya saya bekerja dengan baris berikut

unset($form['field_name']['und']['#options'][1]);

di mana 1 adalah indeks dari item yang Anda tidak ingin ditampilkan.


Ini menghapus opsi. Pertanyaannya adalah tentang menonaktifkan opsi (membiarkannya ditampilkan berwarna abu-abu).
Koen

0

Konversi satu item yang Anda ingin nonaktifkan menjadi kosong <optgroup>.

Pro:

  • Ini dapat dilakukan dalam hook_form_alteratau langsung ketika membangun formulir kustom Anda, tidak perlu menerapkan theme_selectfungsi dalam tema Anda.

Cons:

  • Tidak ada cara untuk mewakili value='title'atribut yang berhubungan dengan aslinya <option>di DOM yang dihasilkan.
  • YMMV jika Anda mencoba menonaktifkan opsi yang sudah berkaitan dengan optgroup. Optgroup bersarang mungkin memang berfungsi, tetapi ini belum diuji dan belum dikonfirmasi.

Penerapan:

Optgroups di Drupal dilambangkan di dalam #optionsarray sebagai key => valuepasangan mana pun yang nilainya adalah array.

Jadi dari contoh di OP kita akan memindahkan nilai t('Titles only')menjadi keydan kemudian membuat nilai menjadi array kosong.

$form['feed'] = array(
  '#type' => 'select', 
  '#title' => t('Display of XML feed items'), 
  '#options' => array(
    t('Titles only') => array(), // This one becomes disabled as an empty optgroup
    'teaser' => t('Titles plus teaser'), 
    'fulltext' => t('Full text'),
  ),
  '#description' => t('Global setting for the length of XML feed items that are output by default.'),
);

HTML yang dihasilkan akan terlihat seperti ini:

<form>
  <div>
    <label>Display of XML feed items</label>
    <select>
      <optgroup>Titles only</optgroup>
      <option value="teaser">Titles plus teaser</option>
      <option value="fulltext">Full text</option>
    </select>
  </div>
</form>

0

Untuk menonaktifkan seluruh bidang, gunakan

$form['field_name']['#disabled']= TRUE;

Untuk menonaktifkan opsi di bidang pilih, gunakan

unset($form['field_name']['und']['#options'][1]);

dimana:

['field_name'] adalah nama bidang Anda

[1] adalah indeks opsi dalam daftar

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.