[Решено] AHAH: в $_POST не попадает элемент-инициатор запроса

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

Аватар пользователя CSoft CSoft 23 ноября 2011 в 16:15

Всем привет!

Вешаю на select ahah-обработчик, но когда просматриваю в этой функции массив $_POST - там есть совершенно все элементы формы, кроме селекта Sad А мне как раз на ЕГО основе нужно немного с формой поиграться и обновить её.

Как же мне достать значение селекта, почему так происходит?

Комментарии

Аватар пользователя CSoft CSoft 23 ноября 2011 в 16:35
function test_menu() {
  $items = array();

  $items['test/js'] = array(
    'page callback' => 'test_js',
    'access callback' => TRUE,
    'type' => MENU_CALLBACK,
  );

...

$form['select']['#ahah'] = array(
      'event' => 'change',
      'path' => 'test/js',
      'wrapper' => 'test',
      'method' => 'replace',
      'effect' => 'fade',
    );
function test_js() {
  $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-обработчик вешать на другой элемент - селект есть, а этого элемента опять же нет.

Аватар пользователя rbogdan@drupal.org rbogdan@drupal.org 23 ноября 2011 в 18:46

xxandeadxx вы скорее всего не совсем правильно поняли ТС.

Действительно в ajax вызове передается информация о всех элементах формы, кроме элемента инициализируещего ahah запрос. В случае ТС на сервер не будет передаваться информация о элементе 'select'. Опчему это происходит не было время разобраться, возможно на drupal.org есть issue по этому поводу.

Аватар пользователя rbogdan@drupal.org rbogdan@drupal.org 23 ноября 2011 в 20:02

Прередается)

Возможно у меня были проблемы при добавлении ahah на CCK Node reference поле. Но как ни странно перемееные в POST запросе передаваемые на сервер, не включали в себе, данные об этом поле.

Аватар пользователя CSoft CSoft 23 ноября 2011 в 20:07

"xxandeadxx" wrote:
не правильный третий шаг, отсутствуют 5, 6, 7 и 8 шаг

Я смотрел эту статью, но почему-то подумал, что она мне не поможет. Ок, сделал всё это:

function test_js() {
  $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.

"xxandeadxx" wrote:
ну как это не передаётся, пруф

Фантастика... Например, в друпале такой пример, что подходит мне, есть. Это модуль book. Поле выбора подшивки. Функция book_form_update в book.pages.inc. Там всё сделано по тому же принципу, что я пишу в начале этой темы. И при этом работает!

$bid = $_POST['book']['bid'];

Они спокойно берут значение селекта и работают с ним! У меня используется селект от модуля таксономии. И при смене термина почему-то не могу отловить на сервере значение выбранного tid, его нет...

В чём же дело, почему где-то работает, а у нас - нет Sad

Аватар пользователя CSoft CSoft 24 ноября 2011 в 0:23

"CSoft" wrote:
И при этом работает!

Одну минутку... А вот хрен оно работает! Только сейчас обратил внимание! Выбираю подшивку в book, внутри неё есть другие. А поле для выбора родительского пункта при этом не появляется! А оно точно есть. При редактировании ноды-то появляется!

Выходит, баг в друпале? И как тогда быть? Sad Мне позарез нужен этот функционал Sad

Аватар пользователя Orion76 Orion76 24 ноября 2011 в 2:19

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

при помощи jquery - это десяток строк ява-кода

Аватар пользователя CSoft CSoft 24 ноября 2011 в 2:21

Это, конечно, крайний вариант. Просто есть уже встроенное решение, хочется не изобретать велосипед, а тут грабли какие-то Sad

Аватар пользователя CSoft CSoft 24 ноября 2011 в 5:14

Всё, мужики, разобрался. Я у мультигруппового cck-поля заансетил по своим нуждам префикс и суффикс, из-за них и была такая мура... Закомментировал 2 эти строки и таксономия в POST появилась. То есть, самый первый мой код в теме совершенно рабочий.

Завтра ещё поразбираюсь, точно ли всё так выходит, уже поздно.

Аватар пользователя CSoft CSoft 24 ноября 2011 в 19:09

Локализовал проблему. Всё дело в долбанном элементе формы file!!! У меня среди них был один - от cck. Как только убрал - селект стал появляться!

Я провёл эксперимент и создал просто селект с ahah + элемент формы file. Так и есть - фигня эта повторилась. Селекта в POST нет!

А вот почему сообщением выше типа решил проблему? Я обнаружил, что если для элемента формы file впереди поставить просто закрывающий div, то всё станет нормально... Вывод, значит, один - где-то внутри друпала ломается валидация кода. Именно на месте элемента file.

Глубже ещё не докопался, проблема пока остаётся открытой... Решения я не нашёл. Не могу же я ставить закрывающий див, тем самым убиваая вёрстку сайта...

Аватар пользователя CSoft CSoft 24 ноября 2011 в 21:24

Неожиданный поворот событий... Нашёл сейчас вот такую тему:

http://drupal.org/node/806500

В итоге всё получается до ужаса просто! Во время ahah-запроса элемент ведь становится disabled, и его значение на сервер не передаётся. Поэтому, селект мой и отсутствовал в POST!

Но. Я до сих пор не смог догнать: почему с элементом file на форме так и есть, а без него всё работает... Загадка.

А так пришлось лезть в ahah.js и убирать там блокирование элемента. Впрочем, у меня стоит jquery_update, я применил для него вот этот патч:

http://drupal.org/node/806500#comment-4004316

Всё работает.

P. S. Пипец, два дня коту под хвост, столько времени в трубу :((((