Как создать представление непрочитанных комментариев на собственных узлах для страницы профиля пользователя?


Я хотел бы создать представление для страницы профиля пользователя, на котором отображаются все непрочитанные комментарии на созданных им узлах. Когда я говорю "непрочитанный", я имею в виду, что страница, на которой находится комментарий (а именно страница узла), еще не была посещена пользователем. Другими словами: когда пользователь не прочитал новый комментарий, он будет отображаться в представлении; как только пользователь прочитает его, он исчезнет в представлении.

Я уже настроил представление, которое просто отображает все комментарии к узлам пользователя, но я не могу найти дополнительные "Критерии фильтрации" или "Отношения", которые отфильтровывают непрочитанные.

Вы можете мне помочь?


Редактировать: Я создал флаг под названием "Читать" ("Reactie gelezen" на голландском языке) с модулем флага и правилом "Чтение комментариев", которое автоматически помечает комментарии "Читать" при их просмотре. Я также предоставил каждому пользователю разрешение помечать комментарии флагом "Читать" (хотя они не будут видеть ссылки на флаги выше их комментария, конечно).

Мое правило работает отлично, и пометка также работает вручную. Однако представление работает неправильно. Вот мои настройки:

Settings view

Обоим идентификаторам uid было предоставлено значение по умолчанию "Идентификатор пользователя из URL".

Что я сделал не так?

Author: Jeroen, 2013-10-10

1 answers

Модуль флага хранит в базе данных только строки для содержимого, для которого установлен флаг. Т.е. когда что-то не помечено , в базе данных не будет соответствующей строки.

Проблема в том, что представления будут генерировать запрос, который выглядит примерно так (для пользователя с 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'

Однако для того, чтобы выбрать все комментарии для данного пользователя, исключая те, которые не помечены , вам потребуется 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-флаги в связанных комментариях (по сути, это то же правило, которое у вас уже есть, за исключением того, что вам нужно изменить логику пометки).
  • Настройте представление так же, как вы делали это раньше, но удалите фильтр flagged=false, вместо этого настройте связь флагов таким образом, чтобы включалось только помеченное содержимое.
 2
Author: znerol, 2013-11-03 14:52:14