Изменение данных в обработчике отправки формы
У меня есть обработчик изменения формы, подобный этому.
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.
Мой вопрос таков: как я могу изменить представленные данные? Похоже, что - для обработчика отправки - состояние формы не передается по ссылке.
1 answers
Ты принимаешь $form_state
по ссылке, поэтому внесенные вами изменения определенно сохранятся во входящей переменной, когда ваша функция потеряет область действия. Переменная/вызывающая функция не определяет, является ли она здесь ссылкой, это делает ваша подпись функции. FAPI не использует старый стиль передачи по ссылке (например, foo(&$bar)
, который устарел и удален), поэтому вы контролируете это.
Скорее всего, обработчики отправки веб-форм запущены раньше ваших, поэтому внесенные вами изменения на самом деле ничем не используются, несмотря на то, что они были правильно добавлены в массив.
Чтобы обойти это, просто используйте вместо этого обработчик проверки. Это будет выполняться до отправки формы, и изменения, внесенные вами в $form_state['values']
, будут доступны обработчикам отправки веб-формы (а также вашим собственным, если вам потребуется выполнить дополнительную обработку).
Я думаю, что вы, вероятно, можете использовать точно такой же код, как и в вашем обработчике отправки.