web-dev-qa-db-ja.com

フォーム送信ハンドラーのデータを変更する

私はこのようなフォーム変更ハンドラーを持っています。

_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 ['values'] ['submitted_tree'] ['url']を割り当ててみました。このurlフィールドは3番目のフィールドであり、追跡する必要がありますが、データが配列に格納されている場合でも(dpm()を使用して確認)、フォームの結果には、空白のurlフィールドがあります。

このため、私は Webforms in Drupal 7.を使用しています。

私の質問は、送信されたデータをどのように変更できますか?送信ハンドラの場合、フォームの状態が参照によって渡されないようです。

3
Luis Masuelli

あなたは参照によって受け入れ_$form_state_なので、関数がスコープを失うと、加えた変更は確実に入力変数に永続化されます。変数/呼び出し関数は、それがここで参照であるかどうかを制御しません。関数シグネチャは制御します。 FAPIは古い pass-by-reference スタイル(たとえば、廃止予定で削除されたfoo(&$bar))を使用しないため、ユーザーがそれを制御できます。

おそらく、webform送信ハンドラーが実行前に実行されているため、行った変更は、配列に正しく追加されていても、実際には何も使用されません。

これを回避するには、代わりに検証ハンドラを使用します。これはフォームの送信前に実行され、_$form_state['values']_に加えた変更は、Webフォームの送信ハンドラ(および追加の処理が必要な場合は独自のハンドラ)で使用できます。

おそらく、送信ハンドラーとまったく同じコードを使用できると思います。

4
Clive