web-dev-qa-db-ja.com

drupal form_submitでプログラムでWebフォームを送信するにはどうすればよいですか?

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をプログラムで送信する方法?

6
David

PhpStormとxdebugを使用してform.incコードをステップ実行し、最終的に$ form_stateの正しい構造を見つけました。私が投稿した構造は近いですが、'op' => t('Submit')を追加するために必要なだけでした。以下の最終的な作業コードを参照してください。

私の質問に答えるには:

  1. はい、 drupal_form_submit を使用する必要があります。
  2. 魔法の$ form_state構造体については、以下のコードを参照してください。
<?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();
?>
5
David

上記の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();
?>
0
tripper54