Продолжая предыдущую тему, анонсирую публикацию новой версии пакетов modBlog и modSociety для построения блого-социальных сайтов на MODX Revolution.
Опять-таки, для начала видео-демка.
Что нового? В прошлой версии еще только блоги создавались без всяких топиков.
В новой версии добавлены топики, то есть уже какой-то намек на структуру. Уже можно создавать блоги и топики. Но это все еще заготовка, так как редактировать блоги и топики пока можно только в админке, и нет еще главного — комментариев и голосов.
Тем не менее уже есть немало фишек, о которых я хочу поведать.
1. Блоги и топики как бы не связаны между собой, то есть Блог — это один тип документов, а Топик — другой. При этом топик не обязан быть дочерним ресурсом именно для блога, он может находиться где угодно в структуре. То есть такая модель позволит легко встраиваться в любой готовый сайт со своей особенной структурой.
2. Связи Блог-Топик содержатся в отдельном объекте SocietyBlogTopic. При этом топик может быть привязан сразу к нескольким блогам (как на Хабре). Если топик не привязан ни к одному блогу, то он считается топиком из личного блога автора.
3. Весь код написан на 100% MODX-технологиях с использованием xPDO. В результате код получается очень сжатый, и гарантируется совместимость с любыми компонентами, использующими xPDO-методы.
К примеру, чтобы получить все блога сайта, можно выполнить вот такой запрос:$q = $modx->newQuery('modResource');
$q = $modx->newQuery('modResource'); $q->where(array( 'published' => true, 'class_key' => 'SocietyBlog', )); $blogs = $modx->getCollection('modResource', $q);
А теперь получим все топики этих блогов
foreach($blogs as $blog){ // Получаем связки Блог-Топик $blogTopics = $blog->getMany('BlogTopics'); // Проходим по каждой связке foreach($blogTopics as $blogTopic){ // Получаем топик $topic = $blogTopic->getOne('Topic'); // Выводим информацию о топике в массив print_r($topic->toArray()); // Получаем ссылку на топик $url = $topic->makeUrl(); } }
Для удобства разработчиков (чтобы не путались), я ввел специальные методы:
$modx->modblog->getBlog(); $modx->modblog->getBlogs(); $modx->modblog->getTopic(); $modx->modblog->getTopics();
Это как $modx->getObject() и $modx->getCollection(), только сразу подставляет критерии class_key, чтобы точно получить именно блоги или топики.
В качестве параметра можно передавать $criteria. К примеру:
$blogs = $modx->modblog->getBlogs(array( 'published' => true, 'parent' => 12, ));
Вернет только опубликованные блоги, и только те, для которых родительский раздел имеет ID=12.
Или вот так:
$q = $modx->newQuery('modResource'); $q->where(array( 'published' => true, )); $blogs = $modx->modblog->getBlogs( $q); foreach($blogs as $blog){ $author = $blog->getOne('CreatedBy'); print "<br />Блог создал: ". $author->get('username'); }
Таким образом, учитывая формат Хабра и Livestreet, что не взирая на структуру, выводятся просто топики в обратном хронологическом порядке, можно не парясь о структуре выводить все топики, получив через метод
$q = $modx->newQuery('modResource'); // Сортируем по дате публикации в обратном порядке $q->sortby('publishedon', 'DESC'); $topics = $modx->modblog->getTopics( $q);
4. Вывести все топики, или топики из определенного блога, или определенного пользователя, или определенного пользователя в определенном блоге, можно используя сниппет BLOG_topicsList.
К примеру [[!BLOG_topicsList?user_id=2&blog_id=7]]
В общем, MODX действительно себя показывает как очень мощная платформа для разработок. У меня код установщика (который сразу создает все политики, группы пользователей, настройки, структуру и т.п.), наверно больше, чем весь код работающего компонента (в сумме в modBlog и modSociety кода строк так 1000 всего). Я вам точно говорю, что для той логики, которая уже сейчас есть, 1000 строк — это очень-очень мало. Так что кто для себя выбрал MODX как средство разработки — тот вообще не ошибся :-)
Установочные пакеты можно скачать из моего репозитория rest.modxstore.ru/extras/