Релиз modSociety-1.1.0-beta и modBlog-1.1.0-beta

Продолжая предыдущую тему, анонсирую публикацию новой версии пакетов modBlog и modSociety для построения блого-социальных сайтов на MODX Revolution.

Опять-таки, для начала видео-демка.


Что нового? В прошлой версии еще только блоги создавались без всяких топиков.
В новой версии добавлены топики, то есть уже какой-то намек на структуру. Уже можно создавать блоги и топики. Но это все еще заготовка, так как редактировать блоги и топики пока можно только в админке, и нет еще главного — комментариев и голосов.

Тем не менее уже есть немало фишек, о которых я хочу поведать.

1. Блоги и топики как бы не связаны между собой, то есть Блог — это один тип документов, а Топик — другой. При этом топик не обязан быть дочерним ресурсом именно для блога, он может находиться где угодно в структуре. То есть такая модель позволит легко встраиваться в любой готовый сайт со своей особенной структурой.

2. Связи Блог-Топик содержатся в отдельном объекте SocietyBlogTopic. При этом топик может быть привязан сразу к нескольким блогам (как на Хабре). Если топик не привязан ни к одному блогу, то он считается топиком из личного блога автора.

3. Весь код написан на 100% MODX-технологиях с использованием xPDO. В результате код получается очень сжатый, и гарантируется совместимость с любыми компонентами, использующими xPDO-методы.
К примеру, чтобы получить все блога сайта, можно выполнить вот такой запрос:
$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/

13 комментариев

avatar
Спасибо за труды.
avatar
Пожалуйста.
avatar
Отлично! Уже вырисовывается некий базис с которым можно экспериментировать. Осталось только добавить комментарии и уже будет совсем похоже. :-)

На самом деле все очень круто получается с правами, похоже.

Но, я как обычно с разными вопросами по пристаю практическими…

1) Выше код приведен как получить список топиков для блога. Понятно, что там промежуточная таблица для связи N-N, вот кусок:

// Получаем связки Блог-Топик
    $blogTopics = $blog->getMany('BlogTopics');
    // Проходим по каждой связке
    foreach($blogTopics  as  $blogTopic){


А можно ли с помощью xPDO получить сразу список топиков с учетом этой связи? Здесь же нагрузка явно лишняя при запросе каждого топика и хорошо бы просто сделать объединение в одном запросе. xPDO такого не позволяет?

2) Можно ли сделать настройку сходу, чтобы можно было отключать личные блоги. Практика показывает, что они совсем не юзабельны в том виде как сейчас есть. В тех же форумах нет личных разделов, все работают в едином пространстве.

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

3) Топики в админке не видно, верно? То есть отредактировать их там будет довольно проблематично. Как-то планируется с этим моментом решить вопрос?

4) Я немного упустил момент по видео как именно новый юзер смог написать в чужой блог. Он на него был подписан? Или по умолчанию писать могут все в блог? В этом плане хотелось бы еще политику предложить немного расширить сразу для блога: «писать могут все», «писать могут только участники», «писать может только владелец». Эта гибкость позволить разные виды топиков создавать.

Вот как-то так пока. А вообще — супер! Ждем продолжения! :)
  • Carw
  • 0
avatar
Круто было бы еще премодерируемые блоги сделать… но это меня уже несет в пожеланиях ).
avatar
Это тоже все будет однозначно.
avatar
Это будет очень круто! :)
avatar
А можно ли с помощью xPDO получить сразу список топиков с учетом этой связи? Здесь же нагрузка явно лишняя при запросе каждого топика и хорошо бы просто сделать объединение в одном запросе. xPDO такого не позволяет?
Все он позволяет. (хотя, к слову, нагрузка не на много больше, всего на один запрос).
Одним запросом:

$q = $modx->newQuery('modResource');
$q->leftJoin('SocietyBlogTopic', 'TopicBlogs');
$q->leftJoin('SocietyBlog', 'Blog', 'TopicBlogs.blogid = Blog.id');
$q->where(array(
    'Blog.id' => $id,
));
$id = 16;
$topics = $modx->modblog->getTopics($q);

Это получили массив всех топиков определенного блога.

2) Можно ли сделать настройку сходу, чтобы можно было отключать личные блоги. Практика показывает, что они совсем не юзабельны в том виде как сейчас есть. В тех же форумах нет личных разделов, все работают в едином пространстве.
Витоге конечно же все будет иметь свои настройки, и минимальное количество символов в описаниях, и публиковать по умолчанию или нет и многое многое другое. Это же MODX:-)

3) Топики в админке не видно, верно? То есть отредактировать их там будет довольно проблематично. Как-то планируется с этим моментом решить вопрос?
Опять-таки, будет настройка скрывать создаваемые топики из дерева или нет. Но в любом случае, редактор в админке будет. Это или GroupEdit (пока не проверял, но надеюсь там можно указывать критерии поиска, и игнорировать этот параметр), или собственный напишу.

4) Я немного упустил момент по видео как именно новый юзер смог написать в чужой блог. Он на него был подписан? Или по умолчанию писать могут все в блог? В этом плане хотелось бы еще политику предложить немного расширить сразу для блога: «писать могут все», «писать могут только участники», «писать может только владелец». Эта гибкость позволить разные виды топиков создавать.

Вот как-то так пока. А вообще — супер! Ждем продолжения! :)

Да, логика еще далеко не до конца реализована. Опять-таки: все это будет.
avatar
хотя, к слову, нагрузка не на много больше, всего на один запрос
Почему один? Там же получаются сначала связи $blogTopics. Потом в цикле, если я правильно понимаю, с помощью getOne('Topic') мы получаем топик для связи. То есть количество запросов будет сопоставимо с количеством топиков. Или я что-то упускаю?
avatar
А, ну да, на каждую итерацию по запросу.
avatar
Решил попробовать использовать обсуждаемые пакеты для создания личных кабинетов заказчиков. Блоги — личные кабинеты, Топики — заказы. Пока только экспериментирую, но столкнулся с таким багом. Пользователь создал блог, администратор удалил блог в админке из папки «Блоги», в конечном итоге, блог у пользователя до сих пор показывается во фронтенде, а в админке его уже нет. Как же теперь удалить этот блог?
avatar
Здравствуйте!
Спасибо за проявленный интерес к моим пакетам!

Давайте разберемся. Здесь надо понимать, что Блоги и Топики существуют независимо от себя. Для связки Блог-Топик существует объект SocietyBlogTopic (это как modTemplateVarTemplate, который связывает Шаблон с TV — шаблоны и TV могут существовать друг без друга).

У вас я понимаю получилось следующее — пользователь создал не только блог, но и топики в нем. Так как предполагается, что топиков будет много (и они будут давать нагрузку в админке на дерево), то создаваемые топики (ресурсы) создаются с флагом 'show_in_tree' = 0 (то есть они скрыты в дереве и вы в админке их не видите).

Ближайший релиз выйдет с новыми настройками (можно будет указать скрывать в дереве или нет и т.д.).

Сейчас вам что-бы увидеть топики надо сделать следующее:
1. Ставим консоль (если у вас нет альтернативного средства выполнять быстренько php-скрипты в админке).
2. Выполняем скрипт:
<?php
$docs = $modx->modblog->getTopics();
foreach($docs  as $doc){
    $doc->set('show_in_tree', 1);
    $doc->save();
}


Это позволит вам увидеть все топики в дереве (после выполнения скрипта обновите дерево, они будут в контексте -topics).
Хотя можете сразу удалить, заменив $doc->set('show_in_tree', 1); $doc->save(); на $doc->remove();
avatar
Да спасибо, все именно так и было. Это был топик, а не блог.
avatar
Пакет еще совсем бета (больше рассчитан на то, чтобы покапали код как пример, пока он не разросся).
В дальнейшем все будет более очевидно.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.