私はこのようなフォーム変更ハンドラーを持っています。
_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.を使用しています。
私の質問は、送信されたデータをどのように変更できますか?送信ハンドラの場合、フォームの状態が参照によって渡されないようです。
あなたは参照によって受け入れ_$form_state
_なので、関数がスコープを失うと、加えた変更は確実に入力変数に永続化されます。変数/呼び出し関数は、それがここで参照であるかどうかを制御しません。関数シグネチャは制御します。 FAPIは古い pass-by-reference スタイル(たとえば、廃止予定で削除されたfoo(&$bar)
)を使用しないため、ユーザーがそれを制御できます。
おそらく、webform送信ハンドラーが実行前に実行されているため、行った変更は、配列に正しく追加されていても、実際には何も使用されません。
これを回避するには、代わりに検証ハンドラを使用します。これはフォームの送信前に実行され、_$form_state['values']
_に加えた変更は、Webフォームの送信ハンドラ(および追加の処理が必要な場合は独自のハンドラ)で使用できます。
おそらく、送信ハンドラーとまったく同じコードを使用できると思います。