Динамический список выбора в форме (зависимый выпадающий список)

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

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

Я был бы очень благодарен за любые указатели, как за лучший способ (простейший?), чтобы обойти это, или за любые полезные ресурсы в Интернете, которые помогут.

27 голосов | спросил Ben 28 PM00000020000001631 2011, 14:08:16

5 ответов


26

Вы можете использовать Ajax для этого. У Drupal 7 есть хорошая поддержка Ajax. В вашем первом списке выбора (городе) вам нужно будет добавить информацию Ajax. Затем второй список выбора может быть заполнен на основе информации в первой. Вы также можете даже скрыть второй список выбора до тех пор, пока не будет выбран вариант в первом, и я объясню, как это сделать немного. Во-первых, чтобы настроить базовую форму:

  $ form ['city'] = массив (
  '#type' => 'Выбрать',
  '#title' => т ( 'Город'),
  '#options' => $ вариантов,
  '#ajax' => массив (
    'event' => 'изменение',
    'wrapper' => «Эскадрон-обертка»,
    'callback' => 'Mymodule_ajax_callback',
    'method' => «Заменить»,
  ),
);
$ form ['squadron_wrapper'] = array ('# prefix' => '<div class = "squadron-wrapper">', '#suffix' => '</div>');
$ form ['squadron_wrapper'] ['squadron'] = массив (
  '#type' => 'Выбрать',
  '#title' => т ( 'Эскадрон'),
  '#options' => $ squadron_options,
);
 

Это просто базовая настройка элементов. Теперь вам понадобится способ определить, какие варианты должны идти в эскадрилье. Сначала вам нужно сделать свой обратный вызов Ajax указанным в списке выбора «город». В большинстве случаев вы можете просто вернуть элемент, который обертывает элемент ajax, в этом случае $ form.

  function mymodule_ajax_callback ($ form, $ form_state) {
  return $ form;
}
 

Теперь, когда изменяется список избранных «городов», он перестроит часть обертки эскадрильи формы. Теперь значение вашего города будет в $ form_state ['values']. Таким образом, когда форма перестраивается, нам нужно определить, какие опции следует предоставить списку выбора, основанному на значении «город».

  //Получите значение поля «город».
$ city = isset ($ form_state ['values'] ['city'])? $ form_state ['values'] ['city']: 'default';
switch ($ city) {
  case 'default':
    //Установите параметры по умолчанию.
    ломать;
  дело «losangeles»:
    //Настройте $ squadron_options для los angeles.
    ломать;
}

//Если вы хотите скрыть список выбора эскадрильи, пока город не станет
//выбрано, вы можете сделать другое условное.
if ($ city! == 'default') {
  $ form ['squadron_wrapper'] ['squadron'] = массив (
    '#type' => 'Выбрать',
    '#title' => т ( 'Эскадрон'),
    '#options' => $ squadron_options,
  );
}
 
ответил jordojuice 28 PM00000030000002631 2011, 15:25:26
11

Большое спасибо 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 ('обнаружен незаконный выбор. Обратитесь к администратору сайта.'));

Последний код, который я использовал, был:

  & л;? PHP

function sappers_squadron_form_work_history_node_form_alter (& amp; $ form, & amp; $ form_state) {
        //echo '<pre>';
        //print_r ($ form);
        //echo '</pre>';

        $ squadron_options = array ();

        if (isset ($ form ['field_wkhist_city'] ['und'] ['# default_value'] [0])) {
            $ city = $ form ['field_wkhist_city'] ['und'] ['# default_value'] [0];
        }
        else {
            $ city = 0;
        }

        $ squadron_options = sappers_squadron_squadrons ($ city);

        $ form ['field_wkhist_city'] ['und'] ['# ajax'] = массив (
            'event' => 'изменение',
            'wrapper' => «Эскадрон-обертка»,
            'callback' => 'Sappers_squadron_ajax_callback',
            'method' => «Заменить»,
        );

        $ form ['field_squadron'] ['und'] ['# prefix'] = '<div id = "squadron-wrapper">';
        $ form ['field_squadron'] ['und'] ['# suffix'] = '</div>';
        $ form ['field_squadron'] ['und'] ['# options'] = $ squadron_options;
}


function sappers_squadron_ajax_callback ($ form, $ form_state) {
    $ city = $ form ['field_wkhist_city'] ['und'] ['# value'];

    $ form ['field_squadron'] ['und'] ['# options'] = sappers_squadron_squadrons ($ city);

    return $ form ['field_squadron'];
}


функция sappers_squadron_squadrons ($ city) {
    $ nodes = array ();

    $ select = db_query ("SELECT node.title AS node_title, node.nid AS nid FROM {node} node INNER JOIN {taxonomy_index} taxonomy_index ON node.nid = taxonomy_index.nid WHERE (((node.status = '1') AND (node.type IN ('squadron')) AND (taxonomy_index.tid = $ city))) ORDER BY node_title ASC ");

    $ узлы [] = "";

    foreach ($ select as $ node) {
            $ nodes [$ node-> nid] = $ node-> node_title;
    }

    return $ nodes;
}

? & GT;
 
ответил Ben 29 PM00000020000002731 2011, 14:32:27
1

введите строку кода i.e
$ nodes [''] = '- None -'; после

  $ nodes = array ();
 

в ур Функция sappers_squadron_squadrons и это решит вашу ошибку

form_error ($ elements, $ t ('обнаружен незаконный выбор. Обратитесь к администратору сайта.'));

ответил Hacker 23 32011vEurope/Moscow11bEurope/MoscowWed, 23 Nov 2011 11:06:00 +0400 2011, 11:06:00
1

Исправлена ​​причина «Нелегальный выбор был обнаружен. Обратитесь к администратору сайта». что пустая строка со значением 0, добавленным $ nodes [] = ""; , недействительна для поля field_squadron.

См. DANGEROUS_SKIP_CHECK и проверенные флаги устарели в D7 .

После удаления этой строки ошибка исчезла.

ответил Siripong 1 ThuEurope/Moscow2011-12-01T18:49:27+04:00Europe/Moscow12bEurope/MoscowThu, 01 Dec 2011 18:49:27 +0400 2011, 18:49:27
1

Используйте Ограничение параметра поля ссылки

  

Этот модуль позволяет ссылочным полям нескольких типов иметь доступные опции своих виджетов, ограниченные значениями других полей текущего объекта.

ответил Rakesh Nimje 27 Jpm1000000pmWed, 27 Jan 2016 12:17:50 +030016 2016, 12:17:50

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

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

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