Вы можете использовать Ajax для достижения этой цели. Drupal 7 теперь имеет хорошую поддержку Ajax. В ваш первый список выбора (город) вам нужно добавить информацию Ajax. Затем второй список выбора может быть заполнен на основе информации в первом. Вы также можете даже скрыть второй список выбора до тех пор, пока не будет выбран вариант из первого, и я немного объясню, как это сделать. Во-первых, чтобы настроить основную форму:
$form['city'] = array(
'#type' => 'select',
'#title' => t('City'),
'#options' => $options,
'#ajax' => array(
'event' => 'change',
'wrapper' => 'squadron-wrapper',
'callback' => 'mymodule_ajax_callback',
'method' => 'replace',
),
);
$form['squadron_wrapper'] = array('#prefix' => '<div class="squadron-wrapper">', '#suffix' => '</div>');
$form['squadron_wrapper']['squadron'] = array(
'#type' => 'select',
'#title' => t('Squadron'),
'#options' => $squadron_options,
);
Это просто базовая настройка элементов. Теперь вам нужен способ, чтобы определить, какие варианты должны идти в эскадрилье. Для начала вам нужно сделать так, чтобы ваш обратный вызов Ajax был идентифицирован в списке выбора города. В большинстве случаев вы можете просто вернуть элемент, который оборачивает элемент ajax, в нашем случае это $ form.
function mymodule_ajax_callback($form, $form_state) {
return $form;
}
Теперь, когда список выбора 'city' изменится, он перестроит часть формы, относящуюся к эскадрилье. Ваше значение 'city' теперь будет в $ form_state ['values']. Таким образом, когда форма перестраивается, нам нужно определить, какие опции предоставить списку выбора, основываясь на значении 'city'.
// Get the value of the 'city' field.
$city = isset($form_state['values']['city']) ? $form_state['values']['city'] : 'default';
switch ($city) {
case 'default':
// Set default options.
break;
case 'losangeles':
// Set up $squadron_options for los angeles.
break;
}
// If you want to hide the squadron select list until a city is
// selected then you can do another conditional.
if ($city !== 'default') {
$form['squadron_wrapper']['squadron'] = array(
'#type' => 'select',
'#title' => t('Squadron'),
'#options' => $squadron_options,
);
}
Большое спасибо Jordojuice выше. С его помощью мне удалось найти решение. Я также сослался на пример на http://public-action.org/content/drupal-7-form-api-dependent-lists-and-ajax-form-submission . В конце концов я использовал приведенный ниже код, который работал в пользовательском модуле. По какой-то причине я не смог найти ни одно из своих значений в значениях $ form_state, но смог найти их в $ form. Наконец, когда я тестировал, я получал сообщение об ошибке, что Drupal обнаружил неправильный выбор в раскрывающемся списке. Я обошел это, закомментировав строку 1290 в form.inc:
form_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
Последний код, который я использовал, был:
источник
поставить строку кода т.е.
$nodes[''] = '- None -';
послев ур,
sappers_squadron_squadrons function
и это решит вашу ошибкуform_error($elements, $t('An illegal choice has been detected. Please contact the site administrator.'));
источник
Основная причина: «Обнаружен неправильный выбор. Пожалуйста, свяжитесь с администратором сайта». является то, что пустая строка с добавленным значением 0
$nodes[]="";
недопустима для поля field_squadron.См. Предварительное программирование и разработка PHP , но имейте в виду, что DANGEROUS_SKIP_CHECK и проверенные флаги в D7 устарели .
После того, как я удалил эту строку, ошибка исчезла.
источник
Используйте опциональный модуль ограничения поля Reference
источник