Информация для самых прокаченных. Только если вы уже достаточно освоили процессоры, Смарти-шаблоны и в целом наши технологии, только тогда имеет смысл играться с этим обновленным компонентом.
Так как modSociety — по прежнему всего лишь основа для разработки блого-социальных проектов, и требует окончательного оформления на каждом отдельно взятом ресурсе самостоятельно, выложу здесь примеры выполнения основных действий с топиками, комментариями и т.п.
Используя данные скрипты, вы сможете напрограммировать под себя довольно приличную социалку, с блэкджеком и гейшами.
Пока пакет доступен для скачивания только в нашем репозитории http://rest.modxstore.ru/extras/, так как будет сейчас проходить активную откатку и допиливание. Тем, кто достигнет серьезных результатов в интеграции пакета, обещаю поддержку с настройками политик безопасности и т.п. А пока что делайте доступным для супер-юзера, чтобы политики не учитывались.
Внимание! Для работы процессоров требуется установленный modxSite.
Основной функционал и основные сущности
Сущности:
Пользователь
Пользователи могут создавать Блоги, Топики, Комментарии, а так же голосовать за Блоги, Топики, Комментарии, других юзеров и т.п.
Блог
Блоги — это разделы, содержащие отдельные топики. Блоги могут быть открытые и закрытые. Права рулятся на уровне стандартный политик безопасности MODX-а.
В блоги могут вступать отдельные пользователи.
Топик
Статья, конечный документ. Обычно как раз статьи и обрастают комментариями, рейтингами и т.п. Но комментироваться и рейтинговаться в modSociety может любой тип объекта, хоть документ, хоть пользователь, хоть что.
Комментарий
Как и говорил, комментироваться может что угодно, в том числе и другие комментарии.
Голос
Рейтинг. Голос может быть отдан так же за любой объект. Одно ограничение — только один голос на один объект. Голоса бывают положительные, отрицательные и нейтральные. При этом может выть указано четкое значение голоса, к пример, +0.57.
Функционал:
Создание нового блога
Здесь и далее будут коды для выполнения в Консоли. То есть вы уже сможете эти примеры использовать у себя на сайте для выполнения тех или иных действий.
<?php
print '<pre>';
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 '<pre>';
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 '<pre>';
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 '<pre>';
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 '<pre>';
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}
<div class="blog">
<a href="{$object.uri}"><h3>{$object.pagetitle}</h3></a>
</div>
{/foreach}
Вывод топиков
<?php
print '<pre>';
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}
<div class="topic">
<a href="{$object.uri}"><h3>{$object.pagetitle}</h3></a>
</div>
{/foreach}