автоматическое заполнение формы как ограничить результаты предыдущим выпадающим списком


Привет, у меня есть поле выбора в форме, содержащей страны. Следующее поле представляет собой текстовое поле, которое управляется функцией автозаполнения. Функция автозаполнения возвращает города из таблицы базы данных.

Я хочу ограничить города, которые будет возвращать автозаполнение, на основе значения страны, выбранного в раскрывающемся списке. Как мне это сделать?

Если это поможет, вот моя форма

 $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);
}

Большое спасибо Саймон

Author: PrestonDocks, 2012-09-22

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;
}
  1. Я добавил элемент Ajax в раскрывающийся список "Страна", указав ему искать <div> с идентификатором, равным "haofficename", и вызывая функцию с именем update_officename_autocomplete().

  2. Я использовал элемент префикса и суффикса в элементе имени офиса, чтобы обернуть его в элемент <div> с идентификатором haofficename, который будет искать Ajax.

  3. update_officename_autocomplete() просто возвращает измененный элемент названия офиса в форме. если вы заглянете внутрь оператора if, вы увидите, что он добавляется к свойству #autocomplete_path. Поэтому мне пришлось добавить второй параметр в мою функцию автозаполнения. Эта функция теперь принимает $country и $officename.

    Функция location_autocomplete($страна,$строка){ $совпадения =массив(); $результат = db_query ("выберите имя офиса из {holidayautos_country_list}, где имя офиса, например: ключевое слово и страна = :ограничение по стране 0, 10", массив (':ключевое слово'=>"%". db_like(строка $). "%", ':страна'=> $страна)); для каждого ($результат в виде $строки) { $совпадения[$строка->имя офиса] =check_plain($строка->имя офиса); } вывод drupal_json_output ($совпадения); }

Это работает как заклинание.

 1
Author: PrestonDocks, 2017-04-13 12:47:09