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.