Drupal 7、Webform 3
Drupal_form_submitを介してプログラムでWebフォームを送信したい。ただし、機能する$ form_state構造体を見つけるのが困難です。 UIを介してWebフォームを送信し、validateコールバック関数の$ form_state変数を調べましたが、それでも機能しません。
私のウェブフォームには、「first_name」という名前のテキストフィールドが1つあります。以下は、テストに使用したコードのスニペットです。実行すると、$ form_errorsはnull
になります。エラーがなければ、コードは機能したはずです。しかし、Webフォームの結果を確認すると、提出物がないと表示されています。
<?php
$form_id = 'webform_client_form_55805';
$form_state = array(
'values' => array(
'submitted' => array(
'first_name' => 'David',
),
),
);
$node = node_load(55805);
$submission = (object) array();
drupal_form_submit($form_id, $form_state, $node, $submission);
$form_errors = form_get_errors();
?>
私はそれを間違っていますか?もっと良い方法はありますか?代わりに webform_client_form_submit を使用する必要がありますか?
私はこのQ&Aを見ましたが、それは私にとってはうまくいかず、少し複雑に思われます: Ajaxを使用してwebformをプログラムで送信する方法?
PhpStormとxdebugを使用してform.incコードをステップ実行し、最終的に$ form_stateの正しい構造を見つけました。私が投稿した構造は近いですが、'op' => t('Submit')
を追加するために必要なだけでした。以下の最終的な作業コードを参照してください。
私の質問に答えるには:
<?php
$form_id = 'webform_client_form_55805';
$form_state = array(
'values' => array(
'submitted' => array(
'first_name' => 'David',
),
'op' => t('Submit'),
),
);
$node = node_load(55805);
$submission = (object) array();
drupal_form_submit($form_id, $form_state, $node, $submission);
$form_errors = form_get_errors();
?>
上記のDavidの回答を少し修正する必要がありました(十分なポイントがないため、コメントできません)。 opが送信ボタンのテキストと一致しなかったため、データは送信されませんでした。ノードに添付されたWebフォーム情報からそれを読み取ることで修正しました。
<?php
$node = node_load(55805);
$form_id = 'webform_client_form_55805';
$form_state = array(
'values' => array(
'submitted' => array(
'first_name' => 'David',
),
'op' => empty($node->webform['submit_text']) ? t('Submit') : t($node->webform['submit_text']),
),
);
$submission = (object) array();
drupal_form_submit($form_id, $form_state, $node, $submission);
$form_errors = form_get_errors();
?>