マルチページWebformの以前のステップの値にアクセスする方法は?


12

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

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

molot@example.comの詳細なサブスクリプション構成

同様に、請求先住所や配達先住所をユーザーに尋ねるなど、将来のフィールドのデフォルト値として使用できるようにしたいと考えています。

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

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


目的の値を含むページを送信するときにセッション変数を設定できますか?
ダルヴァネン

@Darvanenはおそらくできましたが、値は既にどこかに保存されていますよね?だから私はすでにそこにあるものを使用したいと思います。そして、私がこれを必要とする最初の人であるとはほとんど信じていません。おそらく私はそこにある解決策を見つけることができなかったのでしょうか?
モウォ

私はこの$ form_state [「保存」]についてはよく分からないが、私はあなたがデータにアクセスすることができると思うので、私は彼らが言及した2つのまたは3のポストに$ form_stateに格納されているすべてのデータ[「保存」]を探索し、ソースstackoverflow.com/questions/ 6408170 /…およびdrupal.org/node/717750
バラ

2
@Balaこれは、すべてのフック変更フォームで正常に機能します。しかし、トークンでフォーム状態を取得するにはどうすればよいですか?つまり、2週間でこの仕事を辞めています。このフォームの世話をするガイはコーダーではなく、彼はそれを行うことができますが、それは彼の主要なスキルではありません-だから私はトークンが必要です。
モウォ

うん、将来のニーズに言及したが、完全に忘れてしまった。
バラ

回答:


1

これはタイトルの質問には答えませんが、ユースケースを読むと、Profile2が書かれたシナリオのように聞こえます。 関連するstackoverflow post

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

また、これを他の人に引き渡す前に行う土壇場のカスタムコーディングが少ないほど、他の誰かが更新しようとしているときに心の中であなたを呪うことは少なくなります。


すべてが素晴らしく、このフォームはプロファイルではありませんでした:(つまり、サブスクリプションを要求する人々のためにプロファイルを作成したくありませんでした。法学部で語らすべて:)の場合にも、今私は、全く関係のないユースケースのためにそれを必要としています。
Mołot

さて、あなたの法務チームが言ったことは興味深いです。結論として、ユーザーに接続されたデータをフォームに事前に入力する場合は、ユーザーに接続されたデータが必要です。プロファイルモジュールは、そのデータ機能を維持するための簡単な方法であり、要求した機能に非常に近いものでした。誰もプロファイルを表示できないようにサイトのアクセス許可を変更します。これは、より標準的なコードを使用して、目的のものと同じになりました。モジュールの名前がProfileであるからといって、そのようにデプロイする必要があるわけではありません。
DeveloperWeeks

0

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.