В списке выбора API формы не отображается пустая опция
Я пытаюсь добавить форму, которая заставит вас выбрать вариант из выпадающего списка. В документации указано:
Если #required имеет значение ИСТИНА и нет #default_value, пустая опция добавляется в элемент управления select, чтобы заставить пользователя активировать выбор.
http://api.drupal.org /api/drupal/developer%21topics%21forms_api_reference.html/7#empty_value
Хорошо, это здорово. Это то, что я хочу. Поэтому у меня есть следующий код, чтобы добавить список выбора в мою форму.
$form['test'] = array(
'#type' => 'select',
'#options' => array (
1 => 'Very poor',
2 => 'Not that bad',
3 => 'Average',
4 => 'Good',
5 => 'Perfect',
),
'#required' => TRUE,
'#title' => 'Rating',
);
Это список выбора, он требуется, и значение по умолчанию отсутствует. Однако я не вижу пустой вариант ...
Что я делаю неправильно?
Обновление
Элемент выше - это единственное, что входит в мой массив. Когда я dpm()
$form
Я получаю следующий назад:
Обновление 2
Ниже показано, что делает разработчик темы:
Обновление 3
Я установил чистый экземпляр drupal 7.22 и установил свой собственный код, и то же самое происходит. Я использовал минимальный профиль. Должно быть, что-то я делаю неправильно, где ...
Обновление 4
Я тестировал полный код в другой среде (7.19), и то же самое происходит. Таким образом, похоже, что есть что-то принципиально неправильное с самими модулями. Попробуем анонимизировать проблему, чтобы опубликовать ее здесь.
Обновление 5
У меня есть два файла в моем модуле.
stack_test.module
<?php
function stack_test_menu(){
$items['stacktest'] = array(
'title' => 'Stack Test',
'page callback' => 'stack_test_form',
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'main-menu',
);
return $items;
}
function stack_test_form(){
$countryList = array (
1 => t('Very poor'),
2 => t('Not that bad'),
3 => t('Average'),
4 => t('Good'),
5 => t('Perfect'),
);
$form['test'] = array(
'#type' => 'select',
'#options' => $countryList,
'#required' => TRUE,
'#title' => 'Rating',
);
return $form;
}
Затем у меня есть файл stack_test.info:
name = Stack Test
description = Test Module
package = Stack Exchange
core = 7.x
files[] = stack_test.module
Обновить 6
Создание списка выбора в типе контента с требуемой валидацией работает как ожидалось, и в верхней части списка отображается «- Выберите значение -».
Обновление 7
Теперь код в обновлении 5 должен работать. Я создал мини-модуль только с этим, и получаю те же результаты.
3 ответа
Похоже, что вы не используете свою форму с помощью drupal_get_form()
..., которая будет учитывать дополнительные функции обработки формы, не запущенные , но вы все равно получите выведенный HTML-элемент на другом конце, поэтому было бы трудно сказать разницу.
Просто измените page callback
для вашего элемента маршрутизатора и добавьте форму в качестве аргументов:
function stack_test_menu(){
$items['stacktest'] = array(
'title' => 'Stack Test',
'page callback' => 'drupal_get_form',
'page arguments' => array('stack_test_form'),
'access callback' => TRUE,
'type' => MENU_NORMAL_ITEM,
'menu_name' => 'main-menu',
);
return $items;
}
Очистите кеши и попробуйте другую тестовую страницу.
То же самое касается исходной проблемы. Форма по существу представляет собой только массив рендеринга, и когда вы возвращаете это непосредственно из обратного вызова страницы, он запускается через drupal_render()
. Эта функция будет делать то, что может оказать элемент формы, и знает, как это сделать в определенной степени, но функции обработки формы добавляют туда много лишних вещей, которые drupal_render()
не будет.
Мораль истории - всегда используйте drupal_get_form()
, чтобы построить вывод для формы:)
Вам нужно добавить свойство «#empty_option» в поле выбора, чтобы установить пустую опцию по умолчанию для selectbox. Он добавит первый вариант для окна выбора.
$form['test'] = array(
'#type' => 'select',
'#options' => array (
1 => 'Very poor',
2 => 'Not that bad',
3 => 'Average',
4 => 'Good',
5 => 'Perfect',
),
'#required' => TRUE,
'#title' => 'Rating',
'#empty_option' => '--Test--',
);
Я скопировал ваш код в свой собственный модуль, и он работает.
По умолчанию (none) значение поля - «Выбрать -».
Есть ли у вас другой код, который может мешать?
Кроме того, tet, который он печатал на экране, обычно должен выполняться через функцию перевода т () .
Вот так:
$form['test'] = array(
'#type' => 'select',
'#title' => t('Rating'),
'#options' => array(
1 => t('Very poor'),
2 => t('Not that bad'),
3 => t('Average'),
4 => t('Good'),
5 => t('Perfect'),
),
'#required' => TRUE,
);