15 September 2012

Связка MODx Revolution + LiveStreet

Abnormal programmingMODXLiveStreet
Когда собирался писать свой топик, ломал голову куда же его писать? С одной стороны часть сайта написана на MODx, с другой стороны другая часть написана на LiveStreet, а с третьей стороны это такие костыли, что в пору в Ненормальное программирование писать. Оказалось, что Хабр готовился к такому повороту событий и сделал возможность писать сразу в несколько блогов, за что ему отдельный респект! :-)

Ну а теперь собственно к основному вопросу: В свое время я написал и запустил купонный сервис, само собой написанный на MODx Revolution (само собой, потому что я ярый любитель этого движка и что бы ни писал, всегда пишу именно на этом фреймворке).
Так вот, проект рос, развивался, много функционала было написано (благо MODx позволяет решить любую задачу), да вот только замыслилось мне на сайте еще и социалку-блог а-ля Хабрахабр запустить, да чтобы все наши пользователи там были, да чтобы отзывы по акциям туда же попадали, да чтобы отзывы были и в акциях, и в социалке, и чтобы и там и там их можно было комментировать и читать их в отдельной ветке все до кучи, и еще много-много чего… И когда я думал, сколько же мне понадобится времени, чтобы напрограммировать это все самому, я делался очень грусным...

Но вспомнил я про LiveStreet, о котором слышал давно-давно, и то, что он позиционируется как легкий и быстрый клон Хабра. И вот решил я отдельно социалку поднять на LS и увязать его с моим основным сайтом на MODx. LiveStreet установил и запустил за пару часов (это мое первое знакомство с этим движком).

Забегая немного вперед, даю совет: если решите повторить такое же, то когда разворачивать LS буде, таблицам дайте уникальный префикс, отталкиваясь от префикса таблиц MODx. К примеру, если у вас для MODx префикс modx_, то для LS дайте что-то типа modx_ls_, чтобы потом можно было дописать свой модуль под MODx и создать для него схему с учетом префикса, чтобы можно было без костылей работать с таблицами LS. Кстати, для этого вам может быть полезен вот этот топик.

Далее отредактировал шаблон регистрации пользователей, запретив в нем прямую регистрацию на сайте, указав пользователям, что регистрироваться надо на основном сайте, а не здесь. Для понимания обозначим, что MODx — это будет основной сайт pro-cent.ru, а LS — это forum.pro-cent.ruВ общем далее на MODx в таблицу modx_users добавляем ключик на табличку ls_users, чтобы потом средствами MODx легко можно было обратиться к пользователю LS через запись о пользователе MODx.

Честно сказать, я пока еще не супер знаю LiveStreet, и пока еще всерьез не рассматривал вариант единой таблицы пользователей сразу и для MODx и для LS, но в принципе у меня настроен вторичный ключ на таблицу с блокировкой при удалении, что обеспечивает целостность данных на уровне базы данных, и в целом проблем даже при отдельных таблицах пользователей не возникает.

В общем далее надо просто прописать свое API для взаимодействия MODx с LS. Кто-то возможно напишет его через require 'LS/public_html/index.php', у меня все через POST посредством CURL с передачей нужных параметров и ключем для защиты запросов, чтобы какой-нибудь робот не наплодил вам чего-нибудь :-)

Я не буду сейчас в даваться в подробности, как там все сделано, так как топик написан больше не как конкретный мануал, а так, для общего развития, но если кому-то идея понравится и кто-нибудь захочет провернуть и у себя такое, велкам, вопросы в студию, отвечу.

P.S. Забыл сказать, что на MODx еще и активность из социалки выводится. Если зайдете на главный сайт, увидите ее в правой колонке.

P.P.S. Тут жалоба поступила, что все-таки нужны технические моменты описать более развернуто. Хорошо. Опишу общую схему API, которую я применил для взаимодействия основного сайта с LS.

Сразу скажу, что LS — довольно оригинальный движок, и очень активно использует noSQL в качестве основы для кеширования, потому очень не рекомендую напрямую работать с базой данных социалки, а работать через его Actions (я не буду тут писать мастер-класс по LiveStreet, его вам придется освоить самостоятельно).

В качестве заготовки для всего остального, опишу процедуру создания топика и комментария к нему посредством запроса из основного сайта.
Сначала в LS добавляем свой Action, через который будем вызывать запрос. Для этого создаем свой модуль-конфиг, например config/modules/modx (он нам понадобится в дальнейшем для всех запросов) и создаем в нем файл config.route.php. Он нам понадобится для того, чтобы прописать свои УРЛ-ы для движка.В нем пишем следующее:
$config['page']['modxtopic'] = 'ActionModxTopic';
$config['page']['modxblog'] = 'ActionModxBlog';
return $config;


Этот конфиг понадобится движку, чтобы определить по УРЛ-у какое действие выполнить. В данном случае будут УРЛ-ы /modxtopic и /modxblog. При обращении к этим УРЛ-ам будут вызваны действия с классами /classes/actions/ActionModxTopic.class.php и /classes/actions/ActionModxBlog.class.php соответственно.
Само собой вы должны создать для себя нужные классы по образу и подобию, плюс к этому обязательно еще и файлы-шаблоны по принципу /папка шаблонов (обычно /templates/skin/скин сайта)/actions/ваш Action (в данном случае ActionModxTopic или ActionModxBlog)/index.tpl или действие.tpl
В общем это все придется вам на практике изучить, потому что в трех строчках не описать.

Я для себя эти классы продумывал так, чтобы перегрузить базовые классы самого LS, потому что сам по себе LS не дает API для подобных действий, а базовый функционал рассчитан на то, чтобы пользователь был авторизован и нельзя было извне перегрузить пользователя. При этом не хочется писать много лишнего кода и разбираться в системе кеширования и т.п.
В общем, мы хотим добавить топик. Работа с топиком выполняется через /classes/actions/ActionTopic.class.php, с комментами через /classes/actions/ActionBlog.class.phpСоздавая свой класс, вы перегружаете базовый класс, и пишите в нем функцию Init() и функцию вызываемого действия, например SubmitComment() класса Blog сохраняет коммент.

К сожалению тут какая-то фигня творится с переносами, потому не могу вставить нормально 200 строк кода своего класса, в котором все прописано, потому придется дальше разбираться самим. Правда файл с кодом класса выложил здесь. Там может есть что лишнее, но в общих чертах разобраться можно будет. Там есть комментарии.

Собственно говоря в общих чертах все и выполняется.
Tags:modx revolutionlivestreet cmsсоциальные сети
Hubs: Abnormal programming MODX LiveStreet
+5
6.8k 40
Comments 17
Top of the last 24 hours