web-dev-qa-db-ja.com

複製されたノードのフィールドをルールで使用できるようにする方法

フラグが立てられるとノードを複製するルールがあります。この新しくクローンされたノードに特定のパラメータを設定できますが、すべてではありません。他の投稿で、条件付きルールを使用して、その複製されたノードのノードタイプを識別する必要があり、すべてのフィールドにアクセスできることを読みました。しかし、ここでも「すべて」のフィールドは対象外です。

複製されたノードのテキストフィールド「学生名」を、ユーザーのプロファイルのテキストフィールドである著者の名に設定します。フラグを立てているユーザーのプロファイルの多くのフィールドが使用できますが、すべてではありません。

2
BassPlaya

あなたはあなた自身の質問のための「a」解決策をすでに見つけたようですが、あなた自身の解決策を本当に理解していないので、そしてIMOはより理解しやすい解決策があるので、以下の代替案を検討してください...

ステップ1:ルールコンポーネントを作成する

次のように、(「アクションセット」タイプの)ルールコンポーネントを作成します。

  • パラメータ "node_to_update "および" node_author "。
  • ルールアクション= "show message"。

そのようなルールコンポーネントのプロトタイプを次に示します(ルールエクスポート形式で、ルールUIを使用してサイトにインポートします)。

{ "rules_update_cloned_node" : {
    "LABEL" : "Update cloned node",
    "PLUGIN" : "action set",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules" ],
    "USES VARIABLES" : {
      "node_to_update" : { "label" : "Node to be updated", "type" : "node" },
      "node_author" : { "label" : "Node author", "type" : "user" }
    },
    "ACTION SET" : [
      { "drupal_message" : { "message" : "The field firstname in node with id [node-to-update:nid] needs updating with value \r\n[node-author:field-firstname]. To actually do so, replace this (informational) Rules Action with setting the appropriate value for the appropriate field ..." } }
    ]
  }
}

実際のアクションは、Drupalメッセージを表示するだけです(渡された変数の値を表示するため)。そのアクションを、クローンノードの実際の更新に置き換えます。

ステップ2:既存のルールを更新する

ルールコンポーネント(手順1から)を実行して既存のルールアクションを更新しますが、次の2つを渡しますパラメータ

  • node_to_update。クローンされたノードのnidの値(トークン)を介して渡すことができます。
  • node_author。クローンされたノードのuidの値(トークン)を介して渡すことができます。
1
Pierre.Vriens

問題は、条件内のプロパティ[cloned-node:author:field-firstname]でエンティティをフェッチし、データ値[cloned-node:field-student-name:0]を[firstname-fetched: 0:field-firstname] [firstname-fetched:]の後に[0:field-firstname]を指定する必要がある理由はまだわかりませんが、それでも機能します。スクリーンショットをご覧ください。これが他の誰かにも役立つことを願っています。

Rules Events and ConditionsRules Actions part 1Rules Actions part 2Rules fetch entity by property part 1Rules fetch entity by property part 2Rules set the data value of the fetched entity

@ Pierre.Vriensが助けた後、私のコンポーネントコードは次のとおりです:

    { "rules_update_the_cloned_course_with_values_for_the_student" : {
    "LABEL" : "Update the cloned Course with values for the Student",
    "PLUGIN" : "action set",
    "OWNER" : "rules",
    "TAGS" : [ "cloned node", "component", "course", "update" ],
    "REQUIRES" : [ "rules_conditional", "rules" ],
    "USES VARIABLES" : {
      "node_to_update" : { "label" : "Node to be updated", "type" : "node" },
      "node_author" : { "label" : "Node author", "type" : "user" }
    },
    "ACTION SET" : [
      { "CONDITIONAL" : [
          {
            "IF" : { "entity_is_of_bundle" : {
                "entity" : [ "node-to-update" ],
                "type" : "node",
                "bundle" : { "value" : { "course" : "course" } }
              }
            },
            "DO" : [
              { "data_set" : {
                  "data" : [ "node-to-update:field-student-name:0" ],
                  "value" : [ "node-author:field-firstname" ]
                }
              },
              { "drupal_message" : { "message" : "Machine name of this Component was: \u0022rules_update_the_cloned_course_with_values_for_the_student\u0022" } },
              { "data_set" : { "data" : [ "node-to-update:field-status" ], "value" : "359" } }
            ]
          },
          { "ELSE" : [
              { "drupal_message" : {
                  "message" : "The field \u0022Student name\u0022 could not be set with the value of the Student\u0027s first name.\u003Cbr \/\u003E\r\nMachine name of this Component was: \u0022rules_update_the_cloned_course_with_values_for_the_student\u0022",
                  "type" : "warning"
                }
              }
            ]
          }
        ]
      }
    ]
  }
}
2
BassPlaya