modSociety-2.0.0

Информация для самых прокаченных. Только если вы уже достаточно освоили процессоры, Смарти-шаблоны и в целом наши технологии, только тогда имеет смысл играться с этим обновленным компонентом. Так как modSociety — по прежнему всего лишь основа для разработки блого-социальных проектов, и требует окончательного оформления на каждом отдельно взятом ресурсе самостоятельно, выложу здесь примеры выполнения основных действий с топиками, комментариями и т.п. Используя данные скрипты, вы сможете напрограммировать под себя довольно приличную социалку, с блэкджеком и гейшами. Пока пакет доступен для скачивания только в нашем репозитории http://rest.modxstore.ru/extras/, так как будет сейчас проходить активную откатку и допиливание. Тем, кто достигнет серьезных результатов в интеграции пакета, обещаю поддержку с настройками политик безопасности и т.п. А пока что делайте доступным для супер-юзера, чтобы политики не учитывались.

Внимание! Для работы процессоров требуется установленный modxSite. Проект на Гитхабе: github.com/Fi1osof/modSociety

Основной функционал и основные сущности

Сущности:
Пользователь

Пользователи могут создавать Блоги, Топики, Комментарии, а так же голосовать за Блоги, Топики, Комментарии, других юзеров и т.п.

Блог

Блоги — это разделы, содержащие отдельные топики. Блоги могут быть открытые и закрытые. Права рулятся на уровне стандартный политик безопасности MODX-а. В блоги могут вступать отдельные пользователи.

Топик

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

Комментарий

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

Голос

Рейтинг. Голос может быть отдан так же за любой объект. Одно ограничение — только один голос на один объект. Голоса бывают положительные, отрицательные и нейтральные. При этом может выть указано четкое значение голоса, к пример, +0.57.

Функционал:
Создание нового блога

Здесь и далее будут коды для выполнения в Консоли. То есть вы уже сможете эти примеры использовать у себя на сайте для выполнения тех или иных действий.

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();
    }
Создание нового топика

Собственно, почти то же самое, что и с блогом, только конечно же процессор другой, и контент — обязательное поле.

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 идет).

Создаем новый комментарий.
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 целевого документа, комментарий будет создан непосредственно на указанный комментарий.

Голосование
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());
Вывести блоги

Процессор:

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}
Вывод топиков

Процессор:

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}