Информация для самых прокаченных. Только если вы уже достаточно освоили процессоры, Смарти-шаблоны и в целом наши технологии, только тогда имеет смысл играться с этим обновленным компонентом.
Так как modSociety — по прежнему всего лишь основа для разработки блого-социальных проектов, и требует окончательного оформления на каждом отдельно взятом ресурсе самостоятельно, выложу здесь примеры выполнения основных действий с топиками, комментариями и т.п.
Используя данные скрипты, вы сможете напрограммировать под себя довольно приличную социалку, с блэкджеком и гейшами.
Пока пакет доступен для скачивания только в нашем репозитории http://rest.modxstore.ru/extras/, так как будет сейчас проходить активную откатку и допиливание. Тем, кто достигнет серьезных результатов в интеграции пакета, обещаю поддержку с настройками политик безопасности и т.п. А пока что делайте доступным для супер-юзера, чтобы политики не учитывались.
Основной функционал и основные сущности
Сущности:
Пользователь
Пользователи могут создавать Блоги, Топики, Комментарии, а так же голосовать за Блоги, Топики, Комментарии, других юзеров и т.п.
Блог
Блоги — это разделы, содержащие отдельные топики. Блоги могут быть открытые и закрытые. Права рулятся на уровне стандартный политик безопасности 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}
А где пакет скачать можно? В репозитории его нет почему то.