web-dev-qa-db-ja.com

ノードを更新するためのユーザープロファイルの更新

現在、いくつかの追加フィールドを使用してユーザープロファイルを設定しています。そのユーザーが「有料ユーザー」の役割を取得すると、ルールを使用してエンティティが作成され、プロファイルにそれらの追加フィールドをコピーするノードが公開されます。しかし、ユーザーのプロファイルフィールドを更新するたびに、別のノードが作成され、古いノードが残るという問題があります。

重複するノードを削除するソリューションを探していますORは現在のノードを更新します。

誰かこれについて何かアイデアはありますか?私は誰かがDrupal 7のために構築した重複排除モジュールを試しましたが、機能していないようです。

編集:これは、古いノードの非公開を試みるために私が作成した2番目のルールです。

Event: Before saving a user account
Conditions: Entity exists by property(Entity type: Node, Property: Title, Value: [account:field-business-profile])

Data comparison(Parameter: Data to compare:[account:field-bus-name],Data value:[account:field-business-profile:title])

Actions: Unpublish content(Parameter:Content:[account:field-business-profile])

EDIT2:ルービーの編集に2番目のルールを更新しました。ただし、元のコンテンツは公開されたままです。 account-business-profile:nidとaccount-unchanged-business-profile:nidの間を行き来してみましたが、役に立ちませんでした。ルールと2つのコンテンツのアップロードしたいくつかの写真を次に示します。 enter image description hereenter image description here

4
CR47

質問にコメントが多すぎないように、回答に移ります。

2番目のルールは、非公開/編集するノードをロードしないようです。

「プロパティでエンティティを取得する」のアクションが必要です(タイトルで取得することに注意しますが、ノードIDの安全性を優先します)。このアクションでは、1に制限できるため、ノードは1つしか取得できません(とにかく1つしかありません)。

次に、ノードをフェッチし、そのノードで比較を実行したり、そのノード(またはその他の必要なもの)を非公開にしたりできます。

ただし、問題は、この段階ではルールがエンティティであることのみを認識しているため、どのタイプまたは何も認識していないため、フィールドに実際にアクセスしたり、非公開などのノードアクションを実行したりできないことです。

したがって、(これが唯一の方法だと思います) http://drupal.org/project/rules_conditional モジュールをインストールする必要があります。

次に、「Fetch entity by property」アクションの後に、ループを追加し、entity-fetchedにループオーバーできます(1を返すように指定した場合でも、配列が返されます)。

次に、このループで「条件付き」を追加します。

次に、条件に「If」を追加します。エンティティがフィールドを持つか、エンティティがタイプであり、コンテンツがタイプである場合。複数のIfを追加できます。複数のネストされたifが必要な場合は、エンティティがノードタイプの場合は条件付きのように追加する必要がありますコンテンツがタイプページアクションのタイプの場合は条件付き

Ifsルールを追加すると、フェッチされたエンティティはノードであり、フィールドにはどのフィールドがあるかがルールでわかります。

次に、非公開アクションを追加して、エンティティフェッチ済み(またはループのためにリスト項目)を選択できます。

したがって、ルールは次のようになります。

Event: Before saving a user account
Action: Fetch entity by property(Parameter: Entity type: Node, Property: Title, Value: [account:field-business-profile], Limit result count: 1 Provides variables: Fetched entity (entity_fetched))
Action Loop: (Property: List: [entity-fetched], List item: Current list item (list_item))
  Conditional:
    If: Entity is of type (Parameter: Entity: [list-item], Entity type: Node)
      Conditional:
        If: Content is of type (Parameter: Content: [list-item], Content types: Basic page)
          Action: Unpublish content (Parameter: Content: [list-item])

または、次のようになります(ループなしで、最初にフェッチされたエンティティを処理するだけです)。

Event: Before saving a user account
Action: Fetch entity by property(Parameter: Entity type: Node, Property: Title, Value: [account:field-business-profile], Limit result count: 1 Provides variables: Fetched entity (entity_fetched))
Conditional:
  If: Entity is of type (Parameter: Entity: [entity-fetched:0], Entity type: Node)
    Conditional:
      If: Content is of type (Parameter: Content: [entity-fetched:0], Content types: Basic page)
        Action: Unpublish content (Parameter: Content: [entity-fetched:0])
5
rooby

過去にサイトで使用した1つのアプローチは、プロファイルの作成時にエンティティを作成し、それをリレーションにリンクすることです(そのとき、ルールを取得できなかったため、 Relation モジュールを使用しました) エンティティ参照 機能の統合)。

次に、権限を使用して(変更を承認する必要があるため Revisioning モジュールを使用)、そのプロファイルの編集へのアクセスを適切なロールを持つユーザーに制限しました。

次に、ユーザーが有料ユーザーになると、リレーションを通じて呼び出してノードを公開するルールと、ノードを非公開にする別のルールがあります。

このアプローチでは、データベース内にユーザーごとに1つの追加ノードが作成されます。一部の人々はこれを好まないかもしれませんが、私にとっては、単純さのために良いトレードオフでした。

フィールドの値をコピーするには、ノードが既に作成されており、最初にノードを保存する必要がないため、アクションセットコンポーネントを一連のルールであるルールに追加するだけですSetデータ値アクション。

2
Patrick Kenny