автоматическое заполнение формы как ограничить результаты предыдущим выпадающим списком
Привет, у меня есть поле выбора в форме, содержащей страны. Следующее поле представляет собой текстовое поле, которое управляется функцией автозаполнения. Функция автозаполнения возвращает города из таблицы базы данных.
Я хочу ограничить города, которые будет возвращать автозаполнение, на основе значения страны, выбранного в раскрывающемся списке. Как мне это сделать?
Если это поможет, вот моя форма
$country_list = _get_country_list();
$form['country'] = array(
'#type'=>'select',
'#title'=>'Select Country',
'#description'=>'Select the country where you want to collect the car',
'#options'=>$country_list,
);
$form['officename'] = array(
'#type'=>'textfield',
'#title'=> t('Location'),
'#default_value'=>$form_state['officename'],
'#size'=>20,
'#maxlength' => 50,
'#description' => t('Select the country where you want to pick up the car'),
'#attributes' => null,
'#required' => TRUE,
'#autocomplete_path'=>'location-autocomplete'
);
$form['submit'] = array(
'#type'=>'submit',
'#value'=>'Search Now',
'#submit'=>array('HolidayAutosXML_carsearch_form_submit'),
);
А вот моя функция автозаполнения. Я хочу ограничить sql с где страна = {страна, выбранная в раскрывающемся списке}
function location_autocomplete($string){
$matches = array();
$result = db_query("select officename from {holidayautos_country_list} where officename like :keyword limit 0, 10", array(':keyword'=>"%" . db_like($string) . "%"));
foreach($result as $row) {
$matches[$row->officename] = check_plain($row->officename);
}
drupal_json_output($matches);
}
Большое спасибо Саймон
1 answers
Используя ссылки, предложенные в Анил Сагар, я собрал это решение с помощью Ajax.
function HolidayAutosXML_carsearch_form($node, &$form_state) {
$country_list = _get_country_list();
$form['country'] = array(
'#type' => 'select',
'#title' => 'Select Country',
'#description' => 'Select the country where you want to collect the car',
'#options' => $country_list,
'#ajax' => array(
'callback' => 'update_officename_autocomplete',
'wrapper' => 'haofficename',
),
);
$form['officename'] = array(
'#type' => 'textfield',
'#title' => t('Location'),
'#default_value' => $form_state['office name'],
'#size' => 20,
'#maxlength' => 50,
'#description' => t('Select the location where you want to pick up the car'),
'#attributes' => NULL,
'#required' => TRUE,
'#autocomplete_path' => 'location-autocomplete',
'#prefix' => '<div id="haofficename">',
'#suffix' => '</div>',
);
if (!empty($form_state['values']['country'])) {
$form['officename']['#autocomplete_path'] = "location-autocomplete/{$form_state['values']['country']}";
}
$form['submit'] = array(
'#type'=>'submit',
'#value'=>'Search Now',
'#submit'=>array('HolidayAutosXML_carsearch_form_submit'),
);
return $form;
}
Я добавил элемент Ajax в раскрывающийся список "Страна", указав ему искать
<div>
с идентификатором, равным "haofficename", и вызывая функцию с именемupdate_officename_autocomplete()
.Я использовал элемент префикса и суффикса в элементе имени офиса, чтобы обернуть его в элемент
<div>
с идентификатором haofficename, который будет искать Ajax.-
update_officename_autocomplete()
просто возвращает измененный элемент названия офиса в форме. если вы заглянете внутрь оператора if, вы увидите, что он добавляется к свойству#autocomplete_path
. Поэтому мне пришлось добавить второй параметр в мою функцию автозаполнения. Эта функция теперь принимает$country
и$officename
.Функция location_autocomplete($страна,$строка){ $совпадения =массив(); $результат = db_query ("выберите имя офиса из {holidayautos_country_list}, где имя офиса, например: ключевое слово и страна = :ограничение по стране 0, 10", массив (':ключевое слово'=>"%". db_like(строка $). "%", ':страна'=> $страна)); для каждого ($результат в виде $строки) { $совпадения[$строка->имя офиса] =check_plain($строка->имя офиса); } вывод drupal_json_output ($совпадения); }
Это работает как заклинание.