Viewsで特定ロールの表示制限を行いたい

king33's picture

いつも御世話になっています。
以前、「添付ファイルをグループ分けして表示する」という質問で、御世話になりました。教えていただいた方法でコンテンツを充実させていっているところなのですが、ロールによってアクセス制限を掛けたいと思っています。
やりたい事は下記のようなことです。Drupalは6です。

(1)商品というノード(親)に、仕様書や図面などの添付ファイルを子ノードとして、親ノードに関連付けます。
(2)Viewsで、親ノードに関連付けられた子ノードの添付ファイルリストをブロック出力します。
(3)これらのブロックは、認証したユーザには見られるようにします。
(4)ユーザのロールに海外ユーザと国内ユーザを作り、海外ユーザには一部の添付ファイルがダウンロードできないようにしたい。
(5)一部のコンテンツは、親ノード(商品)に関連付けられるタクソノミーで判断したい。
例えば、
商品(親ノード)に「海外参照」というタクソノミを作って関連付けていて
商品Aは、「海外参照=OK」。商品Bは、「海外参照=NG」。となっているとします。
ロールに「海外ユーザ」。「国内ユーザ」を作ります。
認証ユーザの所属ロールが、「国内ユーザ」だった場合、商品Aも商品Bも表示され添付ファイルもダウンロードできる。
「海外ユーザ」だった場合、商品Aも商品Bも表示はされるが商品Bの添付ファイルのダウンロードは出来ない。

どうやって実現できるか、皆目見当がつかないので、何かアドバイスをお願いしたいです。
・node_accessというモジュールがあって、これをつかうと、親ノードの表示は制御できるが、添付ファイルは表示されてしまう。
・Taxonomy Access Controlというモジュールを使ってみたら、これはうまく動作してくれなかった。
・Viewsの設定でAccessにロールを指定すると、そのロールの人は全部みられなくなってしまう。

ダウンロードだけ出来ないようにする、というのが難しい場合は、Viewsのブロック表示を全部見られなくしてしまっても良いです。
でも、この方法もわからないです。

すみませんがよろしくお願いします。

Comments

dokumori's picture

一番簡単なのは、viewsのアクセス設定で実現する方法だと思います。
ブロックを表示するために作成したviewの、Basic settingsセクションの'Access' リンクをクリックしてみてください。あとは一目瞭然だと思います。

海外用、国内用二つのブロックを作り、タクソノミータームでそれぞれのブロックにリストアップされるノードをフィルターすれば出来上がり、という感じでどうでしょう。

最近は、タクソノミーを使わずに、CCK option widget を使ってカテゴライズするほうが色々便利に感じています。タクソノミーは key|value ペアで扱えないし、開発環境からプロダクションに移すのが面倒だったり、example.com/taxonomy/term/[tid] にアクセスすると、該当ノード一覧が見えてしまったりするので。

king33's picture

ありがとうございます。
ですが、思ったとおりに行かないです。

海外用、国内用。二つのブロックを作りまして、'Access'で、それぞれ海外ユーザ、国内ユーザのロールを指定しました。
これで、海外ユーザ、国内ユーザで見え方が異なるようにはなりました。

これに、さらに親ノード(ブロックが表示されているノード)に関連付けられているTaxonomyによって場合分け(フィルタ)したいのですが、この方法がわかりません。

Viewsの中のフィルタは、リストアップされる子ノードに関連付けられているTaxonomyでのフィルタは出来るようですが、
子ノードに関連付けられている親ノードのTaxonomyでフィルタしたい。

dokumori's picture

relationshipを使えば実現できると思いますが、その設定のためにはもう少し詳細が必要です。親子関係を定義しているのは node reference ですか?

詳細に書いてみます

king33's picture

親子関係は、node referenceで定義しました。

詳細に書いてみます。
(1)cckを使って、親になるコンテンツタイプを作りました。
 商品A、商品B、商品C
 このコンテンツタイプ専用のTaxonomyを定義し、海外参照=OK、NGのどちらかの項目を、コンテンツ作成時に入れる。
(2)cckを使って、子になるコンテンツタイプを作りました。
 fieldに、node referenceを定義して、親となる商品を関連付けます。
 このコンテンツタイプ専用のTaxonomyを定義し、添付ファイル種類=外観図面、内部図面、仕様書、、などをコンテンツ作成時に入れる。
 fieldに、Fileを定義し、添付ファイルを一つ入れられるようにする。
(3)親子の関係は
 商品A-外観図面1、内部図面1、内部図面2、仕様書1
 商品B-外観図面2、内部図面3、内部図面4、仕様書2
のようになってる。
(4)ViewsでBlockを生成
 Blockは3つ生成。外観図面Block、内部図面Block、仕様書Block。コンテンツ領域に配置する。
 Viewsのフィルタは下記2つを指定)
  ・node:タイプに子になるコンテンツタイプを指定
  ・Taxonomy項目に、添付ファイル種類を指定(Blockごとに別のものを指定)
 引数は、子コンテンツに定義しているnode referenceを指定
 Fieldは子コンテンツに定義しているField。

親コンテンツである、商品Aのノードを表示すると、関連するブロックが表示される。

これで判るでしょうか。
よろしくお願いします。

 

node reference

dokumori's picture

node reference で親子関係を定義していて、なおかつ子から親を参照するかたちで node reference フィールドが使われているのであれば、relationship を使うことで解決できると思います。

まず、relationship で node reference を指定し、親子関係の定義に使っているフィールドを選択してください。このとき 'require this relationship' というようなチェックボックスが表示されると思うので、これをオンにしてください。

次に、海外に対しては表示しない view ブロックの filter の設定で、taxonomy を選択し、該当のタームが存在しない場合に表示 ('not one of' を使うのが良いと思います)するよう設定してください。この際、relationship ドロップダウンが表示されると思うので、先のステップで設定した relationship を選択してください。こうすることで、親ノードのタームを使ったフィルターができるようになるはずです。

これでできると思います。駄目だったら教えてください。

ありがとうございます!

king33's picture

dokumori様

relationshipを使ってブロックの表示を制御できました。
どうもありがとございました。
当初の目的、「ダウンロードさせないようにする」為には、ブロックを、海外ユーザ用に2つ用意すれば出来そうです。

relationshipのヘルプを読んでも、いまいちピンと来ず、よくわからない設定項目でした。
少し判った気がします。
ありがとうございました。

Relationship は、一言で表せばSQL

dokumori's picture

Relationship は、一言で表せばSQL のJOIN です。ですので、これを使うと関連する(つまり relationship の存在する)レコードをつなげていくことができます。がんばってくださいね。

Japan

Group organizers

Group categories

Group notifications

This group offers an RSS feed. Or subscribe to these personalized, sitewide feeds:

Hot content this week