modSociety-2.0.0
Информация для самых прокаченных. Только если вы уже достаточно освоили процессоры, Смарти-шаблоны и в целом наши технологии, только тогда имеет смысл играться с этим обновленным компонентом. Так как modSociety — по прежнему всего лишь основа для разработки блого-социальных проектов, и требует окончательного оформления на каждом отдельно взятом ресурсе самостоятельно, выложу здесь примеры выполнения основных действий с топиками, комментариями и т.п. Используя данные скрипты, вы сможете напрограммировать под себя довольно приличную социалку, с блэкджеком и гейшами. Пока пакет доступен для скачивания только в нашем репозитории http://rest.modxstore.ru/extras/, так как будет сейчас проходить активную откатку и допиливание. Тем, кто достигнет серьезных результатов в интеграции пакета, обещаю поддержку с настройками политик безопасности и т.п. А пока что делайте доступным для супер-юзера, чтобы политики не учитывались. Внимание! Для работы процессоров требуется установленный modxSite. Проект на Гитхабе: github.com/Fi1osof/modSociety Основной функционал и основные сущности Сущности: Пользователь Пользователи могут создавать Блоги, Топики, Комментарии, а так же голосовать за Блоги, Топики, Комментарии, других юзеров и т.п. Блог Блоги — это разделы, содержащие отдельные топики. Блоги могут быть открытые и закрытые. Права рулятся на уровне стандартный политик безопасности MODX-а. В блоги могут вступать отдельные пользователи. Топик Статья, конечный документ. Обычно как раз статьи и обрастают комментариями, рейтингами и т.п. Но комментироваться и рейтинговаться в modSociety может любой тип объекта, хоть документ, хоть пользователь, хоть что. Комментарий Как и говорил, комментироваться может что угодно, в том числе и другие комментарии. Голос Рейтинг. Голос может быть отдан так же за любой объект. Одно ограничение — только один голос на один объект. Голоса бывают положительные, отрицательные и нейтральные. При этом может выть указано четкое значение голоса, к пример, +0.57. Функционал: Создание нового блога Здесь и далее будут коды для выполнения в Консоли. То есть вы уже сможете эти примеры использовать у себя на сайте для выполнения тех или иных действий. <?php print '
';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
$template = 15; // Задаем id своего шаблона блога
$parent = 149; // Задаем свой id раздела Блогов
// Следует учитывать, что по дефолту политики безопасности не
// позволят создавать документы в корне сайта
$namespace = 'modsociety';
if(!$response = $modx->runProcessor('society/web/blogs/create',
array(
"pagetitle" => "Новый блог",
"parent" => $parent,
"template" => $template
), array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}
print_r($response->getResponse()); С помощью этого кода будет создан документ типа Блог. И хотя по сути блогом или топиком может быть любой документ, лучше придерживаться заданных типов документов. Да и в админке будет лучше различать.
? Имейте ввиду, что даже если вы передаете документу published=1, документ не будет опубликован, если нет у пользователя прав publish_document. В данном случае придется или давать эти права, или в процессоре явно указывать это свойство: public function beforeSave(){
$this->object->set('published', 1);
return parent::beforeSave();
} Создание нового топика Собственно, почти то же самое, что и с блогом, только конечно же процессор другой, и контент — обязательное поле. <?php
print '
';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
$template = 16; // Задаем id своего шаблона блога
$parent = 151; // Задаем свой id родительского блога
// Следует учитывать, что по дефолту политики безопасности не
// позволят создавать документы в корне сайта
$namespace = 'modsociety';
if(!$response = $modx->runProcessor('society/web/topics/create',
array(
"pagetitle" => "Новый топик",
"parent" => $parent,
"template" => $template,
"content" => "Bla-Bla-Bla",
), array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}
print_r($response->getResponse()); Еще есть момент: по умолчанию топики имеют свойство show_in_tree = 0, то есть они не выводятся в дерево документов. Или придется задавать это свойство show_in_tree = 1, или допиливать механизм модерации топиков во фронте (собственно, мы именно так и делали), или использовать в админке типа группового редактора (как у нас в ShopModxBox идет). ? Создаем новый комментарий. <?php
print '
';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
$namespace = 'modsociety';
if(!$response = $modx->runProcessor('society/web/threads/comments/create',
array(
"text" => "test",
"target_id" => 1,
), array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}
print_r($response->getResponse()); Здесь довольно хитрая логика. Дело в том, что для комментария основная связующая сущность — Диалоговая ветка SocietyThread, при этом ветка может быть создана на любой объект, будь то документом или пользователем. И в расширенном сценарии сначала надо создать диалоговую ветку с указанием id целевого документа (если ее нет), и только потом уже создать комментарий на нее. В нашем же примере это происходит автоматически, то есть передаем id целевого документа и текст комментария, и система сама проверит наличие целевой диалоговой ветки, если ее нет, то создаст ее, и уже на нее добавит этот комментарий. Если передать параметр parent, то комментарий будет создан дочерним для указанного комментария. При этом так как у всех комментариев id-шники уникальные, то не надо дополнительно указывать id целевого документа, комментарий будет создан непосредственно на указанный комментарий. Голосование <?php
print '
';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
$namespace = 'modsociety';
if(!$response = $modx->runProcessor('society/web/threads/vote',
array(
"target_id" => 8,
"target_class" => "modResource",
"vote_value" => 1
), array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}
print_r($response->getResponse()); Вывести блоги Процессор: <?php
print '
';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
$namespace = 'modsociety';
if(!$response = $modx->runProcessor('society/web/blogs/getdata',
array(
// "limit" => 1,
), array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}
print_r($response->getResponse()); Простенький шаблон: {processor action="society/web/blogs/getdata" ns="modsociety" assign=blogs_result}
{foreach $blogs_result.object as $object}
{/foreach} Вывод топиков Процессор: <?php
print '';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
$namespace = 'modsociety';
if(!$response = $modx->runProcessor('society/web/topics/getdata',
array(
), array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}
print_r($response->getResponse()); Краткий шаблон {$params = [
"where" => [
"parent" => $modx->resource->id
]
]}
{processor action="society/web/topics/getdata" ns="modsociety" params=$params assign=topics_result}
{foreach $topics_result.object as $object}
{/foreach}