Отключить опцию для поля формы выбора

9

Как отключить опцию в поле выбора формы?

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

Как отключить, например, опцию «Только заголовок»?

Мигель Борхес
источник
Было бы здорово узнать, как это сделать, я все еще хочу, чтобы опция появилась в списке, но не была
выбрана

Ответы:

6

Единственный способ отключить одну из опций для поля формы «выбрать» - это переопределить функцию theme_select (), реализующую hook_theme_registry_alter () .

theme_select() выполняет следующий код:

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

Реализуемая вами функция должна вызывать вашу собственную функцию вместо form_select_options () .

Поскольку он theme_select()вызывается для каждого поля выбора, используемого в любой форме Drupal, я предпочел бы реализовать реализацию hook_form_alter () для удаления опции из поля формы, которое вы хотите.

киамалуно
источник
6

Отключить опцию может быть сложно ( используя form_alter, чтобы отключить ОДНУ опцию поля выбора ), поэтому я рекомендую вам взглянуть на optgroups в качестве альтернативы. Документация по API формы Drupal не объясняет этого, но API позволяет использовать вложенный массив для опций, взгляните на form_select_options () и <optgroup>часть.
Вы можете написать этот код:

$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 и массивы optgroup .

Изменить : уточнить это альтернативный, а не прямой ответ.

tostinni
источник
Вопрос в том, чтобы отключить один из вариантов, а не группировать их.
kiamlaluno
Я понял это, но я подумал, что optgroup предоставил хорошую альтернативу.
Тостинни
блестящий! Это именно то, что я искал, спасибо !!!
Uwe
3

Я не знаю и не смог найти способ отключить отдельную опцию. Похоже, они пытаются получить что-то подобное в Drupal. Может быть, какие-то альтернативы, может ли то, что вы хотите сделать с помощью CSS?

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

Или, если вы не хотите, чтобы значения отображались вообще, вы можете отменить их

unset($form['feed']['#options']['title']);
jordojuice
источник
3

Я получил мою работу со следующей строкой

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

где 1 - индекс элемента, который вы не хотите отображать.

ArchbishopLolly
источник
Это удаляет опцию. Вопрос в том, чтобы отключить эту опцию (оставить ее серым).
Коен
0

Преобразуйте один элемент, который вы хотите отключить, в пустой <optgroup>.

Плюсы:

  • Это может быть сделано в hook_form_alterили непосредственно при создании пользовательской формы, нет необходимости реализовывать theme_selectфункцию в вашей теме.

Минусы:

  • Нет способа представить value='title'атрибут, связанный с оригиналом, <option>в получающемся DOM.
  • YMMV, если вы пытаетесь отключить опцию, которая уже относится к optgroup. Вложенные optgroups могут действительно работать, но это не проверено и не подтверждено.

Реализация:

Optgroups в Drupal обозначаются внутри #optionsмассива как любые key => valueпары, где само значение является массивом.

Таким образом, из примера в OP мы бы переместили значение, 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.'),
);

Получившийся HTML будет выглядеть примерно так:

<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

Для отключения всего поля используйте

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

Чтобы отключить параметр в поле выбора, используйте

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

где:

['field_name'] - это имя вашего поля

[1] - индекс опции в списке

Рони Самуэль
источник