web-dev-qa-db-ja.com

ルールを使用してWebフォームからノー​​ドを作成する方法

Rules モジュールを使用して、webformデータに基づいてノードを作成したいと思います。これは、関連するCRMシステム内の関係を取り巻く複雑さが原因です。

私はすでにWebフォームを作成し、ルール内の次の(そして機能する)ポイントに到達しました。

{ "rules_member_news_import_" : {
"LABEL" : "Member News (cloned)",
"PLUGIN" : "reaction rule",
"OWNER" : "rules",
"REQUIRES" : [ "webform_rules", "rules" ],
"ON" : { "webform_rules_submit" : [] },
"IF" : [
  { "webform_has_id" : {
      "form_id" : [ "form_id" ],
      "selected_webform" : { "value" : { "webform-client-form-730" : "webform-client-form-730" } }
    }
  }
],
"DO" : [
  { "entity_create" : {
      "USING" : {
        "type" : "node",
        "param_type" : "newsfrommembers",
        "param_title" : "[data:title_member_news-value-raw]",
        "param_author" : [ "user" ]
      },
      "PROVIDE" : { "entity_created" : { "entity_created" : "Created entity" } }
    }
  }
]

私がする必要があるのは、Webフォームの残りのフィールドを使用して、たとえば本文や画像などの情報を入れ替えることです。

私が学ぼうとしているのは、体やその他の情報もどのように組み込むかです。エクスポートを使用して、たとえば次のように機能すると思われるものを追加しました。

"param_body" : "[data:body]"

entity_createアクション内では、編集されたテキストをインポートしたときにテキストが消えただけなので、エンティティ変数を追加するために別のアクションを追加する必要があると想定しています。

メニューの使用に戻りましたが、再び機能させることができませんでした。基本的な間違いをしているに違いない。

最初の試み

フィールドに「データ値を設定する」などのルールアクションを使用する前に、ルール条件Entity has field(値を設定するフィールドに関連する)を必ず追加する必要があります。そして、このフィールドを参照する可能性のある他のルール条件の前に、そのEntity has field条件を必ず追加してください。

それは、ルールUIで言及されていることでもあります。 「データ比較」条件を追加する場合:「」と表示されている場所で、データセレクターを使用して、ルールで使用できるデータにドリルダウンできます。エンティティフィールドをデータセレクターに表示するには、 「エンティティにフィールドがある」(または「コンテンツのタイプ」)」という条件を使用します。

上記は、「... webformの残りのフィールド」のすべてに当てはまります(質問のように)。

このEntity has field条件の重要性を示すビデオチュートリアルについては、 データタイプとデータ選択 を参照してください。特に、13:30から17:30の間で示されているものを参照してください。

2回目

以前の試みは、Getting-started-with-Rulesのようなもので、いくつかの変数がルールアクションなどで使用できないように見えるさまざまな状況を解決します。ただし、これについては Webform と組み合わせて Rules を使用することに関する特定の質問については、以下でさらに説明するように、状況は少し複雑です。

次のようなマシン名を持ついくつかのフィールドで作成されたWebフォームがあるとします。

  • contact_us_first_name
  • contact_us_last_name
  • contact_us_subject

これらのフィールド(同じマシン名)を独自のフォームに追加すると、以下のprototype-ruleを(Rules UIを使用して)独自のフォームにインポートできるようになります環境(整合性制約にぶつからない):

{ "rules_create_a_node_from_a_submitted_webform" : {
    "LABEL" : "Create a node from a submitted webform",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "webform_rules" ],
    "ON" : { "webform_rules_submit" : [] },
    "IF" : [
      { "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." } }
    ]
  }
}

上記のルールには、匿名ユーザーに対してルールアクションが実行されないように追加のルール条件を含めました(そのロールIDを自由に調整するか、そのルール条件を削除してください。そして、ルールはルールイベント「後ウェブフォームが送信されました。」.

ルールアクションは、Webフォームが送信された後にのみ(情報)メッセージをサイトに表示します(私の推奨するルールの記述およびデバッグ方法)。これは、表示されるメッセージとして(ルールUIで)指定したものです。

[data:contact_us_first_name-value](= [data:contact_us_first_name-title])[data:contact_us_last_name-value](= [data:contact_us_last_name-title])によって送信されたwebformコンポーネントには、「[data:contact_us_subject-title ] "、値は[[data:contact_us_subject-value]"です。

これは私自身の設定で表示されるメッセージのサンプルです:

Dries(= First name :) Buytaert(= Last name :)によって送信されたWebフォームコンポーネントには、 "Subject:"というラベルの付いたフィールドが含まれています。ルールモジュールはnode_convertモジュールを置き換えることさえできます! "。

上記のプロトタイプルールが示しているのは、質問に答えるための「手がかり」は、利用可能なWebフォームの任意のフィールドのすべてのラベルとすべての値にアクセスできることです。

  • [data:MachineFieldName-title]には、マシン名MachineFieldNameを持つフィールドのLabelが含まれています。
  • [data:MachineFieldName-value]には、マシン名MachineFieldNameを持つフィールドのValueが含まれています

3回目の試み

上記は良いスタートですが、それでもあなたの目標を達成するには十分ではありません(=「...ウェブフォームの残りのフィールドを使用して、たとえば本文テキストなどの情報を転置してください...」 )。ただし、 my answer から " Rulesモジュールを使用する場合に、送信されたWebフォームデータとデータ比較を行う方法は? "で説明されているものと同様の手法を使用できます。略して:

  • Add a variableに追加のルールアクションを追加します(情報を転置するWebformコンポーネントごとに、それに割り当てられた値が[data:ComponentName-value-raw]に等しくなります(データタイプがWebformコンポーネント)。
  • 後続のルールアクションでは、追加したこれらの変数の値を参照できます(それが手掛かりです!)。

デモ

Webformコンポーネント

form_id=191およびこれらのWebフォームコンポーネントを含むWebフォームを想定します。

  • ラベル=タイトル、マシン名= demoform_title、データタイプ=テキストフィールド。
  • ラベル=テキスト、マシン名= demoform_text、データタイプ= Textarea。
  • ラベル=番号、マシン名= demoform_number、データタイプ=番号。
  • ラベル=オプション、マシン名= demoform_option、データタイプ=オプションを選択(単一の値)。

記事のコンテンツタイプ

次のフィールドを持つ記事コンテンツタイプを想定します。

  • ラベル=タイトル、マシン名= title、フィールドタイプ= Nodeモジュール要素。
  • ラベル=本文、マシン名= body、フィールドタイプ=長いテキストと要約。
  • ラベル=自由形式Nr、マシン名= field_free_format_nr、フィールドタイプ=整数。
  • ラベル= OptionList、マシン名= field_optionlist、フィールドタイプ=リスト(テキスト)。

カスタムルール

これは、質問に含まれるルールの拡張(改良)バージョンである(ルールエクスポート形式の)カスタムルールです。このルールは、(Articleタイプの)新しいノードを作成し、上記のWebformコンポーネントに含まれるデータを使用します。

{ "rules_create_a_node_from_webform_data" : {
    "LABEL" : "Create a node from webform data",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "webform_rules", "rules" ],
    "ON" : { "webform_rules_submit" : [] },
    "IF" : [
      { "webform_has_id" : {
          "form_id" : [ "form_id" ],
          "selected_webform" : { "value" : { "webform-client-form-191" : "webform-client-form-191" } }
        }
      }
    ],
    "DO" : [
      { "drupal_message" : { "message" : "The webform submitted contains these fields:\r\n\u003C\/ul\u003E\r\n\u003Cli\u003Ethe field labeled \u0022[data:demoform_title-title]\u0022 which has value \u0022[data:demoform_title-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_text-title]\u0022 which has value \u0022[data:demoform_text-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_number-title]\u0022 which has value \u0022[data:demoform_number-value-raw]\u0022.\u003C\/li\u003E\r\n\u003Cli\u003E the field labeled \u0022[data:demoform_option-title]\u0022 which has value \u0022[data:demoform_option-value-raw]\u0022.\u003C\/li\u003E\r\n\u003C\/ul\u003E" } },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_text-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_text" : "Form variable text" } }
        }
      },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_number-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_number_text" : "Form variable number text" } }
        }
      },
      { "data_convert" : {
          "USING" : { "type" : "integer", "value" : [ "var-demoform-number-text" ] },
          "PROVIDE" : { "conversion_result" : { "var_demoformvar_number" : "Form variable number" } }
        }
      },
      { "variable_add" : {
          "USING" : { "type" : "text", "value" : "[data:demoform_option-value-raw]" },
          "PROVIDE" : { "variable_added" : { "var_demoform_option" : " Form variable option" } }
        }
      },
      { "entity_create" : {
          "USING" : {
            "type" : "node",
            "param_type" : "article",
            "param_title" : "[data:demoform_title-value-raw]",
            "param_author" : [ "user" ]
          },
          "PROVIDE" : { "entity_created" : { "article_created" : "Created article" } }
        }
      },
      { "data_set" : {
          "data" : [ "article-created:body:value" ],
          "value" : [ "var-demoform-text" ]
        }
      },
      { "data_set" : {
          "data" : [ "article-created:field-free-format-nr" ],
          "value" : [ "var-demoformvar-number" ]
        }
      },
      { "data_set" : {
          "data" : [ "article-created:field-optionlist" ],
          "value" : [ "var-demoform-option" ]
        }
      },
      { "data_set" : { "data" : [ "article-created:comment" ], "value" : "0" } },
      { "entity_save" : { "data" : [ "article-created" ], "immediate" : "1" } },
      { "drupal_message" : { "message" : "A new article got created, with nid=[article-created:nid] and url=[article-created:url]" } }
    ]
  }
}

追加されたルールアクションの詳細:

  • Show a message on the site:これは、デバッグ/デモの目的でのみ使用します(不要なものを削除する/もう必要ありません)。 Webフォームを送信した後に表示されるサンプルメッセージを次に示します。

    送信されたWebフォームには、次のフィールドが含まれています。

    • 「タイトル」というラベルの付いたフィールドには、「ウェブフォームの興味深いタイトル」という値があります。
    • 「Text」というラベルの付いたフィールドは、「Just some text、with some additional text and still another line and another one」という値を持っています。
    • 値「842316」を持つ「番号」というラベルのフィールド。
    • 値「A」を持つ「オプション」というラベルの付いたフィールド。
  • Add a variable(2回):Webformコンポーネントdemoform_numberおよびdemoform_optionの値を後続のルールで使用できるようにする行動。 demoform_numberを使用するには、追加のルールアクションConvert data typeが必要です。

  • Set a data value(3回):先行するルールアクションで作成された変数を使用して、ノードの本文と2つのノードフィールドにデータを入力します。

  • Set a data value:作成中のノードに「コメントクローズ」を設定するには(これはオプションのルールアクションであり、他のことの説明にすぎません)このようなノードを作成することで実行できます)。

  • Save entity:実際にノードを保存します。

  • Show a message on the site:これは、デバッグ/デモの目的でのみ使用します(不要なものを削除する/もう必要ありません)。 Webフォームを送信した後に表示されるサンプルメッセージを次に示します。

    Nid = 123およびurl = http://www.example.com/node/12 を使用して、新しい記事が作成されました

最終結果

上記のサンプルのようにデータを含むWebフォームを送信した後、新しい記事(ノードID = 123)が作成され、そのノードに関する次の詳細が含まれます。

  • タイトル:私のウェブフォームの興味深いタイトル
  • ボディ

    ほんの一部のテキスト、

    いくつかの追加テキスト付き

    そしてさらに別のライン

    そしてもう一つ

  • 自由形式Nr:842316

  • OptionList:詳細(Key-Value "A"に対応するラベル)

追加の可能性

いくつかのさらなる改良により、上記のプロトタイプルールは Node Convert モジュール...のルールベースの代替を作成するためにも使用でき、Entity Convertでも同等です。

5
Pierre.Vriens