Wyłącz opcję dla pola wyboru formularza

9

Jak wyłączyć opcję w polu wyboru formularza?

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

Jak mogę wyłączyć na przykład opcję „Tylko tytuł”?

Miguel Borges
źródło
Byłoby wspaniale wiedzieć, jak to zrobić, nadal chcę, aby ta opcja pojawiła się na liście, ale nie można jej wybrać ...
DrCord

Odpowiedzi:

6

Jedynym sposobem wyłączenia jednej z opcji dla pola formularza „wybierz” jest zastąpienie funkcji theme_select () implementującej hook_theme_registry_alter () .

theme_select() wykonuje następujący kod:

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

Wdrożona funkcja powinna wywoływać własną funkcję zamiast form_select_options () .

Jak theme_select()to się nazywa w przypadku każdego pola wyboru używanego w dowolnej formie Drupala, wolałbym raczej rozważyć zastosowanie hook_form_alter () w celu usunięcia opcji z żądanego pola formularza.

kiamlaluno
źródło
6

Wyłączenie opcji może być trudne do osiągnięcia ( użycie form_alter do wyłączenia JEDNEJ opcji pola wyboru ), więc zalecam, abyś spojrzał na optgroups jako alternatywę. Dokumentacja API formularza Drupal nie wyjaśnia tego, ale API pozwala na zagnieżdżoną tablicę dla opcji, spójrz na form_select_options () i <optgroup>część.
Możesz napisać ten kod:

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

Zobacz formularze Drupal 6 i tablice optgroup .

Edycja : wyjaśnienie tego jest alternatywą, a nie bezpośrednią odpowiedzią.

tostinni
źródło
Pytanie dotyczy wyłączenia jednej z opcji, a nie ich grupowania.
kiamlaluno
Zrozumiałem to, ale pomyślałem, że optgroup stanowi dobrą alternatywę.
tostinni
znakomity! Właśnie tego szukałem, dziękuję !!!
uwe
3

Nie wiem i nie byłem w stanie znaleźć żadnego sposobu na wyłączenie pojedynczej opcji. Wygląda na to, że próbują dostać coś takiego do Drupala. Może jakieś alternatywy, czy możesz zrobić to z css ?:

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

Lub, jeśli nie chcesz, aby wartości były w ogóle wyświetlane, możesz je cofnąć

unset($form['feed']['#options']['title']);
jordojuice
źródło
3

Mam swoją pracującą z następującą linią

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

gdzie 1 to indeks elementu, którego nie chcesz wyświetlać.

Arcybiskup Lolly
źródło
To usuwa opcję. Pytanie dotyczy wyłączenia tej opcji (pozostawienie jej wyświetlonej na szaro).
Koen,
0

Przekształć jeden element, który chcesz wyłączyć, w pusty <optgroup>.

Plusy:

  • Można to zrobić hook_form_alterbezpośrednio lub podczas tworzenia niestandardowego formularza, nie ma potrzeby implementowania theme_selectfunkcji w kompozycji.

Cons:

  • Nie ma możliwości reprezentowania value='title'atrybutu związanego z oryginałem <option>w wynikowym DOM.
  • YMMV, jeśli próbujesz wyłączyć opcję, która już dotyczy grupy optgroup. Zagnieżdżone grupy optyczne mogą rzeczywiście działać, ale jest to niesprawdzone i niepotwierdzone.

Realizacja:

Optgroups w Drupal są oznaczone wewnątrz #optionstablicy, jak każda key => valuepara, w której sama wartość jest tablicą.

Tak więc z przykładu w PO zmienilibyśmy wartość by stać się, a następnie zmieniliśmy wartość na pustą tablicę.t('Titles only')key

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

Powstały HTML będzie wyglądał mniej więcej tak:

<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>
JamesWilson
źródło
0

Aby wyłączyć całe pole, użyj

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

Aby wyłączyć opcję w polu wyboru, użyj

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

gdzie:

[„nazwa_pola”] to nazwa twojego pola

[1] to indeks opcji na liście

Rony Samuel
źródło