Изменение данных в обработчике отправки формы


У меня есть обработчик изменения формы, подобный этому.

function toyotaec_form_webform_client_form_seleccionar_alter(&$form, &$form_state) {
    $concesionarias = concesionarias();

    $form['actions']['submit']['#value'] = 'Enviar';
    $form['submitted']['concesionaria']['#options'] = $concesionarias;
    $form['#validate'][] = 'toyotaec_form_webform_client_form_seleccionar_validate';
    $form['#submit'][] = 'toyotaec_form_webform_client_form_seleccionar_submit';
}

На самом деле, этот код не является hook_form_alter, а функцией, вызываемой фактическим крючком. Крючок вызывает эту функцию, передавая &$form и &$form_state также по ссылке.

После этого у меня есть соответствующие обработчики. Оба обработчика вызываются, как и ожидалось. Обработчик, на котором я хочу сосредоточиться, выглядит следующим образом:

function toyotaec_form_webform_client_form_seleccionar_submit(&$form, &$form_state) {
    $values = $form_state['values']['submitted_tree'];
    $input = &$form['submitted'];

    $concesionaria = trim($values['concesionaria']);
    $redirigir = trim($values['redirigir']);
    $modelo = trim($values['modelo']);

    //obtenemos cual es la concesionaria (por marca, descartamos las ciudades)
    $mconcesionaria = current(explode('-', $concesionaria));

    //las redirecciones diferidas van a tener una salvada incluyendo la url.
    //las redirecciones directas no van a tener salvada.
    $form_state['values']['submitted']['3'] = _redirect_bystore($mconcesionaria, $redirigir, $form_state, $concesionaria, $modelo);
}

Для последней строки я также попытался назначить $form_state['значения']['отправленное дерево']['url']. Это поле url-адреса является 3-м полем, и я должен отслеживать его, но даже когда данные хранятся в массиве (подтверждено с помощью dpm() на нем), результат формы содержит пустое поле URL-адреса .

Для этого я использую Веб-формы в Drupal 7.

Мой вопрос таков: как я могу изменить представленные данные? Похоже, что - для обработчика отправки - состояние формы не передается по ссылке.

Author: Luis Masuelli, 2014-04-03

1 answers

Ты принимаешь $form_state по ссылке, поэтому внесенные вами изменения определенно сохранятся во входящей переменной, когда ваша функция потеряет область действия. Переменная/вызывающая функция не определяет, является ли она здесь ссылкой, это делает ваша подпись функции. FAPI не использует старый стиль передачи по ссылке (например, foo(&$bar), который устарел и удален), поэтому вы контролируете это.

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

Чтобы обойти это, просто используйте вместо этого обработчик проверки. Это будет выполняться до отправки формы, и изменения, внесенные вами в $form_state['values'], будут доступны обработчикам отправки веб-формы (а также вашим собственным, если вам потребуется выполнить дополнительную обработку).

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

 4
Author: Clive, 2014-04-03 17:02:38