Form seçimi alanı için bir seçeneği devre dışı bırakma


9

Form seç alanındaki bir seçeneği nasıl devre dışı bırakabilirim?

$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.'),
);

Örneğin, "Yalnızca başlık" seçeneğini nasıl devre dışı bırakabilirim?


Bu nasıl yapılacağını bilmek harika olurdu, hala listede görünmesini istiyorum, ancak seçilemez değil ...
— DrCord

Yanıtlar:


6

"Select" form alanı için seçeneklerden birini devre dışı bırakmanın tek yolu hook_theme_registry_alter () uygulayan theme_select () işlevini geçersiz kılmaktır .

theme_select() aşağıdaki kodu yürütür:

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>';
}

Uyguladığınız işlev form_select_options () yerine kendi işlevinizi çağırmalıdır .

theme_select()Herhangi bir Drupal formunda kullanılan her seçim alanı için çağrıldığı gibi , ben istediğiniz formu alanından seçeneği kaldırmak için hook_form_alter () uygulamayı tercih ediyorum .


6

Bir seçeneği devre dışı bırakmak zor olabilir (bir seçim alanının BİR seçeneğini devre dışı bırakmak için form_alter kullanma ), bu nedenle alternatif olarak optgroups'a bakmanızı öneririm . Drupal form API belgeleri bunu açıklamaz, ancak API seçenekler için iç içe diziye izin verir, form_select_options () ve parçaya bir göz atın <optgroup>.
Bu kodu yazabilirsiniz:

$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.'),
);

Drupal 6 formlarına ve optgroup dizilerine bir göz atın .

Düzenleme : Bu açıklığa kavuşturmak için doğrudan bir cevap değil, bir alternatiftir.


Soru, seçeneklerden birini devre dışı bırakmak, gruplandırmak değil.
— kiamlaluno

Bunu anladım ama optgroup'un iyi bir alternatif sunduğunu düşündüm.
— tostinni

parlak! Tam da aradığım şey bu, teşekkür ederim !!!
— uwe

3

Bilmiyorum ve bireysel bir seçeneği devre dışı bırakmanın bir yolunu bulamadım . Drupal'a böyle bir şey sokmaya çalışıyorlar gibi görünüyor. Belki bazı alternatifler, css ile ne yapmak istersiniz ?:

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

Veya değerlerin hiç gösterilmesini istemiyorsanız ayarlarınızı kaldırabilirsiniz

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

3

Aşağıdaki satırla çalışan benimkini aldım

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

burada 1, görüntülenmesini istemediğiniz öğenin dizinidir.


Bu seçenek kaldırılır. Soru, seçeneğin devre dışı bırakılmasıyla ilgilidir (gri renkte görüntülenecek şekilde bırakmak).
— Koen

0

Devre dışı bırakmak istediğiniz tek bir öğeyi boş bir biçime dönüştürün <optgroup>.

Artıları:

  • Bu, hook_form_alterözel formunuzu oluştururken bir veya doğrudan yapılabilir, temanızda bir theme_selectişlev uygulamaya gerek yoktur .

Eksileri:

  • Ortaya çıkan DOM'daki value='title'orijinalle ilişkilendirilen özelliği temsil etmenin bir yolu yoktur <option>.
  • Zaten bir optik grupla ilgili bir seçeneği devre dışı bırakmaya çalışıyorsanız YMMV. Yuvalanmış optgroups gerçekten işe yarayabilir, ancak bu test edilmemiştir ve doğrulanmamıştır.

Uygulama:

Drupal'daki optgroups, #optionsdizinin içinde key => valuedeğerin kendisinin bir dizi olduğu herhangi bir çift olarak gösterilir .

Bu yüzden OP örneğindeki örneğe , değerini t('Titles only')olmak keyve daha sonra değeri boş bir dizi yapmak için hareket ettiririz.

$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.'),
);

Ortaya çıkan HTML şöyle görünecektir:

<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

Tüm alanı devre dışı bırakmak için

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

Seçim alanındaki bir seçeneği devre dışı bırakmak için şunu kullanın:

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

nerede:

['field_name'] alanınızın adıdır

[1] listedeki seçeneğin dizinidir

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.