web-dev-qa-db-ja.com

パネルのビューの非協調アクセス制御設定

「プロジェクト」のカスタムコンテンツタイプと、既存のプロジェクトを表示するビューがあります。サイトには2種類のユーザーがあり、ほとんどのユーザーの権限は、自分が作成したプロジェクトのみを表示するように設定されています。もう1つのユーザータイプは、何でも表示できる「admin」タイプです。

このサイトには、私が書いた6ダースのカスタムモジュールがあります。そのカスタムロジックには、「CEXプロジェクトの表示」、「CEXサービスへのアクセス」、「CEXサービスの管理」という3つの新しい権限タイプがあります。さらに、プロジェクトのアクセス状況を処理する関連するhook_access()実装。

私が抱えている問題は、ビューのアクセス設定です。設定の適切な組み合わせが見つからないため、通常のユーザーには自分が作成したプロジェクトしか表示されません。多分それは私の目の前にあり、私はそれを逃しています...

プロジェクトビューには3つのディスプレイがあります。 「アクティブ」フィールドがtrueに設定されているすべてのプロジェクトを表示する「ページ」があります。すべての「非アクティブ」プロジェクトを表示する「ページ」があります。また、最初のアクティブなプロジェクトビューのブロックビューがあり、ページング前に表示されるプロジェクトは「フルページ」バージョンよりも少なくなっています。

フィルターでの「アクティブ」フィールドの使用を除いて、2つのページバージョンは同一です。表示されるプロジェクトの数を除いて、ページとブロックのバージョンは同じです。

[基本設定]-> [アクセス]では、それらは「複数のロール」用に構成され、選択されたロールは、webappのプロジェクト/サービスを表示/アクセス/管理する権限を持つロールです。

プロジェクトの作成者をそのプロジェクトのビューデータに接続する関係(および関連するhook_views_data()実装)があります。これは、Nodeアクセスフィルターのフィルター領域で使用されます。Nodeアクセスフィルターは、そのプロジェクトへのアクセスを決定するために各プロジェクトのユーザーIDを使用することになっています。

問題は、ビュー(3つのバージョンすべて)がすべてのプロジェクトを表示することです。表示されるのは、要約データとプロジェクトへのリンクです。所有していないプロジェクトへのリンクをクリックすると、アクセスが拒否されましたページに移動します...

Node UserID関係を使用したアクセスフィルターがまったく機能していないかのようです...アクセス制御フィルターへのインターフェイスがあまりありません...それを使用するかどうかを尋ねるだけですUserID関係かどうか...どちらを選択しても違いはありません...アクセス制御フィルターが出力の表示を制御していない可能性がありますか?

追加:ビューによって生成されたクエリは次のとおりです(アクセスロジックが表示されないのは興味深いことです)。

SELECT DISTINCT(node.nid) AS nid,
   node.title AS node_title,
   node_node__users.name AS node_node__users_name,
   node_node__users.uid AS node_node__users_uid,
   node_revisions.teaser AS node_revisions_teaser,
   node_revisions.format AS node_revisions_format,
   node.vid AS node_vid,
   node.type AS node_type,
   DATE_FORMAT((FROM_UNIXTIME(node.changed) + INTERVAL -25200 SECOND), '%Y%m%d%H%i') AS node_changed_minute
 FROM node node 
 LEFT JOIN node node_node ON node.uid = node_node.uid
 LEFT JOIN cex_project cex_project ON node.nid = cex_project.nid
 INNER JOIN users node_node__users ON node_node.uid = node_node__users.uid
 LEFT JOIN node_revisions node_revisions ON node.vid = node_revisions.vid
 WHERE (node.status <> 0) AND (node.type in ('cex_proj')) AND (cex_project.active <> 0)
 GROUP BY nid
  ORDER BY node_changed_minute DESC

もう一度追加しました:この一連のビューがPHPエラーメッセージを私のdlogに生成したことに気づきました:

Warning: Parameter 3 to views_ui_build_form_state() expected to be a reference, value given in views_ui_ajax_form() (line 1606 of C:\wamp\www\sites\all\modules\views\includes\admin.inc).

Warning: call_user_func_array() expects parameter 1 to be a valid callback, no array or string given in drupal_retrieve_form() (line 378 of C:\wamp\www\includes\form.inc).

Warning: Invalid argument supplied for foreach() in views_ui_build_form_url() (line 1542 of C:\wamp\www\sites\all\modules\views\includes\admin.inc).

Warning: Attempt to assign property of non-object in views_ui_ajax_form() (line 1613 of C:\wamp\www\sites\all\modules\views\includes\admin.inc).

[Use ajax]設定をオフにすると、これらのエラーメッセージが表示されなくなったようですが、アクセスの問題が依然として存在します。誰もがアクセスできない場合でも、ビューにすべてのプロジェクトノードが表示されます。ユーザーが所有していないプロジェクトノードをクリックすると、[アクセスが拒否されました]ページが表示されます。

4
Blake Senftner

この状況で私がやろうとしているのは、同じメニューパスを持つ2ページ表示のビューを作成することです。最初のビューのマスター権限を、これまでの管理者の役割に設定します。 2番目のビューのマスター権限を、これまでと同じ権限に設定します。また、現在のユーザーによって作成されたノードに基づいてフィルタリングするように、2番目のビュー(保護権限が最も低いビュー)を変更しました。

ビュー自体は、1つのビューを他のユーザーに表示する必要があることを認識します。したがって、管理者権限を持つユーザーには、フィルターなしでビューが表示され、他のユーザーには、作成したプロジェクトでフィルターされた2番目のビューが表示されます。

あなたのアクセス機能が何をしているかはわかりませんが、これは1つの解決策です。また、パネルの使い方がよくわからないのでコメントはできません。

1
ericduran

ビューへの引数としてユーザーを渡すことを検討しましたか?ビューコンテンツペインを使用する場合、引数はパネルコンテキストから取得できます。それとも私はあなたの質問を誤解しましたか?

0
Jason Smith