web-dev-qa-db-ja.com

ノードを公開した後、ノードの作成者への編集アクセスを取り消す方法は?

Drupal 7に RulesContent Access の両方のモジュールを含む7(およびそのサブモジュールのコンテンツアクセスルール)で新しいルールを構築しようとしていますしたがって、特定の役割に対して「アクセスを許可または取り消す」などの新しいアクションを取得します。

認証されたユーザーはWebサイトにコンテンツを追加できますが、(ドラフトのように)デフォルトでは非公開です。

ユーザーが準備ができたら、ユーザーはコンテンツを公開できます(別のモジュールがそれを行うことができます ドラフトを保存コンテンツを公開 )。

コンテンツが公開された後(どのイベントですか)、ノードの作成者の変更アクセスを取り消す必要があります。

このチュートリアル が示すように、ただしフラグなしでルールを作成しようとしました。

これは機能しません。作成者は公開後もコンテンツを編集でき、このノードのアクセス制御は変更されていません(コンテンツタイプ設定の[コンテンツノードごとのアクセス制御設定]チェックボックスをオンにしました)。

Content Access が動作するためには公開されたノードが必要なので、問題は私のノードの公開されていない状態、つまりアクセス設定の欠如にあると思います。次に、 Rules に、存在しないコンテンツアクセスを変更するように依頼します...

ここでは カスタムモジュール を使用できますが、理論的には実行できるので、ルールモジュールを使用したいと思います。

これが私のルールコードのエクスポートです:

{ "rules_revoke_edit_access_after_publication" : {
    "LABEL" : "Revoke edit access after publication",
    "PLUGIN" : "reaction rule",
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "content_access_rules" ],
    "ON" : { "node_update--manuscript_submission" : { "bundle" : "manuscript_submission" } },
    "IF" : [ { "data_is" : { "data" : [ "node:status" ], "value" : "1" } } ],
    "DO" : [
      { "content_access_action_revoke_node_permissions" : {
          "node" : [ "node" ],
          "permissions" : { "value" : [
              "view:3",
              "view_own:3",
              "update:3",
              "update_own:2",
              "update_own:3",
              "delete:3",
              "delete_own:3"
            ]
          }
        }
      }
    ]
  }
}

認証済みユーザーのデフォルトアクセス: (非公開の表示 モジュールのおかげで、(必要なコンテンツタイプの)非公開のコンテンツを表示/表示)

公開後に必要なアクセス:自分のコンテンツのみを表示します。

2
Toki

アプローチ1:

これが私があなたが探しているものだと思う規則( Rules エクスポート形式)です:

{ "rules_disallow_edit_own_content_after_node_is_published" : {
    "LABEL" : "Disallow edit own content after node is published",
    "PLUGIN" : "reaction rule",
    "ACTIVE" : false,
    "OWNER" : "rules",
    "REQUIRES" : [ "rules", "content_access_rules" ],
    "ON" : { "node_update--manuscript_submission" : { "bundle" : "manuscript_submission" } },
    "IF" : [
      { "data_is" : { "data" : [ "node-unchanged:status" ], "value" : "0" } },
      { "data_is" : { "data" : [ "node:status" ], "value" : "1" } }
    ],
    "DO" : [
      { "content_access_action_revoke_node_permissions" : {
          "node" : [ "node" ],
          "permissions" : { "value" : [
              "view:3",
              "view_own:3",
              "update:3",
              "update_own:2",
              "update_own:3",
              "delete:3",
              "delete_own:3"
            ]
          }
        }
      }
    ]
  }
}

このルールを独自の環境にインポートして、レビュー/ QAテストを実行してください。

このルールの「手がかり」(魔法?)の詳細:

  • Rules Eventは、「コンテンツタイプmanuscript_submissionのノードの更新」に関連しています。
  • Rules Conditionは、ノードが非公開から公開に変更されたときにのみルールアクションがトリガーされるようにします。
  • Rules Actionは、ノードの作成者(コンテンツアクセスの用語ではcfr。 "own")がrome "authenticatedユーザー"。

:上記のルールは、マシン名manuscript_submissionのコンテンツタイプに「調整」されます。そのマシン名を他のコンテンツタイプに変更します(例:article)。このルールを実際にインポートする前に、必ずこのような変更を行ってください(ルールUIではインポート後にその「イベント」を変更できないため)。

アプローチ2:

回避策を使用して、「...必要なノード作成者の変更アクセスを取り消す...」を実装することもできます。

「新しいコンテンツを作成する前に」などのルール条件を指定する方法? 」に関する質問への私の回答をご覧ください。これからの引用は次のとおりです。あなたのケースでもお勧めします。

ルール(システム)イベント「Drupal is initializing」(= init)を使用してみてください。これは、実際には編集フォームが表示される前です。

これにより、実際には「アクセスを取り消す」必要はありません(その必要はありません)。代わりに、Rulesモジュールを使用して、誰かがノードの編集セッションを開始しようとしているRulesイベントをキャプチャします。次に、チェックする追加のルール条件に応じて(この場合、「現在のユーザーはこのノードの作成者ですか?」かつ「このノードのステータスは公開されていますか?」)、Rulesアクションを使用してユーザーを「別の場所」にリダイレクトします(ユーザーが要求した編集フォームを表示するのではなく)。

:上記の私の回答でプロトタイプのルールの例を使用する場合は、ルールの条件を適合させる必要があることは明らかですおよび/またはあなたのケースに合うようにするためのルールアクション(編集フォームのURLのような?).

1
Pierre.Vriens