Всем привет!
Вешаю на select ahah-обработчик, но когда просматриваю в этой функции массив $_POST - там есть совершенно все элементы формы, кроме селекта А мне как раз на ЕГО основе нужно немного с формой поиграться и обновить её.
Как же мне достать значение селекта, почему так происходит?
Комментарии
в тему вызываются телепаты
$items = array();
$items['test/js'] = array(
'page callback' => 'test_js',
'access callback' => TRUE,
'type' => MENU_CALLBACK,
);
...
'event' => 'change',
'path' => 'test/js',
'wrapper' => 'test',
'method' => 'replace',
'effect' => 'fade',
);
$form_state = array('submitted' => FALSE);
if (!$form = form_get_cache($_POST['form_build_id'], $form_state)) {
drupal_json(array('status' => FALSE, 'data' => ''));
exit;
}
$form['test'] = array(
'#type' => 'textfield',
'#title' => 'Тест',
);
form_set_cache($_POST['form_build_id'], $form, $form_state);
$form += array(
'#post' => $_POST,
'#programmed' => FALSE,
);
$form = form_builder($form['form_id']['#value'], $form, $form_state);
$output = theme('status_messages') . drupal_render($form['test']);
drupal_json(array('status' => TRUE, 'data' => $output));
}
В этой функции, в массиве $_POST отсутствует select со своим значением. Если ahah-обработчик вешать на другой элемент - селект есть, а этого элемента опять же нет.
http://drupal.org/node/331941
не правильный третий шаг, отсутствуют 5, 6, 7 и 8 шаг
и значение селекта должно быть не в посте, а в $form_state
xxandeadxx вы скорее всего не совсем правильно поняли ТС.
Действительно в ajax вызове передается информация о всех элементах формы, кроме элемента инициализируещего ahah запрос. В случае ТС на сервер не будет передаваться информация о элементе 'select'. Опчему это происходит не было время разобраться, возможно на drupal.org есть issue по этому поводу.
ну как это не передаётся, пруф - http://d6.drupalexamples.info/examples/ahah_example/autocheckboxes
Прередается)
Возможно у меня были проблемы при добавлении ahah на CCK Node reference поле. Но как ни странно перемееные в POST запросе передаваемые на сервер, не включали в себе, данные об этом поле.
Я смотрел эту статью, но почему-то подумал, что она мне не поможет. Ок, сделал всё это:
$form_state = array('storage' => NULL, 'submitted' => FALSE);
if (!$form = form_get_cache($_POST['form_build_id'], $form_state)) {
drupal_json(array('status' => FALSE, 'data' => ''));
exit;
}
$args = $form['#parameters'];
$form_id = array_shift($args);
$form['#post'] = $_POST;
$form['#redirect'] = FALSE;
$form['#programmed'] = FALSE;
$form_state['post'] = $_POST;
drupal_process_form($form_id, $form, $form_state);
$form = drupal_rebuild_form($form_id, $form_state, $args, $form_build_id);
$form['test'] = array(
'#type' => 'textfield',
'#title' => 'Тест',
);
$output = theme('status_messages') . drupal_render($form['test']);
drupal_json(array('status' => TRUE, 'data' => $output));
}
В итоге за счёт drupal_process_form форма постоянно проверяются на валидность, выводится море ошибок. А если все поля будут заполнены - форма отправится. Мне это не нужно. Второй момент - то, что я впишу в добавленное поле, после повторного ahah-запроса исчезает. И, наконец, третье - опять в $form_state и в $_POST нет моего селекта! Каждый $form_state проверил с помощью devel.
Фантастика... Например, в друпале такой пример, что подходит мне, есть. Это модуль book. Поле выбора подшивки. Функция book_form_update в book.pages.inc. Там всё сделано по тому же принципу, что я пишу в начале этой темы. И при этом работает!
$bid = $_POST['book']['bid'];
Они спокойно берут значение селекта и работают с ним! У меня используется селект от модуля таксономии. И при смене термина почему-то не могу отловить на сервере значение выбранного tid, его нет...
В чём же дело, почему где-то работает, а у нас - нет
Одну минутку... А вот хрен оно работает! Только сейчас обратил внимание! Выбираю подшивку в book, внутри неё есть другие. А поле для выбора родительского пункта при этом не появляется! А оно точно есть. При редактировании ноды-то появляется!
Выходит, баг в друпале? И как тогда быть? Мне позарез нужен этот функционал
Даже пробую модуль ahah_helper - аналогичная ситуация Что за хрень такая...
а если не ahah , а просто ajax?
?
повесить на селект ява-событие с обработчиком, который будет слать на адрес, определенный в хуке меню, пост-гет данные, получать ответ и выполнять изменения страницы..
при помощи jquery - это десяток строк ява-кода
Это, конечно, крайний вариант. Просто есть уже встроенное решение, хочется не изобретать велосипед, а тут грабли какие-то
Всё, мужики, разобрался. Я у мультигруппового cck-поля заансетил по своим нуждам префикс и суффикс, из-за них и была такая мура... Закомментировал 2 эти строки и таксономия в POST появилась. То есть, самый первый мой код в теме совершенно рабочий.
Завтра ещё поразбираюсь, точно ли всё так выходит, уже поздно.
Локализовал проблему. Всё дело в долбанном элементе формы file!!! У меня среди них был один - от cck. Как только убрал - селект стал появляться!
Я провёл эксперимент и создал просто селект с ahah + элемент формы file. Так и есть - фигня эта повторилась. Селекта в POST нет!
А вот почему сообщением выше типа решил проблему? Я обнаружил, что если для элемента формы file впереди поставить просто закрывающий div, то всё станет нормально... Вывод, значит, один - где-то внутри друпала ломается валидация кода. Именно на месте элемента file.
Глубже ещё не докопался, проблема пока остаётся открытой... Решения я не нашёл. Не могу же я ставить закрывающий див, тем самым убиваая вёрстку сайта...
Неожиданный поворот событий... Нашёл сейчас вот такую тему:
http://drupal.org/node/806500
В итоге всё получается до ужаса просто! Во время ahah-запроса элемент ведь становится disabled, и его значение на сервер не передаётся. Поэтому, селект мой и отсутствовал в POST!
Но. Я до сих пор не смог догнать: почему с элементом file на форме так и есть, а без него всё работает... Загадка.
А так пришлось лезть в ahah.js и убирать там блокирование элемента. Впрочем, у меня стоит jquery_update, я применил для него вот этот патч:
http://drupal.org/node/806500#comment-4004316
Всё работает.
P. S. Пипец, два дня коту под хвост, столько времени в трубу :((((
Столкнулся с подобной проблемой.
Появилось более красивое решение - обновление jquery.form.js до последней версии
http://drupal.org/node/806500#comment-5076470