web-dev-qa-db-ja.com

データ比較をWebフォームで送信された値と比較するにはどうすればよいですか?

Rules モジュールでWebフォームを使用しようとしています。

データをWebフォームで送信された値と比較するにはどうすればよいですか?

たとえば、Webフォームに[はい/いいえ]ラジオボタンがある場合、送信された値がyesであることをどのように確認できますか?

新しい条件を追加するとき、私は以下を選択します。

  • データ比較
  • データセレクタ*
  • データ(送信されたWebフォームの値)

特定のform_keyにアクセスしてその値を確認する方法がわかりません。 Dataにはもっと多くの選択肢があるはずだと思います。

6
Ryan Hepple

少なくとも Webform Rules モジュールが有効になっていることを確認してください。それに関するいくつかの詳細(プロジェクトページから):

このモジュールは、Webフォームにルール統合を追加します。

ルールを使用してWebフォームの送信に反応したいが、適切なイベントが見つからなかったことがありますか?

Webformルールを使用すると、Webフォームの送信をルールでキャッチし、それを使用してやりたいことをすべて実行することができます(つまり、ルールで実行できるすべてのルールを実行します)。

また、機能リクエスト「 提出データをルールに公開 」を確認することもできます。以下がその概要です。

現在、送信データは、トークンの置換またはカスタムのphpアクションを除いて、ルールに公開されていません。このパッチは、「ファーストクラス」の方法で提出データを公開します。

問題のステータスは「作業が必要」です。「簡単な」問題ではありません。

作業時間...

まったく同じ問題に 回避策のコメント が含まれています(これは非常に単純なので、すばらしいと思います)、ここから関連する引用を示します。

トークンを使用してルール文字列変数を初期化できます。整数またはブール値が必要な場合は、後でそれを何にでも変換し、それを使用してノードなどをロードできます。

写真は1000ワードを超える価値があります。チェックアウト そのコメントに含まれているスクリーンプリント .

...そしてデモ

このルールを検討してください(ルールのエクスポート形式):

{ "rules_validate_a_component_of_a_submitted_webform" : {
    "LABEL" : "Validate a component of a submitted webform",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "rules_conditional", "webform_rules" ],
    "ON" : { "webform_rules_submit" : [] },
    "IF" : [
      { "NOT user_has_role" : { "account" : [ "user" ], "roles" : { "value" : { "2" : "2" } } } }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "The webform component submitted by [data:contact_us_first_name-value] (= [data:contact_us_first_name-title]) [data:contact_us_last_name-value] (= [data:contact_us_last_name-title]) contains a field labeled \u0022[data:contact_us_subject-title]\u0022 which has value \u0022[data:contact_us_subject-value]\u0022 and another field \u0022[data:contact_us_message-title]\u0022 which has value \u0022[data:contact_us_message-value-raw]\u0022." } },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:contact_us_message-value-raw]" },
          "PROVIDE" : { "variable_added" : { "submitted_form_component_value" : "Submitted form component value" } }
        }
      },
      { "CONDITIONAL" : [
          {
            "IF" : { "text_matches" : { "text" : [ "submitted-form-component-value" ], "match" : "mail.ru" } },
            "DO" : [
              { "drupal_message" : {
                  "message" : "Stop and listen! ... One of the form components of the form you just submitted (= \u0022[submitted-form-component-value:value]\u0022), contains some value that is not allowed around here ...",
                  "type" : "error"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}

上記のルールに関する詳細:

  • ルールイベント:Webフォームが送信された後
  • ルール条件:ユーザーに「認証済み」の役割がありません(つまり、匿名ユーザーがフォームを送信しました)。
  • ルールアクション:

    • サイトに非公式のメッセージを表示します(これはQAの目的のためだけであり、機能することを確認したらこのアクションを省略します)。
    • 変数を追加します(これがすべての手掛かりです)。名前はsubmitted_form_component_value、ラベルは「送信済みフォームコンポーネントの値」、値は[data:contact_us_message-value-raw](以降で検証するフォームコンポーネント)です。ルールアクション)。
    • 条件付きルール モジュールを使用して、いくつかのテキスト比較を実行します。この場合、mail.ruが含まれているかどうかをチェックします。その場合は、「サイトにエラーメッセージを表示する」などの別のルールアクションを実行します。明らかに、この時点でルールのマジックを実行できます(「IPアドレスのブロック」が適切と思われます)。

注意:ここで使用したルールイベントに従って、Webフォームが送信されました(そしてこれまでのところ、「ウェブフォームを送信する前に」)。

ショータイム

上記のルールを有効にして、ウェブフォームを送信しました。これは私が受け取ったメッセージです(最初のルールアクションに従って):

Pierre(= First name :) Vriens(= Last name :)によって送信されたwebformコンポーネントには、「Subject:」というラベルの付いたフィールドがあり、「これは、Rules ...を使用したwebformコンポーネントの検証のデモです」と別の「Bonjour!mail.ruのような文字列を含むフォームコンポーネントを含むWebフォームを送信した後に何が起こるかを推測します?賭けは開かれています...」というフィールドを持つ「メッセージ:」。

そして確かに、これはすぐにそれに続くエラーメッセージです(最後のルールアクションに従って)。

やめて聞いて! ...送信したフォームのフォームコンポーネントの1つ(= "Bonjour!mail.ruのような文字列を含むフォームコンポーネントを含むWebフォームを送信した後、何が起こるかを推測します。賭けは開いています...")を含みます。ここで許可されていない値...

PS:この例では Conditional Rules モジュールを使用していますが、適切なルール条件を追加するルールコンポーネントを実行するようにルールアクションを作り直すこともできるため、この追加モジュールが必要です。詳細については、「 条件付きルールモジュールを使用する代わりの方法は何ですか? 」の回答を参照してください。

1
Pierre.Vriens