初めて質問させていただきます。宜しくお願いいたします
現在会員サイトをDrupal7で作っているのですが、コンテンツのアクセスコントロールで手こずっています。
やりたいこととしては、コンテンツは特定の会員のみ閲覧できるようにしたいのですが、ティザーは特定会員以外も見られる様にしたいのです。
ただし匿名ユーザー(登録していないユーザー)はティザーは見ることが出来ないようにしたいです。
具体的には匿名ユーザー、会員ユーザー、プレミアム会員ユーザー、の三種類のロールで分けるようなイメージです。
ロールに対してノードの見え方としては
●匿名ユーザー:記事以外(サイトの会員規約など)の基本的なページしか見ることが出来ない。
●会員ユーザー:一般の記事は見られるが、プレミアム記事は見ることが出来ない(ただしプレミアム記事のティザーは見ることが出来る)
●プレミアム会員ユーザー:全てのノードを閲覧出来る
どこにでもありそうな仕組みを実現したいのですが、いざやってみるとなかなかうまくいかなくて困っています。
試してみたモジュールと問題点を以下に記します
●Content Access:
ノード単位でのアクセスコントロールなので、プレミアム会員向けのティザーが表示されない
●Node Option Premium:
ほぼ希望に近い感じなのですが、匿名ユーザーにもティザーが表示されてしまいます。また、検索インデックスがうまく作成されないので、会員コンテンツ(アクセス制限があるコンテンツ)の本文(body)部分は任意の単語を検索できない
●Member Only Content:
上記と似たような制限と、ロールをカスタムで指定できない
●Field Permissions:
各カスタムフィールドにアクセス制限をかけられるので、力業になりますが、ほぼ希望通りのアクセス制御ができました。しかし、これもNode Option Premiumと同じで、本文(bodyフィールド)を各ロールにアクセス制御かけてしまうと、検索インデックスが作成されなくなり、どのユーザーロールからも、本文(bodyフィールド)を任意の単語で検索することができなくなってしまいました。
よさそうなField Permissonsモジュールですが、基本的にサイト内のコンテンツはほとんど外部から遮断するので、サイト内で必要最低限検索できるようにしたいので、惜しいところです。
会員サイトの構築は意外とニーズがあるように思うのですが、皆さんどのように実現されているのでしょうか?
私は基本的にプログラミングはできないので、もし既存のモジュールや設定などで、どなたか実現されている方がいれば、ご教示いただけると幸いです。
そのほか、根本的に違うアプローチでもかまいませんので、なにか参考になりそうなことなどあれば、ご指摘いただけるとありがたいです。
うまく説明できていないかもしれませんが、是非宜しくお願いいたします。
Comments
次のように2段階のアクセス制御を考えます。「記事」と「
次のように2段階のアクセス制御を考えます。
このうちの 1 は、Content Access モジュールで出来ると思います。
2 の制御については、「ノードページをViewsで作る」という方法でどうかと思いました。これは私が実際にノードページの設定によく使う方法で、こちらのページで詳しく紹介しています。Views でノードページを作り、アクセスの設定を「プレミアム会員」ユーザーロールのみにします。(アクセスの設定はビューの設定画面の真ん中の上のほうにあります。)
これならノートページのみアクセス制御がされ、他のページで表示されるティーザーは影響されません。
この記事の中では2つほどフックが必要だと書いていますが、 1つ目のフック(hook_preprocess_node())はテンプレートの編集でも何とかなります。 2つ目のフック(hook_url_outbound_alter())は、そもそもこのビューのパスを '/node/%' にしてしまえば必要ありません。
もしこのビューのパスを '/node/%' 以外のものにする場合は、hook_url_outbound_alter() が必要なのに加えて、直接 '/node/{ノードID}' でアクセスしてきた場合に備えた対策が必要です(パスに '/node/%' を設定した適当な Views ビューを作り、アクセスの設定を administrator のみにする等)。
Drupal カスタマイズTips 更新中...
CMS自由自在!
http://customfield.jp/
shigehiroさん、メッセージありがとうございます。
shigehiroさん、メッセージありがとうございます。
Viewでノード生成することも出来るのですね。とても勉強になりました!
参考ページを見て、ViewのContextual Filtersを調整し、Viewのアクセス制限を「プレミアム記事」ロールにしてみました。しかし、他のビューからティザーを表示し、「プレミアム記事」にアクセスすると、やはりノードが見られるような状態になってしまいます。
何度も、ビューを作り直してやってみたのですが、Viewのアクセス制限が効いていない印象です。
もしかしたら、私の設定漏れがあるのかもしれませんが、そもそもContent Accessのアクセス制御をViewのアクセス制御で上書きすることが出来るのでしょうか?
もしそうだとすると、モジュール同士のプライオリティーを設定する必要があるのでしょうか?
根本的に勘違いしているような気もするので、もし間違いがあればご指摘いただけるとありがたいです。
それと、質問ばかりで恐縮ですが、実は「プレミアム会員」ロールなんですが、現実には何種類か会員グレードが存在しています。
説明の便宜上、わかりやすいように2種類(通常会員とプレミアム会員)で説明しました。現実には数種類の会員グレードがある場合Viewのアクセス制御だと、どのような配分設定が可能でしょうか?
すみませんが、宜しくお願いいたします。
参考ページは、Views でノードページを作成する方法の説明であって、
参考ページは、Views でノードページを作成する方法の説明であって、アクセス制限については触れていません。それと、Views ビューのアクセス制限の設定を行うのは Contextual Filters ではなく、真ん中のカラムの上のほうにある PAGE SETTINGS の Access: のところです。
はい。ビューのアクセス制限を設定していないなら、効いていないと思います。
この方法の 2 では、Views はノードのアクセス制御をしているのではなく、ノードページの表示を Views ビューで代替し、そのビューのアクセスを制限している形となっています。なので、先の回答でも少し触れましたが、そのビュー以外に何らかの形でノードページを表示する仕組みがある場合は、注意が必要です。
ビューのアクセス設定(真ん中のカラムの上のほうにある PAGE SETTINGS の Access: のところ)で、アクセスを制限したい全てのロールのチェックボックスの、チェックを外すだけです。
Drupal カスタマイズTips 更新中...
CMS自由自在!
http://customfield.jp/
shigehiroさん返信ありがとうございました。 あれか
shigehiroさん返信ありがとうございました。
あれから何度か試してみて、なんとか理解できました。
もうひとつご教授頂けると幸いです。
例えば会員の種類がブロンズ、ゴールド、プラチナという具合に、グレードによって見られるコンテンツを分けたいと思い、それぞれのコンテンツタイプ別にViewページを作成して、ビューのアクセス制限で各コンテンツタイプの閲覧制限をしてみました。
その場合のカスタムプラグインのhookを以下のようにしてみました。
お聞きしたいのは2点あります。
1.とりあえず正常に動いているようなのですが、これでも良いものなのでしょうか?
2.教えて頂いたチュートリアルでは、賃貸物件のコンテンツのパスは、forrent/content/{nid}でしたが、例えばゴールド会員が閲覧出来るノードパスをhttp://drupal/content_gold/{nid}としたいとき、単純に以下のコードを省くと、チュートリアルの「content」という階層構造を省くことが出来ました。
array_splice($args, 1, 0, array('content'));コードの意味をわかってる訳では無いので、何となく不安で質問してみました。
特にエラーコードなどは表示されていないのですが、アドバイス頂けると嬉しいです。
すみませんが宜しくお願いいたします。
はい。それで良いと思います。 あとは、直接
はい。それで良いと思います。
あとは、直接 '/node/{ノードID}' でアクセスされた場合の対策をお忘れなく。
ほかにノードページを表示する仕組みを作っていなければ、以上でOKだと思います。
Drupal カスタマイズTips 更新中...
CMS自由自在!
http://customfield.jp/
遅くなりましたが、shigehiroさん回答ありがとうござ
遅くなりましたが、shigehiroさん回答ありがとうございました。
大変参考になりました!
今後とも宜しくお願いいたします。