Posted by wataru.kato on February 4, 2014 at 5:07am
Drupal7です。
投稿されるコンテンツ数が増えはじめまして、コンテンツに対するコメントの投稿を追い切れない、
という問題が出てきました。
そこで機能要望として、
・そのときログイン中のユーザーを絞込条件にして、
トップページもしくはページ遷移時に「〇〇さんの××記事に、コメントがあります!」という
お知らせ表示を出したい
という要望が出てきました。
これは私なりに考えると、
あ)Viewを、ログインユーザーで絞り込み
⇒Viewの絞り込み条件に、それらしき選択肢が出てこなかった・・・
い)専用のモジュール
⇒Comment Notify など見つけましたが微妙に違う様子
う)PHP Codeでログインユーザーを条件にした集計メッセージを表示するブロックを作成して利用
⇒これは最後の手段で考えてます、PHPが不案内なもので
などのアプローチがあると思うのですが、
似たような機能を付けたことがある方はいらっしゃいませんでしょうか。
Comments
Contexual Filter
これはViewsのContexual Filterを使うピッタリの場面ですね。
URLからのArgumentではなく、デフォルトバリューを設定します。
注意点は予めリレーションが必要というところです。
1)Relationshipを追加
Content: Author を追加
2) Contexual Filterを追加
(author) User: Uid を追加
設定で
Relationship > Author を選ぶ
WHEN THE FILTER VALUE IS NOT IN THE URL > Provide default value > User ID from logged in User を選ぶ
これで、ログインしたユーザーが投稿者のNodeを絞り込めます。
Drupal6ではRelationが不要でしたが、Drupal7では改めて設定する必要があります。
上手く行ったら手順を公開して、後の人へのコントリビュートとしてください。
よろしくお願いします。
出来ました!に、関連して追加質問
>qchan様
有難う御座います。 2)の設定は使いこなしていませんでした。
おかげで「ログイン中ユーザーが投稿した記事に対して1週間以内にコメント投稿があった記事の一覧」のビューができました。
これは時間を作って手順を投稿します。
これに続けてもう1段階進めたいのですが、
DrupalでViewでデータを絞り込めた際に、その「件数」や「特定フィールドの合計数」を表示に使う書き方をどなたかやっていませんでしょうか。
要は今回の結果を元に「〇〇様には最近n件のコメントがあります!」表示を実現したいです。
Viewでやるのは、大仕掛けすぎるのでしょうか。
私としては慣れてきたのでViewでやってみたい所です。
これの結論を出して、まとめてTIPSとして投稿したいです。
解決方法
追加質問の件、「Use aggregation」を有効にして解決する方法が判りましたので、
元の手順含めて報告します。
あ)ログインユーザーを絞込条件にしたViewを作る
例)ログインユーザーの投稿したコンテンツに対して、過去1週間以内にコメントがあった分の一覧
1)コンテンツのビューを新規作成
2)Display=ページ に対して以下設定
「フォーマット」
フォーマット: Unformatted list (グループ設定はしない)
表示: フィールド
「フィールド」
コンテンツ: Nid
「Filter Criteria」
コンテンツ: 掲載=はい
コンテンツ: Last comment time (> -1 week)
コンテンツ: コメント数 (> 0)
「PAGER」
Display all items | All items
3)続けて「リレーションシップ(Relationship)」を以下設定
コンテンツ: 投稿者(Author)
4)続けて「前後関係からみたフィルター(Contexual Filter)」を以下設定
コンテンツ: Author uid
⇒続く設定画面で、
・WHEN THE FILTER VALUE IS NOT IN THE URL の項目に対して、
「Provide default value」 = "User ID from logged in user"
を設定
⇒以上で、ノードIDだけの一覧を表示するViewが作成できる
い)「n件の記事にコメントがあります」表示にする
例)Display=ページでも出来たが、今回はDisplay=コンテキスト で作る例
1)同じViewで、新たに「Display」=コンテキスト を追加
⇒「フォーマット」=コンテキスト に変更される (やはりグループ設定はしない)
2)「高度>その他>Use aggregation」=はい、に設定
(Aggregate=有効にする)
3)設定画面内の個々のフィールド項目に全て「Aggregation settings」が付く
4)「フィールド」=コンテンツ: Nid の「Aggregation settings」を選択
・「Aggregation Type」=回数(Count) を選択 ※Sum、Averageもある
⇒「フィールド」=COUNT(コンテンツ: Nid) に表示が変わる
5)「フィールド」に2つ「Global: Custom text」を追加し、それぞれに前後の文言を入力
「最近1週間の間に」「件のコメントがあります。」
6)「フォーマット>表示>フィールド>環境設定」を選択し、
・「Provide default field wrapper elements」=有効
「インラインフィールド」=全てチェック
・「Separator」=半角空白文字
⇒以上で確定すると、Viewのプレビューからも
「最近1週間の間に 4 件のコメントがあります。」
という表示ができました。
私はこれをパネルで配置しました。
Good Job!!
Good Job!!
新着コメントの数
Viewsには、フィールド「コンテンツ:新しいコメント」という項目もあるので、それを使えば実現できそうです。新しいコメントが1件、2件という形で、ユーザーが最初に見たときだけ、「新しいコメント数」のみを知らせる事ができます。この機能だと、1度ユーザーが確認した後は、消失します。
接頭語に「新しいコメントが」と入れて、接尾語に「件あります」とやると、新しいコメントを「新しいコメントが2件あります」という形でお知らせするブロックができあがると思います。
それと一緒にフィールドに今見ているユーザーを表示するようにすれば、「○○さん 新しいコメント2件あります」ともなりそうです。もしくは、Menu Badgesというモジュールもあるようです。
試しました
>nobuyuki3 様
情報有難う御座います。
1つ目、「コンテンツ:新しいコメント」があることを確認しました。
ですが、今回はコンテンツ1つに対してより、ユーザー1人に対しての新着コメント、が欲しい表示だったので、この方法は今後の参考にさせて頂きます。
2つ目、Menu Badges は初めて知りましたが、Link Badgesも含めてインストールして動作確認できました。
表示がかっこいいですね。各メニューやタブに表示を付けられるのはスマートです。
これも別途利用を検討したいです。
(1メニュー⇒1ビュー(Menu Badges)を作る必要があるのがちょっと大変ですが)
そして2つ目を検討する途中で、Viewの「Use aggregation」を有効にするとカウント集計等ができることを見つけました。
これが欲しかった機能に近いです。
後で別コメントにこっちの方法のまとめを投稿します。