Как все же сделать зависимый селект в webforms. Чтобы выбираешь опция из селектора, а следующий селектор наполнялся опциями в зависимости от выбора первого.
Вот это может помочь, но я не поняла, как им пользоваться. Оно добавляет в вебформ новый компонент dynamicselect, но никаких настроек не дает, и сам материал не показывается (выдается ошибка) http://irolo.net/drupal_webform_and_dynamic_checkboxes
У меня получилось использовать патч и модуль, приведенные в конце - они дают возможность вставки в селект бокс названий нод определенного типа. Это мне тоже надо было. Теперь как бы сделать, чтобы второй селект автоматически составлялся из названий нод, подключенных к выбранной ноде в первом селекте с помощью Noderefference. Тогда все будет шоколадно. Если у вас получится сделать такой джаваскрипт - покажите, пожалуйста.
Джава скриптом по id вытащить выбранное потом сгенерировать опции второго селектора ( с базы или просто из массива) и скриптом засунуть обратно в форму. Тут только джаваскрипт, чтоб не надо было ничего там еще нажимать кроме как выбор первого селектора. Но там с webform надо посмотреть как это сделать правильно, чтобы при submit у сгенеренных option были правильные value иначе в статистику может не попасть... Это надо еще смотреть.
Поскольку нет способа через JS скрыть options из selecta ( можно только удалить, но я бы не хотел из скрипта потом снова генерить опции... потому я хотел чтобы был display=none.) Я плюнул и второй селектор сделал как радиокнопки. У меня там мало опций и мне в этом плане проще. И вобщем получилось. Но решение грязное и не интересное.
Ну и там говорю:
$(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 массив и извлекать оттуда.
Как-то так.
Только один вопрос: я вначале воспользовалась не файлом .inc (как в том примере с чекбоксами), а модулем динамик селект и патчем (http://drupal.org/node/151603#comment-2305370), который просто позволяет в вебформ вставлять массив из базы с помощью пхп (без всяких дополнений). Ты думаешь, можно тем же джаваскриптом связать два селекта, или для этого нужно было что-то особенное, что находится в файле .inc?
Жава скрипту совсем пофигу как изначально были составлены эти селекторы. Без скрипта они просто будут двумя селекторами где будут все опции сразу. А скрипт просто убирает с глаз не нужные. Отсюда есть и проблема- - при перезагрузке могут мелькать и потом исчезать. Поэтому решение херовое. У меня просто мало опций во втором селекторе и не особо видно, но если уж заморачиваться то надо опции сначала вытаскивать в скрипт и потом там запоминать и уже строить селектор полностью, а не как у меня "скрывать опции". Я все же не перестаю удивляться, то такой обыкновенный функционал не расшарили настоящие программеры, мастера.
Сделала все, как у тебя, пыталась вставить селектор вместо радиоз, начал сильно-сильно глючить. Пришлось тоже радиоз делать. Но все работает отлично, спасибо огромное. Если найду какое-то более приемлемое решение - выложу сюда.
Для webforms можно по id формы перестроить ее элементы с нужными для вас опциями и навесить обработчик AHAH. Но, ИМХО, проще составить свою собственную форму и не пользоваться модулем webforms в этих случаях.
Комментарии
Присоединяюсь к вопросу, есть ли какие-то модули или патчи для этого. Ничего не могу найти на друпал.орг
Пока что собираю, что может помочь
http://drupal.org/node/342183
Вот чувак с той же проблемой. Не решил
http://drupal.org/node/498286
Ну вот пока думаю делать с JavaScript. Ну может еще заполнять селекторы с базы http://irolo.net/drupal_webform_and_dynamic_checkboxes
Но удивительно, что такие "ходовые штуки", а не проработаны.
Вот это может помочь, но я не поняла, как им пользоваться. Оно добавляет в вебформ новый компонент dynamicselect, но никаких настроек не дает, и сам материал не показывается (выдается ошибка)
http://irolo.net/drupal_webform_and_dynamic_checkboxes
Вот здесь в конце что-то похожее на правду
http://drupal.org/node/151603
У меня получилось использовать патч и модуль, приведенные в конце - они дают возможность вставки в селект бокс названий нод определенного типа. Это мне тоже надо было. Теперь как бы сделать, чтобы второй селект автоматически составлялся из названий нод, подключенных к выбранной ноде в первом селекте с помощью Noderefference. Тогда все будет шоколадно. Если у вас получится сделать такой джаваскрипт - покажите, пожалуйста.
"сам материал не показывается (выдается ошибка)"
Там функция неправильно написана "_webform_filtervalues", а нужно _webform_filter_values
И что, работает то, что нам нужно? Т.е. можно это использовать для двух зависимых селекторов?
Вопрос, как вообще передать значение, выбранное в первом селекте во второй? Чисто теоретически, в простом рукописном коде?
Джава скриптом по id вытащить выбранное потом сгенерировать опции второго селектора ( с базы или просто из массива) и скриптом засунуть обратно в форму. Тут только джаваскрипт, чтоб не надо было ничего там еще нажимать кроме как выбор первого селектора. Но там с webform надо посмотреть как это сделать правильно, чтобы при submit у сгенеренных option были правильные value иначе в статистику может не попасть... Это надо еще смотреть.
Блин, странно, что нигде такое не предсмотрено. Есть модуль Hierarchical Select, но он с вебформом, сволочь, не работает.
Нашла что-то, сейчас буду проверять
http://drupal.org/node/254728
Не, это был патч для версии, которую уже невозможно скачать...
skotin, вы нашли что-то? :(((
Я уже склоняюсь к мысли, чтобы самой написать форму отправки, без всяких вебформовских фич, зато с зависимыми селекторами.
Ну я короче все сделал грязно.
Я создаю селекторы из базы как сказано в http://irolo.net/drupal_webform_and_dynamic_checkboxes
Потом присоединяю к форме джаваскрипт http://drupal.org/node/342183 Ну и там ставлю скрипт.
Поскольку нет способа через JS скрыть options из selecta ( можно только удалить, но я бы не хотел из скрипта потом снова генерить опции... потому я хотел чтобы был display=none.) Я плюнул и второй селектор сделал как радиокнопки. У меня там мало опций и мне в этом плане проще. И вобщем получилось. Но решение грязное и не интересное.
А можно на скрипт посмотреть? У меня как раз с ним главная проблема.
Ты из базы берешь опции?
Да опции беру из базы. Ну просто так из любви к искусству. Но понятно, что можно прямо в 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 массив и извлекать оттуда.
Как-то так.
Ой, спасибо, попробую сегодня.
Только один вопрос: я вначале воспользовалась не файлом .inc (как в том примере с чекбоксами), а модулем динамик селект и патчем (http://drupal.org/node/151603#comment-2305370), который просто позволяет в вебформ вставлять массив из базы с помощью пхп (без всяких дополнений). Ты думаешь, можно тем же джаваскриптом связать два селекта, или для этого нужно было что-то особенное, что находится в файле .inc?
Хотя неважно. Лишь бы работало...
Жава скрипту совсем пофигу как изначально были составлены эти селекторы. Без скрипта они просто будут двумя селекторами где будут все опции сразу. А скрипт просто убирает с глаз не нужные. Отсюда есть и проблема- - при перезагрузке могут мелькать и потом исчезать. Поэтому решение херовое. У меня просто мало опций во втором селекторе и не особо видно, но если уж заморачиваться то надо опции сначала вытаскивать в скрипт и потом там запоминать и уже строить селектор полностью, а не как у меня "скрывать опции". Я все же не перестаю удивляться, то такой обыкновенный функционал не расшарили настоящие программеры, мастера.
Сделала все, как у тебя, пыталась вставить селектор вместо радиоз, начал сильно-сильно глючить. Пришлось тоже радиоз делать. Но все работает отлично, спасибо огромное. Если найду какое-то более приемлемое решение - выложу сюда.
Прошел месяц... Чем закончились мучения?
уже год прошел...
Да... Вопрос оказался решенным с приобретенными знаниями по Forms API.
Может поделитесь решением?
Для webforms можно по id формы перестроить ее элементы с нужными для вас опциями и навесить обработчик AHAH. Но, ИМХО, проще составить свою собственную форму и не пользоваться модулем webforms в этих случаях.
Вот этот модуль поможет webform_conditional