web-dev-qa-db-ja.com

Webformを使用して$ form_stateから値を取得する方法

私は送信にwebformを使用し、GETパラメータをシミュレートしようとしています(ただし、デフォルトではPOSTを使用しています)。

これがhook_form_alter()を実装する私のコードです:

function mymodule_form_alter(&$form, &$form_state, $form_id) {
  $nid = 2;
  if ($form_id == 'webform_client_form_' . $nid) {
    $option['query'] = array(
        'name' => $form_state['values']['name'], 
        'email' => $form_state['values']['email'], 
        'gender' => $form_state['values']['gender'], 
        'birthday' => $form_state['values']['birthday'], 
        );
    $form['#action'] = url('path/to/myViewsPage', $option);
  }

上記のコードは私を連れて行く必要があります

'path/to/myViewsPage?name=tom&[email protected]&gender=male&birthday=12/21/2013'

しかし、私は次のエラーを得ました:

未定義のインデックス:mymodule_form_alter()の値

$form_state['values']の定義場所を誰かに教えてもらえますか? Webformで事前定義されていませんか?

3
movila

Form_alter()で、新しい送信ハンドラを追加する必要があります。

function mymodule_form_alter($form, &$form_state, $form_id) {
 $nid = 2;
  if ($form_id == 'webform_client_form_' . $nid) {
    $form['#submit'][] = 'your_submit_handler';
  }
 }

Your_submit_handler()では、これらの値が利用可能になります

function your_submit_handler(&$form, &$form_state) {
   $option['query'] = array(
    'name' => $form_state['values']['name'], 
    'email' => $form_state['values']['email'], 
    'gender' => $form_state['values']['gender'], 
    'birthday' => $form_state['values']['birthday'], 
   );
   $url = url('path/to/myViewsPage', $option);// (valid path or whatever)
   $form_state['redirect'] = $url;
}

保存されているwebformノードを気にする必要はありません。リダイレクトする必要があるだけですよね。これは、デフォルトのWebフォーム送信ハンドラーと一緒に実行されます。

1
Pan Chrono
//  echo"<pre>"; print_r($form_state); die;
/*** here you check all values of webform which is submitted ***/

$fname = $form_state['input']['submitted']['Your_field_ID'];
1
user16119

少しハックですが、$form['#action']でビューへのパスを設定し、フォームをビューに直接投稿した方がいいと思います。次に、ビューページで、必要に応じてコンテキストフィルターで、フォームから投稿された値を取得します。このようにして、送信処理を完全にバイパスし、何も保存されません。

1
enzipher

これを試して:

 $form_state = form_state_defaults();
 $form_build_id = $_POST['form_build_id'];
 // Get the form from the cache.
 $form = form_get_cache($form_build_id, $form_state);

またはフォームidを提供することにより:

クレジット: drupal_get_formでロードされたフォームの$ form_stateをどのようにロードしますか?

// Get the form.
$form = drupal_get_form('my_form_id');
// Get the default form state.
$form_state = form_state_defaults();
// Get the form and form state from the cache for the form you just got.
form_get_cache($form['#build_id'], $form_state);
0
Rafal Enden

Webformには、送信およびすべてにアクセスするための独自のフックがあります。 hook_webform_submission_presave() を使用できます。

データベースに保存する前に、Webフォーム送信を変更します。

パラメータ

$ node:この送信が行われたWebformノード。

$ submission:データベースに保存されようとしているWebform送信。

All Webform Module Hooks を参照してください。

0
niksmac