blogモジュールにて。ブロックにブログの投稿者を表示させたい

Events happening in the community are now at Drupal community events on www.drupal.org.
sorewaeco's picture

お世話になります。

最近drupalを始めました。

環境はdrupal7です。

blogモジュールにて。viewsを使ってブロックにブログの投稿者を表示させたいのですが、
adminだけ表示されません。他のユーザーは表示されています。

viewのクエリー

SELECT users_node.uid AS users_node_uid, users_node.picture AS users_node_picture, users_node.name AS users_node_name, users_node.mail AS users_node_mail
FROM
{node} node
LEFT JOIN {users} users_node ON node.uid = users_node.uid
WHERE (( (node.nid = '1' ) )AND(( (node.status = '1') AND (node.type IN ('blog')) )))
---------------------------まで

なぜでしょうか?

表示されないので、ブロックに直接コードを書いて拾ってみようかと思ったのですが記事単体だとnodeからuidが拾えるのですが、https://xxx.xxx/blog/1等のブログ一覧だと拾えません。

ブロックのコードは

if ($node = menu_get_object()) {
$nid = $node->nid;
print 'ノードid'.$nid;
print 'ユーザーid'.$node->uid;
}
---------------------------まで

どなたかご教示頂ければ幸いに存じます。

Comments

追記です。

sorewaeco's picture

viewsの方は、

1,リレーションシップ
コンテンツ:投稿者

2,前後関係からみたフィルター
コンテンツ: ノードID

フィルター値が利用可能でない時
デフォルト値を指定 - URLから取得したユーザーID - ノードを調べてノードの作成者を使用するにチェック

 例外に%

フィルター値が利用可能あるいはデフォルトが与えられている時
検証の条件を指定にチェック
バリデーターをユーザー

許可するユーザーフィルター値のタイプ
数値によるユーザーIDの指定のみ許可

にしてあります。

hgoto's picture

お世話になります。

解決しようとされている問題について、もう少し詳しく確認させてください。問題は何なのでしょう?

  • Views ブロックで現在表示中のノードの投稿者を表示したいが、投稿者が admin の場合のみ、他のユーザでページを閲覧するとそのブロックが表示されない。(それとも、投稿者が admin だと admin でページを閲覧してもブロックは表示されないのでしょうか?)

という問題なのでしょうか。それとも

  • 記事が複数件表示されるページ or URL でノードの投稿者をすべて表示したいが、 if ($node = menu_get_object()) {... で書いてくださっているコードが uid を出力しない。(それとも uid だけでなく nid も出力されない?)

というところなのでしょうか?

パッと拝見した印象では、前者であれば権限周りの問題かなと思います。後者であれば menu_get_object() がノードオブジェクトが返してくれていないのかなと思いますがいかがでしょう。

hgoto様

sorewaeco's picture

hgoto様

早速の返信ありがとうございます。

なぜかここにブロックされて書き込めず返信が遅くなりました。

書き方が悪くすいませんでした。

まず、やりたい事は

・https://xxx.xxx/user/1/ のプロフィール?画面

・https://xxx.xxx/blog/1/ ○○さんのブログ一覧

・https://xxx.xxx/node/xx/ 各記事

に常時ブロックで○○さんが書いた記事(持ち物)ですよと分かるようにプロフィールを表示させたいのです。

viewsでadminだけが表示されなれないと思っていたのですが勘違いしていました、他のユーザーも表示されません。

viewsでやりたい事が実現出来なかったのでブロックに直接コードを書いてみたと言う事なのです。
(なぜか特定のユーザーだけが表示されます…)

それとも、投稿者が admin だと admin でページを閲覧してもブロックは表示されないのでしょうか?

そもそも私が勘違いしていたようです。新規でアカウントを数個作ったのですがadminだけと言うわけでなく、表示されるアカウントと表示されないアカウントが出てきました。色々試しているのですが原因が分からず上手くいきません…

パッと拝見した印象では、前者であれば権限周りの問題かなと思います。後者であれば menu_get_object() がノードオブジェクトが返してくれていないのかなと思いますがいかがでしょう。

その通りです。menu_get_object()でノードが返ってきません。何か実現する方法はあるのでしょうか?
blogモジュールは https://xxx.xxx/blog/1/ ○○さんのブログ一覧 で名前が出ているので簡単に拾えるものかと思っておりました。

後学の為にviewsで実現する方法と、ブロックに直接phpのコードを書き込む方法での解決をしたいと考えております。

宜しくお願い致します。

sorewaeco

hgoto's picture

sorewaeco 様

ご丁寧にご説明くださりありがとうございます。実現されたいことと問題のポイントについて理解できました。以下、 Views で実現する方法と php コードを書き込む方法について順番にご説明してみたいと思います。

まず Views で実現する方法につきまして。

私の環境で再現してみたところ、最初の投稿でご説明くださった方法で特に問題ないのかな・・・と思いました。ご参考までに私の Views ビューをエクスポートしたコードを貼り付けますので、インポートしてお試しいただければと思います。

  • Views ブロック。
  • ブロック内に uid 、ユーザ名、画像を表示。
  • コンテクスチュアルフィルタで「 User id 」を選択しオプションで「 Provide default value 」「 User ID from URL 」を選択。「 Also look for a node and use the node author 」にチェックを入れる。

    $view = new view();
    $view->name = 'blog_author';
    $view->description = '';
    $view->tag = 'default';
    $view->base_table = 'users';
    $view->human_name = 'blog_author';
    $view->core = 7;
    $view->api_version = '3.0';
    $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */

    /* Display: Master /
    $handler = $view->new_display('default', 'Master', 'default');
    $handler->display->display_options['title'] = 'blog_author';
    $handler->display->display_options['use_more_always'] = FALSE;
    $handler->display->display_options['access']['type'] = 'perm';
    $handler->display->display_options['access']['perm'] = 'access user profiles';
    $handler->display->display_options['cache']['type'] = 'none';
    $handler->display->display_options['query']['type'] = 'views_query';
    $handler->display->display_options['exposed_form']['type'] = 'basic';
    $handler->display->display_options['pager']['type'] = 'none';
    $handler->display->display_options['style_plugin'] = 'default';
    $handler->display->display_options['row_plugin'] = 'fields';
    /
    Field: User: Name /
    $handler->display->display_options['fields']['name']['id'] = 'name';
    $handler->display->display_options['fields']['name']['table'] = 'users';
    $handler->display->display_options['fields']['name']['field'] = 'name';
    $handler->display->display_options['fields']['name']['label'] = '';
    $handler->display->display_options['fields']['name']['alter']['word_boundary'] = FALSE;
    $handler->display->display_options['fields']['name']['alter']['ellipsis'] = FALSE;
    /
    Field: User: Uid /
    $handler->display->display_options['fields']['uid']['id'] = 'uid';
    $handler->display->display_options['fields']['uid']['table'] = 'users';
    $handler->display->display_options['fields']['uid']['field'] = 'uid';
    /
    Field: User: Picture /
    $handler->display->display_options['fields']['picture']['id'] = 'picture';
    $handler->display->display_options['fields']['picture']['table'] = 'users';
    $handler->display->display_options['fields']['picture']['field'] = 'picture';
    /
    Sort criterion: User: Created date /
    $handler->display->display_options['sorts']['created']['id'] = 'created';
    $handler->display->display_options['sorts']['created']['table'] = 'users';
    $handler->display->display_options['sorts']['created']['field'] = 'created';
    $handler->display->display_options['sorts']['created']['order'] = 'DESC';
    /
    Contextual filter: User: Uid /
    $handler->display->display_options['arguments']['uid']['id'] = 'uid';
    $handler->display->display_options['arguments']['uid']['table'] = 'users';
    $handler->display->display_options['arguments']['uid']['field'] = 'uid';
    $handler->display->display_options['arguments']['uid']['default_action'] = 'default';
    $handler->display->display_options['arguments']['uid']['default_argument_type'] = 'user';
    $handler->display->display_options['arguments']['uid']['default_argument_options']['user'] = TRUE;
    $handler->display->display_options['arguments']['uid']['summary']['number_of_records'] = '0';
    $handler->display->display_options['arguments']['uid']['summary']['format'] = 'default_summary';
    $handler->display->display_options['arguments']['uid']['summary_options']['items_per_page'] = '25';
    /
    Filter criterion: User: Active */
    $handler->display->display_options['filters']['status']['id'] = 'status';
    $handler->display->display_options['filters']['status']['table'] = 'users';
    $handler->display->display_options['filters']['status']['field'] = 'status';
    $handler->display->display_options['filters']['status']['value'] = '1';
    $handler->display->display_options['filters']['status']['group'] = 1;
    $handler->display->display_options['filters']['status']['expose']['operator'] = FALSE;

    /* Display: Block */
    $handler = $view->new_display('block', 'Block', 'block');

「ユーザによって表示される/されない」という違いは Views よりも権限周りで発生するケースが多いので、そのあたりを確認してみられるのがよいかもしれません。今回の Views ビューの出力結果を閲覧するには閲覧ユーザが「 View user profiles 」という権限を持っている必要がありますので、この権限が正しく付与されているどうかいま一度ご確認いただければと思います。

続いて、 PHP を書く( menu_get_object() を使う)方法につきまして。

menu_get_object()でノードが返ってきません。何か実現する方法はあるのでしょうか?

menu_get_object() は少しややこしくって、今回の場合ですと 2 通りの使い方をする必要がございます。

このケースでは xx の部分はノード id なので menu_get_object() で問題なくノードオブジェクトを取得することができます。

他方、これらのケースでは「 1 」の部分はノード id ではなくユーザ id なので、 menu_get_object() に引数を渡してあげる必要があります。具体的にはそれぞれ以下のとおりにします。

  • user/1 の場合: menu_get_object('user')
  • blog/1 の場合: menu_get_object('user_uid_optional')

PHP コードを書き込むブロックの中身( PHP コード)を一度以下のように変えていただければ、各ページでどういう動きになっているのかをご確認いただけるものと思います。よろしければお試しください。

if ($node = menu_get_object()) {
  print 'ノードが取得できました';
  dpm($node);
}
elseif ($user = menu_get_object('user')) {
  print 'ユーザが取得できました( user )';
  dpm($user);
}
elseif ($user = menu_get_object('user_uid_optional')) {
  print 'ユーザが取得できました( user_uid_optional )';
  dpm($user);
}
else {
  print '何も取得できませんでした...';
}

dpm() を使用するには devel モジュールが必要です)

ご質問への回答になっておりますでしょうか。ご参考になれば幸いです。

menu_get_object() のページに引数についての解説やノード以外のオブジェクトを読み込むサンプルなども載っていますので、こちらもよろしければご参考になさってください。

hgoto 様

sorewaeco's picture

色々試しておりましたら返答が遅くなってしまいました。
申し訳ありませんでした。

hgoto様に頂いたソース等で間違いなく動きました!とても丁寧な解説で私の様な初心者でも非常に分かりやすく学ばせて頂いてます。

viewsの方も権限周りではなく、設定がhgoto様に頂いた物と違ったらしく同様にチェックしたらバッチリでした。

devel モジュールもインストールして、こんな便利な物があるのかと驚き、もっと早くdrupalに出会って勉強していればよかったと後悔しております。

バージョンも8がリリースされるみたいなので7、8共に勉強したいと考えております。

今後ここのdrupalグループで質問させて頂く事もあるかと思いますが宜しくお願い致します。

hgoto's picture

ご丁寧にご返信くださりありがとうございます。こちらの方こそ返信が遅くなり申し訳ございません・・・

まずは無事解決されたとのことでよかったです!

そうですね、 Drupal はコアからもコントリビュートモジュールからもいろんなことを学べるのでおもしろいですよね。私も学んでも学んで新たな発見があり日々勉強です。

こちらこそ宜しくお願いいたします。

日本 コミュニティ: Drupal Japan User Group

Group organizers

Group categories

Group notifications

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