web-dev-qa-db-ja.com

現在のユーザーの役割に基づいてビューをフィルタリングしますか?

Drupal 7、ビュー3とNode参照モジュールを使用して、カスタムコンテンツタイプのノード参照フィールドにデータを入力するためにビューを使用しています。 「参照」表示タイプのビューです。)

このビューをフィルタリングして、ユーザーが選択できるようにします(ユーザーが選択できるようにします)。

  1. 公開されたコンテンツ(OK)
  2. 特定のタイプのコンテンツ(OK)
  3. 現在のユーザーによって作成されたノードのみ(OK)
  4. または、現在のユーザーが管理者またはその他の役割である場合、前のフィルターをバイパスし(3)、すべてのノードを表示します(ただし、フィルター1と2を尊重します)(not OK)

フィルター1と2は常に必須です。次に、フィルター3 OR 4も必須である必要があります。フィルターをフィルターグループに再配置してこれを機能させることができます。問題は、フィルター4を構築する方法が見つからないことです。

フィルター3の場合、タイプ「コンテンツ:作成者」の関係を取り込む必要があり、フィルター3に使用した「ユーザー:現在」(ノード作成者==現在のユーザー)など、多くの新しいフィルターが表示されました。

フィルター4については、現在のsernot作成者)の役割に基づいてフィルタリングする必要があり、その方法を見つけることができません。

フィルターリストでは、新しい「ユーザー:ロール」フィルターを使用できますが、これは「コンテンツ:作成者」の関係のみを参照するため、ノード作成者のロールのみをチェックします。それは私が必要とするものではありません:current userのロールを確認する必要があります。

現在のユーザーデータ( "User:current"など)を取り込むために新しいリレーションシップを追加し、そのデータをフィルター処理する必要があると思いますが、[リレーションシップの追加]画面でそれを見つけることができません。

それを行う方法はありますか?

6
s427

@ Jimajammaの提案 に続いて、これが私が使用したものです。私は彼のコードをDrupal 7に少し適合させ、管理者以外のロールが結果にフルアクセスできるようにしました。

ビューで、_Author: Uid_にコンテキストフィルターを追加し、次の設定を使用します。

フィルター値IS使用不可の場合:

  • デフォルト値を提供する
  • タイプ:PHPコード

次のコードを使用します。

_global $user;

if (
    in_array('administrator', $user->roles) || 
    in_array('editor', $user->roles)
)
{return -1;}
else
{return $user->uid;}
_

フィルター値IS AVAILABLE OR A DEFAULT IS PROVIDED

  • 検証基準を指定する
  • バリデータ:PHPコード

次のコードを使用します。

_if ($argument == -1) 
{return FALSE;}
else
{return TRUE;}
_
  • フィルター値が検証されない場合に実行するアクション:指定されたフィールドのすべての結果を表示します(これにより、管理者はすべての結果にアクセスできます)

以上です!

ノート:

私の初期設定と比較して、関係(_Content: Author_)はもう必要ありません。どちらも「著者」フィルターではありません(とにかく関係によって持ち込まれたものです)。

どうやら、Drupal 6の場合、最初のPHPスニペットの条件はif (in_array('super user', array_values($user->roles)))である必要があります。

8
s427

現在ログインしているユーザーに基づいてフィルタリングするには、Contextual Filterを追加する必要があります。

  1. 「ユーザー:Uid」のコンテキストフィルターを追加します
  2. 「デフォルト値を指定」を選択します
  3. タイプを選択:「ログインしているユーザーのユーザーID」

また、ページ設定:アクセス>ロールで構成された特定のロールのすべてのノードを表示するには、新しいビュー表示を複製する必要があります。次に、管理者と、すべてのノードを表示する必要があるその他の役割を選択します。

OR並べ替えのようなフィルターは使用できません。フィルター処理されたコンテンツとすべてのコンテンツで2つの異なる方法でビューを表示するため、このビューの2つの表示を作成します。

2
pxwise