web-dev-qa-db-ja.com

ユーザーのプロフィールページの自分のノードに未読コメントのビューを作成するにはどうすればよいですか?

ユーザーが作成したノードのすべての未読コメントを表示するユーザーのプロファイルページのビューを作成したいと思います。 「未読」とは、コメントが配置されているページ(ノードのページ)がユーザーによってまだ訪問されていないことを意味します。つまり、ユーザーが新しいコメントを読んでいない場合は、ビューに表示されます。ユーザーがそれを読むと、ビューに表示されなくなります。

ユーザーのノードのすべてのコメントを表示するだけのビューを既に設定しましたが、未読のものを除外する追加の「フィルター基準」または「関係」を見つけることができません。

手伝って頂けますか?


編集:Flag モジュールとルールを使用して、「Read」(オランダ語では「Reactie gelezen」)というフラグを作成しましたコメントが表示されたときに自動的に「既読」のフラグを付ける「コメント既読」。また、すべてのユーザーに 'Read'フラグでコメントにフラグを付ける権限を与えました(もちろん、コメントの上にフラグリンクは表示されません)。

私のルールは完全に機能し、フラグ付けは手動でも機能します。ただし、ビューは正しく機能しません。これらは私の設定です:

Settings view

両方のuidにデフォルト値「URLからのユーザーID」が提供されました。

何を間違えたのですか?

6
Jeroen

Flagモジュールは、フラグが設定されているコンテンツの行のみをデータベースに保持します。つまりnotのフラグが立てられている場合、データベースには対応する行がありません。

問題は、ビューが次のようなクエリを生成することです(uid=12のユーザーとfid=1のフラグの場合)。

SELECT cid FROM comment AS c
INNER JOIN node AS n ON c.nid = n.nid
LEFT JOIN flagging AS f ON c.cid = f.entity_id AND f.fid = '1'
WHERE n.uid = '12' AND f.uid = '12'

ただし、notフラグが付けられているコメントを除く、特定のユーザーのすべてのコメントを選択するには、SQLサブクエリが必要です。

SELECT cid FROM comment AS c
INNER JOIN node AS n ON c.nid = n.nid
WHERE n.uid = '12' AND c.cid NOT IN (
    SELECT f.entity_id FROM flagging AS f
    WHERE f.fid = '1' AND f.uid = '12'
)

AFAIKビューには、サブクエリの組み込みサポートがありません。したがって、ロジックを逆にして以下を実装することをお勧めします。

  • コメントフラグを追加is_new
  • 新しいコメントが投稿されるたびに、コンテンツ作成者に代わってこのフラグを設定するルールを実行します。
  • ノードが作成者によって表示されるときは常に、関連するコメントのすべてのis_new- flagsを削除するルールを実行します(これは、フラグ付けロジックを逆にする必要があることを除いて、基本的には既に持っているルールと同じです)。
  • 以前と同じようにビューを構成しますが、flagged=falseフィルターを削除し、代わりにフラグ関係を構成して、フラグが立てられたコンテンツのみが含まれるようにします。
2
znerol