В списке выбора 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 Я получаю следующий назад:

dpm

Обновление 2

Ниже показано, что делает разработчик темы:

theme devel

Обновление 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 должен работать. Я создал мини-модуль только с этим, и получаю те же результаты.

6 голосов | спросил user13134 22 PMpMon, 22 Apr 2013 17:41:56 +040041Monday 2013, 17:41:56

3 ответа


6

Похоже, что вы не используете свою форму с помощью 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() , чтобы построить вывод для формы:)

ответил Clive 23 PMpTue, 23 Apr 2013 13:49:29 +040049Tuesday 2013, 13:49:29
2

Вам нужно добавить свойство «#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--',
  );
ответил Jayendra Kainthola 22 PMpMon, 22 Apr 2013 23:17:21 +040017Monday 2013, 23:17:21
1

Я скопировал ваш код в свой собственный модуль, и он работает.

По умолчанию (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,
);
ответил rooby 22 PMpMon, 22 Apr 2013 19:52:20 +040052Monday 2013, 19:52:20

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132