web-dev-qa-db-ja.com

Webフォームは送信された値とともにデータを追加します

私はWebform 6x 3.11を使用しており、nodeIDを_hidden_key_という非表示フィールドに渡しました。 hook_form_alter()を実装するカスタムモジュールを作成しました。これにより、(送信されるデータとともに)追加データを送信結果に追加しようとしています。

この追加データは、非表示フィールドの値に対して実行されるいくつかの計算に基づいています。つまり、nodeIDに基づいてノードに関する詳細を取得します。これが私が現在持っているものです:

_<?php
    function custom_form_proc_form_alter(&$form, &$form_state, $form_id) {
        if ($form_id == 'webform_client_form_33') {
            $form['#submit'][] = 'custom_form_proc_submit';
        }
    }

    function custom_form_proc_submit($form, &$form_state) {
        $node = node_load($form_state['values']['hidden_key']);
        $pool_title = $node->title;
        $pool_category = $node->field_category[0]['value'];

        // ?????
    }
?>
_

あなたが私の_?????_を見るところは、私が行き詰まっているところです。フォームで送信されるデータに加えて、これらの2つのカスタムフィールドを送信結果に追加して、次のようにします。

氏名:氏と氏
メールアドレス: [email protected]
プールカテゴリ: _$pool_category_
プールタイトル: _$pool_title_
在庫状況:はい

よろしくお願いします!ありがとうございました!

3
maGz

解決済み:大丈夫、少し遊んだ後、これは実際には簡単で予想よりもずっと簡単でした。

最初に、nodeIDを隠しフィールドに渡す代わりに、同様にスタックしているものに対してこのオプションを使用しました。

function custom_form_proc_form_alter(&$form, &$form_state, $form_id) {
    if ($form_id == 'webform_client_form_33') {
        $node = node_load($_GET["n"]);
        $form['submitted']['pool_title']['#default_value'] = $node->title;
    }
}

フォームがレンダリングされると、無効になったテキストフィールドpool_titleは自動的に入力され、結果とともに送信されます。これはこれほど単純ではないことを教えてくれますが、誰かがこのアプローチの問題を予見した場合(他の検証/電子メール送信/データストアなど)

1
maGz

Webフォームの送信には、hook_webform_submission_insert($node, $submission)を使用するのが最適です。
$submission->dataには、フォームコンポーネントIDに対して配置されたすべての送信された値が含まれます。

ユーザー登録フォームとしてWebフォームをどのように配置したか、私の実装を参照してください。

function user_register_webform_submission_insert($node, $submission){
// Load information about form components
$comps = $node->webform['components'];
$fields = array();

//Extract the component info to get form_key=>cid to resolve relation
foreach($comps as $cid => $comp_info){
    $fields[$comp_info['form_key']] = $cid;
}

// Load the submitted data (field values)
$data = $submission->data;

//Prepare a user info
$user = array(
    'mail' => $data[$fields['mail']]['value'][0],
    'name' => $data[$fields['name']]['value'][0],
    'pass' => user_password(8),
    'status' => 1,
    'init' => $data[$fields['mail']]['value'][0],
    'roles' => array(2, 3),
);

$account = user_save(null, $user);  
}
4
Shoaib Nawaz

それを行う最も簡単な方法は、計算値を格納する別の非表示フィールドを作成することだと思います。次に、 hook_webform_submission_presave() を使用して計算を実行し、結果を$submission->data[$cid]に格納できます。ここで、$cidは宛先コンポーネントのコンポーネントIDです。

4
Andy