権限について

sakura-mama's picture

こちらでは大変お世話になっております。
自己解決を目指しておりましたが又来てしまいました・・・・・・・

やりたいことは、「ユーザーにIDを発行し、そのユーザーが自分のページを2ページほど保有することができて、そのページを自分で更新できる」ということです。
Drupal7を使ってます。

色々調べましたが、私のやりたいことがぐるなびさんのサイトのような事で、同じような質問を見つけたのですがそこにはCCKと"Content Permissions"モジュールを使うというのが出てきました。しかし、Drupal7に適しているのか判りませんでした。

IDを作って、自分のページを作成、更新できる部分も権限によってはどのページも作成、更新ができてしまうため詳細な権限さえ指定できれば実現可能とも思いますが、その基本的な構成部分も今ひとつ曖昧で、しばらく手がつけれていないです。
作成しているのはポータルサイトでして、後は、ちょうどぐるなびさんのように、
*お店を探す人が対象の会員・・・・・・・・会員登録をして会員のみ閲覧可能ページがあること。(この部分はID作成と権限をつけて完成) 
気に入ったお店をそのサイト内のお気に入りに登録できる(これは難しそうなのであきらめています)

*お店を登録する人が対象の会員・・・・ユーザーにIDを発行し、そのユーザーが自分のページを2ページほど保有することができて、そのページを自分で更新できるという今回質問の部分
管理者がチェックしてから公開という設定をつけたいのでこれはruleを使う予定

の二つができれば完成です。
ひょっとして一つのモジュールで両方とも実現可能かもしれませんがその辺りもあまり判っていません。

必要なモジュールと、必須事項などご指導いただけると嬉しいです。

Comments

はじめまして

abechiyo2000's picture

初めましてabechiyoです。

>ユーザーにIDを発行し

こちらに関してはユーザーを作成したときにユーザーIDが発行されています。
www.hoge.com/user/1 のようにユーザー毎のページが自動で生成されています。
このデフォルトの数字が嫌であれば、pathautoモジュール等を使えば、
www.hoge.com/user/user_name みたいなURLに変えることも出来ます。

>そのユーザーが自分のページを2ページほど保有することができて、そのページを自分で更新できる

こちらに関しては色々な方法があるかと思いますが、
私がよくやっていたのは、Drupal6だとUser Profileモジュールを使う。
Drupal7ですとcoreに導入されたfield機能を使って、ユーザー毎のページを生成していました。
前述でもうしました、各ユーザーごとのページに(www.hoge.com/user/1)、各ユーザーが各々の記事を書く。
などを行っておりました。

blogモジュールとか使っても同様の事が出来そうですよね。
7になってから、fieldモジュールがuserにも使えるようになったので、是非使ってみてください。

ちなみに、fieldの設定は
「ホーム » 管理 » 環境設定 » ユーザー » アカウントの設定 » フィールド管理」で出来ます。

見当違いでしたら、ごめんなさい

ありがとうございます。

sakura-mama's picture

abechiyoさん、はじめまして。よろしくお願いいたします。
早速の回答をありがとうございます。私はせいぜいHPが作れる程度でPHPとかデータベースとか全く素人です。ですからおかしな質問があるかもしれませんが、ご理解くださいませ!!!

その上で、再度質問なのですが、権限はどうなるのでしょうか? 
例えば、権限は今、匿名ユーザー、認証済みユーザー、administratorとあります。で、お店の人がIDを作成したら認証済みユーザーとしての扱いになると思います。次に、例えばブログなどのように”IDを持ったお店の人”が作れるページがあります。
この場合、お店の人がIDを使ってログインしてページを作成、更新したとすると、認証済みユーザーの権限を作成、更新可能としなくてはいけないと思うのですが、これをすると、認証済みユーザーとしての権限を持った他のお店の人のページも更新ができることになりませんでしょうか? 

なので自分のIDで作った専用ページしか作成、更新できない権限というのは必要ないのかな?と調べたのですが判りませんでした。

それから、Profileモジュールを使ってユーザーページに特定の情報(店舗名、HPアドレス)を掲載するところまではできていますが、このユーザーページを ”ユーザーが自分のページを2ページほど保有” することに対応させるってことですよね? このユーザーページはユーザーだけのものって思ってましたが、viewsかなにかで表示させて使うってことでしょうか? それとも他にユーザーページを表示、閲覧可能にする方法がありますか? 今は、ユーザーページはメニューの”ユーザー”のユーザーが一覧で表示されるところからしかいけないのです。

abechiyo2000's picture

profileページまでは出来ていましたか。

>お店の人がIDを使ってログインしてページを作成、更新したとすると、認証済みユーザーの権限を作成、更新可能としなくてはいけないと思うのですが、これをすると、認証済みユーザーとしての権限を持った他のお店の人のページも更新ができることになりませんでしょうか? 

同じ認証済みユーザーでも、自分のページしか編集できないように権限設定できます。
「自分が作成したコンテンツのみ編集」とかそのような権限にすれば大丈夫です。

ユーザーが「記事の追加」から記事を書くのであれば、viewsを使って、ユーザーが書いたページを各ユーザーのprofileページに出すように処理すれば良いと思いますし、ユーザーが自身のprofileを編集して記事を書くのであれば、profile欄に入力用のフィールドを2つ用意しておいて、1つめのフィールドは1ページ目、2つ目のフィールドは2ページに表示するように制御すれば良いかと思いますが、ここらへんの具体的なやり方って事ですよね?

文字だけだで説明するの難しいですね^^;

その権限設定方法は

sakura-mama's picture

abechiyo2000 さんありがとうございます。
文字だけって難しいですが、素人の私にでも十分に伝わっています。とてもわかりやすいです!!!!

<同じ認証済みユーザーでも、自分のページしか編集できないように権限設定できます。

なるほど。できるのですね。それはどこから設定をするのでしょうか? 

<ここらへんの具体的なやり方って事ですよね?

そうです!!!! そなんです!!!!やりたいのが書いてくださった内容的にあるとおりのことなのですが具体的方法が真っ白なんです。
それと、profileを追加したユーザーページを誰でも見れるようにノードのように表示させることと、一覧で表示させる(多分viewでOK?)という方法も頭で理解しても方法が判らない、という情けない状態です。

<ユーザーが自身のprofileを編集して記事を書くのであれば、profile欄に入力用のフィールドを2つ用意しておいて、1つめのフィールドは1ページ目、2つ目のフィールドは2ページに表示するように制御

Profileも記事もお店の人が管理すると生るとこちらの方法の方がよいのでしょうか。もしそうならこちらの方法で進めたいです。

abechiyo2000's picture

ごめんなさいちょっと分からないのが、下記のようなページ構成で良いでしょうか。

<<館>> rootユーザー。 一般ユーザーのprofileページに出力される内容の承認を行う。

<<ショップ>> 認証済みユーザー。 ショップページを保有、内容を編集出来る。 2ページ作成しショップページに出力される。

<<一般ユーザー>>  認証済みユーザー。 2ページ作成し、一般ユーザーのprofileページに出力される。

説明が難しいですね。。。
時間ある時に試して、報告しますね。

他の方のHELPもお願いします!!w

構成

sakura-mama's picture

<<館>> rootユーザー。 一般ユーザーとショップのユーザー認証とprofileページに出力される内容の承認を行う。

<<ショップ>> 認証済みユーザー。 ショップページを2ページ保有、内容を編集出来る。 作成した2ページはショップページとして出力される。

<<一般ユーザー>>  認証済みユーザー。 ページ作成はしない。rootユーザーの作成した特定のページも閲覧できる権限を持つ。

こんな感じです。サイト構成は、
主な情報などを管理するページメインのページ・会員向け情報・amazonショップ・直販ショップ・登録店舗<<ここがショップにあたります>>
rootユーザーがメインのページなどを作成、管理、amazonショップ、直販のショップも運営、管理。
認証済みユーザがサイト内でショップページを2ページ保有。
一般ユーザは認証済みユーザーとして会員向け情報を閲覧可能。その他、どのページも利用可能。
です。

ちなみに、関係ないかもしれませんがテーマは既存のものをベースにカスタマイズして作成したものを使っています。

ってこんな感じです。
よく考えれば全くの素人がこういった込み入ったことをするのが無謀ですが、あとはショップの部分だけなんです。一つ紐解ければすんなりできそうな感じですが、その紐の先がつかめないって感じです。

他の方にもお声をかけてくださり有難うございます。本当に心強いです。

abechiyo2000's picture

あ、一般ユーザーはページを作成しないんですね。

そしたら「<<ショップ>> 認証済みユーザー。」は記事としてショップページを作成し、それをviews使って、各ショップユーザーのページに出力してあげれば出来ます。

しかし、一般ユーザーも認証済みユーザーとなれば、ショップと同じ権限で記事を作成出来る様になってしまうので、一般ユーザーを認証済みユーザー(デフォルト)、ショップユーザーに対して、新たにショップユーザーなどと言った役割を新たに作成し、ショップはショップユーザーを割り当てるのが良いと思います。

で、まずコンテンツタイプを「ショップ用記事(shopnode)」みたいなのを追加する。
次にviewsで各プロフィールページ(ショップページ)の下に各ユーザーが書いた記事を追加するんですが、
viewsの機能で「Configure contextual filter」って箇所があると思います。
ユーザーのfilterを追加して、そこにphpコードで下記を追加(うーん綺麗じゃないですね。。。w)

==補足==========================

Drupa6だとviewsの「引数」って箇所で設定していたのですが、、
7でみると無かったです。。。(厳密に言うとviewsのバージョン)
あれあれ??と思って、調べてみると(http://drupal.org/node/1127372)に乗ってました

==============================

$url = explode("=", $_SERVER['QUERY_STRING']); ##index.php?q=shop/shopnameでリダイレクトされているので、shop/shopnameを取得
$shopname = explode("/", $url[1]); ## shopnameを取得
return $shopname[1];

http://hoge.com/shop/shopnameみたいなurlだと
「shopname」の値が取れます、この値を記事を書いたユーザーと紐付ければ、このURLにアクセスしてきた時には、URLのショップユーザーが書いた記事だけが生成されます。

ちなみにURLの取得ですが、arg(1)で取ったほうが綺麗ですね。
http://api.drupal.org/api/drupal/includes--bootstrap.inc/function/arg/7
自分のテスト環境だとなぜか動作しなかったです。。。^^;

もっと良い方法はあるかもしれませんが、これでも動作します。

でviewsを使ってpageかblockを生成したら、それをprofileページに組み込むだけです。
よろしくどうぞ~

あ、っと

abechiyo2000's picture

それと上記に加えて、ユーザーを生成した時にデフォルトだとuser/1みたいなurlになってしまいますが、それだと上記が動作しないので、

pathautoモジュールを使って(http://drupal.org/project/pathauto)

「user/username」のようなURLに変えて変えて下さい。

よばれてとびでて。こんにちは。

jun784's picture

よばれてとびでて。どどどーん。

えっ、呼ばれてないですか・・・。

こんにちは、sakura-mamaさん、

ショップユーザーが2つまで記事を投稿できる機能のところになりますが、
役割やユーザー毎にノードの最大作成数を設定できるノードリミットというモジュールがあります。

まだdrupal7のバージョンはdev版しかないですが、仕様感的には問題ないと思います。

http://drupal.org/project/node_limit

ちなみに権限ページにある、以下の説明ですがちょっとわかりずらいので補足させて頂きます。

     
  • 記事: 新しいコンテンツを作成(新しい記事を投稿できる権限)
  •  

  • 記事: 自身が作成したコンテンツの編集(自分が投稿した記事を編集できる権限)
  •  

  • 任意のコンテンツを編集(他のユーザーが投稿したのも含めてすべての記事を編集できる権限)
  •  

  • 記事: 自分が作成したコンテンツを削除(自分が投稿した記事を削除できる権限)
  •  

  • 任意のコンテンツを削除(他のユーザーが投稿したのも含めてすべての記事を削除できる権限)

権限の設定
http://example.com/admin/people/permissions

役割の設定
http://example.com/admin/people/permissions/roles

ご参考まで。

Twitterやっています。
http://twitter.com/jun784
Drupalつながりでよろしければ、フォローお願いします。

なるほど

sakura-mama's picture

abechiyo2000 さん、ありがとうございます。
<そしたら「<<ショップ>> 認証済みユーザー。」は記事としてショップページを作成し、それをviews使って、各ショップユーザーのページに出力してあげれば出来ます。

つまりはページに出力しないとprofile の内容は一般公開されないということになりますか? 私は大ボケかましたかもしれません。つまり、profile で作成した内容はまんま公開される(誰でも閲覧可能)と信じて今日まできました。
ちなみに私の場合は、ユーザーページに行くと、そこにタグで
ビュー・編集・ファイル・Orders・ショートカット・コンタクト
というのができています。で、このビューはログインしなくても普通のノードと同じように閲覧できるのだと思っていたということえす。ログアウトした状態ではどうしてもこのユーザーページのビューが閲覧できなくて降参状態でした。

views使ってやってみようと思います。コンテンツタイプは作成したから後はphpコードで悪戦苦闘してみます。てか、現在苦戦中・・・
pathautoモジュールは使っています!!!使ってよかった~。

jun784 さん、
お待ち申し上げておりました!!!!的確なご指導ありがとうございます。
補足ありがとうございました。確かに判りにくいのでとても助かります。
又よろしくお願いします!!!いつでも、どどどーん、ととびでていただけるのをお待ちしております。
さくら

abechiyo2000's picture

説明ベタですみません。
ちょっと頑張って見て下さい。今度時間がある時にでもこのやり方をブログに上げますね。
(検索したらどこかのHPに出てくるかもですね~)

ありがとうございました

sakura-mama's picture

abechiyo2000 さん、ありがとうございました。
一つ解決したら一気に進みました。

あとは、ページを追加するところですがここは柔軟に対応することにしました。
今のところ
コンテンツタイプを作成してあるので、そこに商品を掲載してもらい、profile にリンクのフィールドを追加してそこにコンテンツタイプのページのリンクを管理者が入れて、ついでにその時に審査を許可→表示させる・・・という形にしました。

変更した理由は一つにはviewsの最初の設定が悪いのか、ユーザーとprofile のフィールドは追加できますが、コンテンツタイプにあるフィールドが追加できなかったこと、
審査を兼ねてどうせユーザーをチェックするのでその時にリンク先を追加するぐらいは手間でないことがありました。

あきらめてはいないので、abechiyo2000 さんのブログを拝見してから再度挑戦することにしました!!!!(笑)

また、jun784 さんの権限のご指導があってはじめから見直したら私のミスに気づきました。ありがとうございます。教えていただいたモジュールもこれから使ってみようと思います。感謝です!!!!

教えてくださいますか?

sakura-mama's picture

ブログはどこでしょうか? 教えてくださいますか? ぜひお邪魔したいです。
HPもお持ちなんですよね? 

今日は時間がなくて途中までしかできなかったので、明日以降にしっかりとやってみるつもりです。でも。。。。絶対にお力添えが必要な身ですので、また教えてくださいますか?

考えたら、このgroupでPersonalのページでプロフィールとか使ってますよね? ということは私の理解がもう少し深ければ難なくできそうなことなんだと思います。

こちらは、皆さん上級生の方ばかりですから、私のようなヘタレがド初級の質問をさせていただく前にもっと勉強しなきゃいかんです。

abechiyo2000's picture

この手法はDrupal6の時に使った事があって、D7で試したら、動かない動かない。。。しかもviewsがすごい変わっている。。。
で、久しぶりにはまりました。。。^^;

で、やり方は、
patuautoを有効にする

●ホーム » 管理 » 環境設定 » 検索とメタデータ » URLエイリアス » PATTERNS
 [Pattern for user account page paths ]
 user/[user:name]

hoge.com/user/shopnameでユーザープロフィールページにアクセス出来る。

●views
 新しいpageかブロックを追加する。
 viewsの「advanced >> RELATIONSHIPS」から「コンテンツ: 投稿者」を追加
 「advanced >> CONTEXTUAL FILTERS」から「ユーザー: 名前」を追加

  「Provide default value」にチェックを入れ、タイプを「php code」に変更。

  で、以下のコードを入れる

global $user;
$url = explode("/", $_GET['q']);

if(isset($url[1])){
$user_info = user_load($url[1]);
return $user_info->name;
}else{
return "noresult";
}

あとはviews保存して、profileのページに作成したviewsをブロックかページで取り込むだけです。

で、ブログは恥ずかしいので公開しないですね~^^;
もう少しまともなブログになったら公開します!

abechiyo2000's picture

あ、そうだ。
だれか分かる人いたら教えてほしいんですが、viewsでphpコード入力欄があるかと思うのですが、arg(0)が使え無くなくなっている?
私の環境だけなのか、やり方があるのか分かるかた居たら教えて下さいです。

argが使えなかったので、汚いソースになってしまいました。
よろしくどうぞ

僕は問題なくできています。 devel

dokumori's picture

僕は問題なくできています。
devel をインストールして、dsm(arg()); と入力してみてください。
(print_r() でも全然構わないのですが、krumoのほうが見やすいので。)
Views の管理画面のプレビューだと、ajax コールがあったパスの要素が表示されると思います。そのビューが埋め込まれているページや、そのビューのページディスプレイを表示すると、そのパスの要素が表示されるはずです。つまり、プレビューと実際の画面ではパスが異なるので、プレビュー内で実際にそのビューが使われるページの動作確認をするのが難しい状態なのだと思います。これは6.x-2.x のときから変わっていないと思います。
もし見当違いだったらごめんなさい。その場合は設定の具体的な内容などを教えてもらってもよいですか。

abechiyo2000's picture

dokumomriさん、レスありがとうございます。

dsm(arg());便利ですね。ありがとうございます。

arg()確認しました。ちょっと勘違いしておりまして、pathautoでURL書き換えていたので、見た目は「/user/shopname」でも、内部的なクエリは「/user/3」でした。
なんでarg(1)で「3」が取得できていました。

なんでmamaさん、コードは以下の方が見た目綺麗ですね(笑)
どちらでも動きますがね。

if(isset(arg(1))){
$user_info = user_load($arg(1));
return $user_info->name;
}else{
return "noresult";
}

バグだそう・・・・

sakura-mama's picture

ありがとうございます!!!!!

if(isset(arg(1))){
$user_info = user_load($arg(1));
return $user_info->name;
}else{
return "noresult";
}

ですが、ご指導の通りにコード入力をしてみると、バグって結果になります。
で、ちなみに前のレスのコードを入れてみたらviewsの保存までできました。

前のコードで不具合がなければこれで行きたいと思いますがどんなもんでしょうか。

すいません。個人的なブログの事を聞いたりしちゃって申し訳なかったです。

abechiyo2000's picture

ああー二行目のarg(1)の前の$がいらないですね・・・

動きはどちらも同じになるんで、どちらでもいいですが、
個人的には、arg()使ったほうが好きです。

すいません。

sakura-mama's picture

他の事で問題が起きてゴタゴタしていてすっかり放置状態になってました。
全く関係ないのですが、ノートPCのリカバリーの内容を違うパソコンのリカバリーを使ってリカバリーしちゃったために、ノートPCが動かなくなりました。修復しようと思ったけど、あたくしに判るわけないじゃん?と思いつつ修復作業に時間を費やしたのであります。
間違ってリカバリーをしたのは私じゃないですけど。今も使えないまま・・・ほとんど新品なのに。くくっ。。。

ということで、やっとこちらに取り掛かかり始めたのですが、arg()を使ったコードでバグってなった時に前述していただいたコードを上書きして保存しました。でも、arg()を使ったコードに戻そうと思ったら何故か上書きできず、前述コードに戻ってます。
できるという事なのでこれでやるしかないみたいですが、コードが上書きされないというのが問題にならなければいいのですが。。

とにかく、あと一歩です

と思ったらエラー。。。。
Fatal error; can't use function return value in write context in/virtual/***/site/all/modules/viers/plugins/views_plugin_argument_default_php.inc(49) : eval()'d on line i
だそうです。

Japan

Group organizers

Group categories

Group notifications

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

Hot content this week