Fi1osof 28 января 2014 6 2
Информация для самых прокаченных. Только если вы уже достаточно освоили процессоры, Смарти-шаблоны и в целом наши технологии, только тогда имеет смысл играться с этим обновленным компонентом.

Так как modSociety — по прежнему всего лишь основа для разработки блого-социальных проектов, и требует окончательного оформления на каждом отдельно взятом ресурсе самостоятельно, выложу здесь примеры выполнения основных действий с топиками, комментариями и т.п.

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

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

Внимание! Для работы процессоров требуется установленный modxSite.

Проект на Гитхабе: github.com/Fi1osof/modSociety

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


Сущности:
Пользователь
Пользователи могут создавать Блоги, Топики, Комментарии, а так же голосовать за Блоги, Топики, Комментарии, других юзеров и т.п.
Блог
Блоги — это разделы, содержащие отдельные топики. Блоги могут быть открытые и закрытые. Права рулятся на уровне стандартный политик безопасности 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}
2 комментария
A
AAA 25 января 2015г в 13:39 #
А где пакет скачать можно? В репозитории его нет почему то.
proxyfabio1
proxyfabio 25 января 2015г в 13:43 #
Авторизуйтесь или зарегистрируйтесь (можно через соцсети ), чтобы оставлять комментарии.