web-dev-qa-db-ja.com

マルチページWebフォームの前のステップの値にアクセスするにはどうすればよいですか?

私はWebform 4を使用しています。バージョン3で使用されていたような独自の%トークンではなく、Drupalのトークンを使用しています。

複数ページのサブスクリプションフォームを作成したいとします。最初のページにはメールフィールドのみがあります。 2つ目は、次のようなマークアップが必要です。

[email protected]の詳細なサブスクリプション構成

同様に、今後のフィールドのデフォルト値としてそれらを使用できるようにしたいと思います。たとえば、ユーザーに請求先住所を尋ね、次に配送先住所を求めます。

そのためのトークンはありますか?私が今やったことは:

function mymodule_token_info() {
  $type = array(
    'name' => t('Webform submitted values'),
    'description' => t('Tokens related to $_POST[\'submitted\'].'),
  );
  $tokens = array();
  if(isset($_POST['submitted'])) {
    foreach($_POST['submitted'] as $key => $val) { //discard $val now
      $tokens[$key] = array(
        'name' => $key,
        'description' => "\$_POST['submitted']['$key']",
      );
    }
  }
  return array(
    'types' => array('webform_submitted' => $type),
    'tokens' => array('webform_submitted' => $tokens),
  );
}

function mymodule_tokens($type, $tokens, $data, $options) {
  if($type == 'webform_submitted') {
    $replacements = array();
    foreach ($tokens as $name => $original) {
      //Hide errors below. We don't care if it really exists yet. If empty, so be it.
      @$replacements[$original] = (string)$_POST['submitted'][$name];
    }
    return $replacements;
  }
}

機能しますが、1ステップ前の値しか表示されないため、複数のステップにわたって電子メールの値を伝達するために、非表示フィールドを使用するダーティトリックが必要です。私は認めます-それはただ速くて汚かったです。 built-inそれを行う方法、または適切に維持された貢献このためのモジュールはありますか?または、このコードを$_POST['submitted']とは独立して機能させ、コードに多くのステップで値を伝え、編集ウィンドウのトークンリストに(利用可能なWebform要素から)トークンを表示させる方法はありますか?

12
Mołot

これはあなたのタイトルの質問には答えませんが、ユースケースを読むと Profile2 が書かれたシナリオのように聞こえます。 関連するスタックオーバーフローの投稿

Webフォームは調査などに最適ですが、「将来のフィールドのデフォルト値として使用できるようにする」には、ユーザーに接続する必要があります。そのため、ユーザーの履歴Webフォーム送信をフェッチして、請求先住所のフォーム変更でこれらの値をプルするためのカスタムコードがさらに必要になります。 Profile(2)は、これを簡単にするために正確に記述されています。

また、これを他の誰かに渡す前に行う直前のカスタムコーディングが少なければ少ないほど、他の誰かが更新しようとするときに彼らの心を痛めることは少なくなります。

1
DeveloperWeeks

変数をグローバルとして宣言し、form_state [values] []をそれらに渡します。これは、ctoolsモーダルポップアップを備えたマルチステージフォームで機能しました。

0
ana