
Но, в общем, постепенно начинает вырисовываться.
Для хранения комментариев принято решение использовать структуру nested sets. Она позволяет избежать рекурсии и вообще построить дерево одним запросом. Правда, у нее есть и свои ограничения. Например, она не позволяет строить лес (то есть несколько деревьев сразу). Чтобы обойти это ограничение, пришлось ввести суррогатный пустой комментарий. Но в общем-то это даже не плохо - теперь комментарии почти не имеют жесткой связи с модулями.
Попробую немного описать как это работает. Вопросы и комментарии приветствуются.
При запросе комментариев модуль передает суррогатный ключ, уникальный в пределах модуля, и url страницы.
ключ может быть как просто числовым (например, в модуле новостей можно просто передать id новости), так и составным (например, страница с альбомом 'album_1', а страница с фотографией альбома - 'image_1').
url нужен для того, чтобы можно было узнать на какой странице размещен комментарий (например, при модерации).
Метод LabComments::getComments($key, $url) возвращает массив вида
Text
array
'add_id' => 2 //id скрытого комментария. Будет использоваться
ля ссылки "добавить комментарий"
'comments' => //непосредственно массив пользовательских комментариев
array
0 =>
array
'comment_id' => 3
'text' => '[b]test[/b]'
'text_html' => '<b>test</b>' //не уверен до конца надо ли хранить
распарсенные комментарии или рассчитывать на кэширование выборки
'putdate' => '0000-00-00 00:00:00'
'user_id' => 1
'login' => 'user' //пока рассматриваю вариант хранения логинов
и для зарегистрированных пользователей тоже, так как логины
в системе не меняются, а таблицу пользователей не придется дергать
при каждой выборке
'email' => 'email@domain.com'
'status' => 1 //статус комментария. Пока что придумал следующие статусы:
ожидает модерации, опубликован, удален автором, удален модератором, скрыт.
'level' => 1 //уровень вложенности дерева. Начинается с 1,
так как уровень вложенности 0 имеет скрытый комментарий
'leaf' => true //ключ, показывающий что данный элемент не имеет наследников.
Это для удобства построения дерева.
'moderate' => array //массив пользователей (или массив id пользователей),
пожаловавшихся на этот комментарий
Что радует, удалось избежать передачи ключа материала практически везде, кроме запроса списка комментариев и удаления всех комментариев. Так что серьезных переделок в модулях, вроде бы, не потребуется.
Если есть вопросы (а они наверняка есть
