Как сделать зависимые селекторы в webforms?

Главные вкладки

Аватар пользователя skotin skotin 5 декабря 2009 в 21:40

Собственно сабж.

Как все же сделать зависимый селект в webforms. Чтобы выбираешь опция из селектора, а следующий селектор наполнялся опциями в зависимости от выбора первого.

Комментарии

Аватар пользователя Лампочка Лампочка 5 декабря 2009 в 23:38

Вот это может помочь, но я не поняла, как им пользоваться. Оно добавляет в вебформ новый компонент dynamicselect, но никаких настроек не дает, и сам материал не показывается (выдается ошибка)
http://irolo.net/drupal_webform_and_dynamic_checkboxes

Аватар пользователя Лампочка Лампочка 6 декабря 2009 в 0:11

Вот здесь в конце что-то похожее на правду
http://drupal.org/node/151603

У меня получилось использовать патч и модуль, приведенные в конце - они дают возможность вставки в селект бокс названий нод определенного типа. Это мне тоже надо было. Теперь как бы сделать, чтобы второй селект автоматически составлялся из названий нод, подключенных к выбранной ноде в первом селекте с помощью Noderefference. Тогда все будет шоколадно. Если у вас получится сделать такой джаваскрипт - покажите, пожалуйста.

Аватар пользователя skotin skotin 6 декабря 2009 в 0:27

"сам материал не показывается (выдается ошибка)"

Там функция неправильно написана "_webform_filtervalues", а нужно _webform_filter_values

Аватар пользователя Лампочка Лампочка 6 декабря 2009 в 0:41

Вопрос, как вообще передать значение, выбранное в первом селекте во второй? Чисто теоретически, в простом рукописном коде?

Аватар пользователя skotin skotin 6 декабря 2009 в 0:56

Джава скриптом по id вытащить выбранное потом сгенерировать опции второго селектора ( с базы или просто из массива) и скриптом засунуть обратно в форму. Тут только джаваскрипт, чтоб не надо было ничего там еще нажимать кроме как выбор первого селектора. Но там с webform надо посмотреть как это сделать правильно, чтобы при submit у сгенеренных option были правильные value иначе в статистику может не попасть... Это надо еще смотреть.

Аватар пользователя Лампочка Лампочка 7 декабря 2009 в 0:24

Не, это был патч для версии, которую уже невозможно скачать...

skotin, вы нашли что-то? :(((

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

Аватар пользователя skotin skotin 8 декабря 2009 в 0:58

Ну я короче все сделал грязно.

Я создаю селекторы из базы как сказано в http://irolo.net/drupal_webform_and_dynamic_checkboxes

Потом присоединяю к форме джаваскрипт http://drupal.org/node/342183 Ну и там ставлю скрипт.

Поскольку нет способа через JS скрыть options из selecta ( можно только удалить, но я бы не хотел из скрипта потом снова генерить опции... потому я хотел чтобы был display=none.) Я плюнул и второй селектор сделал как радиокнопки. У меня там мало опций и мне в этом плане проще. И вобщем получилось. Но решение грязное и не интересное.

Аватар пользователя skotin skotin 8 декабря 2009 в 23:09

Да опции беру из базы. Ну просто так из любви к искусству. Но понятно, что можно прямо в select.inc создать массив.

Итак, скрипт с сайта http://irolo.net/drupal_webform_and_dynamic_checkboxes. Создал свой файл regionselect.inc. Переписал слегка подключив к базе.

..........................................
$form_item['#type'] = 'select';

..........................................

function _regionselect_load_options($default_value) {

$options = array();

$query = "select r.name from {region} r";

$results = db_query($query);

$options['']=$default_value;
while ($result = db_fetch_array($results)) {
$option = $result['name'];
$options[$result['name']] = $option;
} // end while
return $options;

} // end function _dynamic_select_load_options()

Потом создал и второй селектор unitselect.inc

................................
$form_item['#type'] = 'radios';
................................

function _unitselect_load_options($default_value) {

$options = array();

$query = "select u.name as unit, r.name as region from {unit} u left join {region} r on u.region=r.id";

$results = db_query($query);
// $options['']=$default_value;
while ($result = db_fetch_array($results)) {
$option = $result['unit'];
$options[$result['region'].':'.$result['unit']] = $option;
} // end while

return $options;

} // end function _dynamic_select_load_options()

Далее подключаем джава скрипт как указано http://drupal.org/node/342183

Ну и там говорю:
$(document).ready(function () {
$("#webform-component-division").hide();
$("#edit-submitted-region-fs-regionselect").change(
function( objEvent ){
$("#webform-component-division").show();
var region=$(this).val();
$("#webform-component-unit").find("input").each(function (){$(this).show();$(this).parent().show();});

$("#webform-component-unit").find("input").each(
function (){
if(this.value!=''){
var region_curr=this.value.split(":")[0];
if(region!=region_curr){
$(this).hide();
$(this).parent().hide();

}
}
}
);
});
});

Ну и оно работает. Можно поставить вместо радиобатонов, селектор... $form_item['#type'] = 'select'; Но тогда надо будет, что-то сделать с $(this).hide(); Только в FF option селектора принимают display: none. Можно тут дать $(this).remove(), но тогда надо будет скриптом уметь наполнять селекторы из базы, а можно заранее залить методом data() от jquery массив и извлекать оттуда.
Как-то так.

Аватар пользователя Лампочка Лампочка 9 декабря 2009 в 14:23

Ой, спасибо, попробую сегодня.

Только один вопрос: я вначале воспользовалась не файлом .inc (как в том примере с чекбоксами), а модулем динамик селект и патчем (http://drupal.org/node/151603#comment-2305370), который просто позволяет в вебформ вставлять массив из базы с помощью пхп (без всяких дополнений). Ты думаешь, можно тем же джаваскриптом связать два селекта, или для этого нужно было что-то особенное, что находится в файле .inc?

Аватар пользователя skotin skotin 10 декабря 2009 в 17:40

Жава скрипту совсем пофигу как изначально были составлены эти селекторы. Без скрипта они просто будут двумя селекторами где будут все опции сразу. А скрипт просто убирает с глаз не нужные. Отсюда есть и проблема- - при перезагрузке могут мелькать и потом исчезать. Поэтому решение херовое. У меня просто мало опций во втором селекторе и не особо видно, но если уж заморачиваться то надо опции сначала вытаскивать в скрипт и потом там запоминать и уже строить селектор полностью, а не как у меня "скрывать опции". Я все же не перестаю удивляться, то такой обыкновенный функционал не расшарили настоящие программеры, мастера.

Аватар пользователя Лампочка Лампочка 13 декабря 2009 в 10:36

Сделала все, как у тебя, пыталась вставить селектор вместо радиоз, начал сильно-сильно глючить. Пришлось тоже радиоз делать. Но все работает отлично, спасибо огромное. Если найду какое-то более приемлемое решение - выложу сюда.

Аватар пользователя retuam retuam 11 августа 2010 в 23:44

Для webforms можно по id формы перестроить ее элементы с нужными для вас опциями и навесить обработчик AHAH. Но, ИМХО, проще составить свою собственную форму и не пользоваться модулем webforms в этих случаях.