Вимкніть опцію для вибору поля форми


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

Єдиний спосіб відключити один із варіантів поля форми "select" - це перекрити функцію theme_select (), що реалізує mock_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, я б скоріше розглядав можливість реагування на зачіпку_form_alter () для видалення параметра з потрібного поля форми.


6

Вимкнути параметр може бути складно домогтися ( Використання form_alter для відключення ONE опції поля вибору ), тому я рекомендую вам розглянути оптигрупи як альтернативу. Документація 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 .

Редагувати : щоб уточнити, це альтернатива, а не пряма відповідь.


Питання полягає у відключенні одного з варіантів, а не в їх групуванні.
kiamlaluno

Я це зрозумів, але подумав, що optgroup - це хороша альтернатива.
тостінні

блискучий! Це саме те, що я шукав, дякую !!!
uwe

3

Я не знаю і не зміг знайти жодного способу відключити окремий варіант. Схоже, вони намагаються ввести щось подібне в Drupal. Можливо, якісь альтернативи, може те, що ви хочете, зробити з css ?:

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

Або, якщо ви не хочете, щоб значення відображалися взагалі, ви можете скасувати їх

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

3

Я працював із наступним рядком

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

де 1 - індекс елемента, який ви не бажаєте відображати.


Це вилучає варіант. Питання в тому, щоб вимкнути цю опцію (залишити її відображеною в сірій формі).
Коен

0

Перетворіть один-єдиний елемент, який ви хочете відключити, у порожній <optgroup>.

Плюси:

  • Це можна зробити в hook_form_alterабо безпосередньо під час створення власної власної форми, немає необхідності реалізовувати theme_selectфункцію у вашій темі.

Мінуси:

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

Впровадження:

Оптигрупи в 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]);

де:

['ім'я_поля'] - це ім’я вашого поля

[1] - індекс опції у списку

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.