web-dev-qa-db-ja.com

EntityQueryを記述してノードへのユーザーのアクセスをチェックする方法は?

次のDrupal 8 EntityQueryを記述して、現在のユーザーがアクセスできるノードのみを返すようにするにはどうすればよいですか?

$query = \Drupal::entityQuery('node')
  ->condition('type', 'article');

上記のクエリは、公開されていないものも含め、すべてのノードを返します。結果の使用方法(ノードのリストなど)に応じて、ユーザーは非公開ノードのタイトルやその他の情報を表示できます。

$query = \Drupal::entityQuery('node')
  ->condition('type', 'article')
  ->condition('status', 1);

「ステータス」条件を追加すると、公開されたノードのみのリストが表示されます。しかし、私はすべてのノードを表示するためのノード管理権限を持つ人々にお願いします。

基本的に、ビューのように、「管理または公開」フィルターをシミュレートする方法はありますか?

1
confusedGFCI

エンティティクエリでは、デフォルトでノード許可システムが考慮されます。実際には、ノード許可を使用してすべてwhenを取得するために、それをオプトアウトする必要があります。

問題は、drupalコアが実際にそのステータスのAPIを実装していないことです。これは、実装するモジュールを使用する場合にのみ関連します。

残念ながら、「adminまたはpublished」をシミュレートする唯一の方法は、自分で行うことです。権限を確認し、ユーザーが権限を持っていない場合は、status = 1条件を追加します。ビューは「ノードの管理」を使用しますが、技術的には実際には間違っています。「ノードアクセスのバイパス」の方が理にかなっており、非公開ノードのノード/ IDにアクセスしようとしたときにチェックされる内容と一致します。ただし、独自のコードでは、カスタム権限を含め、意味のあるものを何でも使用できます。

または、 https://www.drupal.org/project/view_unpublished のようなモジュールを使用することもできます。これにより、付与レコードが入力され、エンティティクエリが機能します。実際、そのモジュールを使用するときに、誰かがあなたが望む動作をバグとして報告したバグレポートをクローズしました https://www.drupal.org/project/view_unpublished/issues/2871272

1
Berdir