все форумы все темы добавить тему
Класс комментариев
Начал проектировать класс для работы с комментариями. Пришлось немного поломать голову, чтобы он сравнительно легко интегрировался с модулями
Но, в общем, постепенно начинает вырисовываться.
Для хранения комментариев принято решение использовать структуру 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 пользователей),
                  пожаловавшихся на этот комментарий
 

 
Что радует, удалось избежать передачи ключа материала практически везде, кроме запроса списка комментариев и удаления всех комментариев. Так что серьезных переделок в модулях, вроде бы, не потребуется.
 
Если есть вопросы (а они наверняка есть ) - милости прошу.