Продолжая предыдущую тему, анонсирую публикацию новой версии пакетов 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 как средство разработки — тот вообще не ошибся :-) UPD: Проекты на Гитхабе: github.com/Fi1osof/modSociety github.com/Fi1osof/modBlog Установочные пакеты можно скачать из моего репозитория rest.modxstore.ru/extras/