Установка связки MODX Revolution + LivestreetCMS и пакета modLivestreet

Внимание! Последние версии пакета modLivestreet сразу устанавливают специально подготовленную и рабочую версию LivestreetCMS (в папку core/components/modlivestreet/livestreet/), так что нет необходимости отдельно устанавливать и настраивать Livestreet. Если надо, то папку Livestreet-а можно переместить куда угодно и просто подправить путь до нее в настройках modLivestreet в MODX.
Описанный ниже процесс актуален только когда у вас свой уже работающий LS-сайт, и вы хотите их завязать между собой. При этом я все равно советую накатить ваш сайт поверх устанавливаемого с modLivestreet, по возможности не затирая папку engine (сейчас там как минимум подправленные Viewer и Jevix, в дальнейшем могут и другие исправления появиться).

В данном топике я подробно опишу процесс установки связки MODX Revolution + LivestreetCMS с использованием нашего модуля modLivestreet.
Скачать последнюю версию пакета можно из официального репозитория modx.com или из моего rest.modxstore.ru/extras/

Для этого нам понадобятся:
  1. Отдельно установленный сайт на MODX Revolution версии 2.2.0+ Можно использовать и более ранние версии MODX Revolution, но придется отключить режим синхронной работы с пользователями, так как используются процессоры новых стандартов.
  2. Отдельно установленный сайт на Livestreet версии 1.0+.
  3. Модуль для связки Livestreet с MODX Revolution — modLivestreet.

Итак, устанавливаем Livestreet- и MODX-сайты (я не буду писать мануалы по установке этих сайтов, так как документации полно в интернете, а здесь опишу только те тонкости, которые необходимы для корректной работы с модулем).
Единственное, что важно отметить, что очень желательно, чтобы эти сайты находились в разных DOCUMENT_ROOT (хотя позволительно, чтобы Livestreet находился в какой-нибудь папке внутри сайта MODX), но необходимо, чтобы сайты находились на одном сервере, чтобы был доступ по файловой системе.

Кстати, рекомендация: для MODX Revolution и Livestreet использовать одну базу данных с разными префиксами, но так, чтобы префикс Livestreet-а был длиннее, чем у MODX. К примеру, для MODX префикс таблиц modx_, а для Livestreet префикс modx_livestreet_ или modx_blog_.
Это позволит в дальнейшем обращаться к таблицам Livestreet-а непосредственно на уровне MODX с помощью xPDO без дополнительных логинов и паролей. Соответственный функционал будет добавлен в одном из следующих релизов.

После того, как вы поставили и настроили свои сайты, устанавливаем наш пакет.
Для этого загружаем установочный архив в MODX в папку /core/packages/
Затем переходим на страницу управления пакетами.


Выбираем Искать пакеты локально.


Если пакет в нужной папке, MODX найдет его и покажет в общем списке.


Устанавливаете его, нажав Установить и следуя инструкциям. Если все корректно установлено, то слева в списке элементов MODX вы найдете сниппеты и плагины пакета (может понадобиться обновление списка).


Далее идем в настройки и проверяем корректность настроек пакета.






Здесь с большой долей вероятности вам понадобится указать полный путь до сайта Livestreet (modLivestreet.livestreet_path), и возможно изменить шаблон.

В общих чертах на стороне MODX все сделано.
Теперь надо настроить Livestreet, но так как там не реализован такой механизм управления пакетами, то действий потребуется чуть больше.

Во время установки пакета в MODX, была создана папка пакета /core/components/modlivestreet/. Вот в ней же найдите папку forLiveStreetCms/. Там есть все, необходимое для настройки Livestreet-а.

Для начала создадим конфиг-файл, который будет перегружать настройки по умолчанию. Находим в нашей папке файл livestreet.config.stable.php.sample.txt, закидываем его в папку livestreet/config/ (здесь и далее под папкой livestreet/ будем подразумевать корень сайта Livestreet) и переименовываем в config.stable.php
Этот конфиг будет автоматически подхватываться Livestreet-ом.

Следующий важный шаг: установка плагина modLivestreet на сайт Livestreet.
В той же папке находим папку source/plugins/. Вот из нее папку modlivestreet переносим в livestreet/plugins/
Затем необходимо этот плагин включить. Для этого в той же папке livestreet/plugins/ создаем файл plugins.dat и просто записываем в него название плагина (в нашем случае modlivestreet).

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

1. У нас возникают проблемы с сессиями. Так как у нас сессии будут общие и для MODX, и для Livestreet, и все прогоняется через MODX, в Livestreet возникает ошибка повторной инициализации сессии. Добавим проверку на то, что сессия уже запущена. Для этого откроем файл livestreet/engine/modules/session/Session.class.php и подправим функцию Start(). Прячем инициализацию сессии внутри проверки на наличие сессии.
if(!session_id()) {
    session_regenerate_id();
    session_start();
}


2. Очень важно подправить класс Viewer, так как в случае ошибки он прерывает процесс полностью (делает exit;), что мешает нам на стороне MODX получить и обработать ошибки.
Для этого открываем livestreet/engine/modules/viewer/Viewer.class.php и в функции Display вот в этом блоке добавляем return
if ($this->sResponseAjax) {
    $this->DisplayAjax($this->sResponseAjax);  
    return;
}
а в функции DisplayAjax меняем exit на return.

UPD: 3. Еще один важный момент: запретить Livestreet-у обратно декодировать MODX-теги, что наносит удар по безопасности. Если этого не сделать, то пользователи смогут писать MODX-теги, типа [[++base_path]] и получить информацию, или исполнять чанки-сниппеты, что не круто.
Замена кодов происходит в классе Jevil. К сожалению в конфиги Livestreet не дали возможность перегрузить то, что нам нужно, а потому придется делать ручками.
Открываем livestreet/engine/lib/external/Jevix/jevix.class.php и меняем
public $entities2 = array('<'=>'&lt;', '>'=>'&gt;', '"'=>'&quot;');
на
public $entities2 = array('<'=>'&lt;', '>'=>'&gt;', '"'=>'&quot;', '[' => '&#91;', ']' => '&#93;');
то есть дописываем замену наших символов
'[' => '&#91;', ']' => '&#93;'


Вот теперь вроде бы и все :-)
Остается только на сайте MODX сделать вывод сайта Livestreet. В этом вопросе просто надо определиться как будут работать сайты. Можно просто в главной странице в качестве контента прописать вызов сниппета [[!modLivestreet.run]] и поставить пустой шаблон, а можно создать шаблон, в котором будет прописан вызов этого сниппета. А может быть отдельный шаблон, в котором будет вызываться ваш сниппет, где будет выполняться нужная вам логика и там уже если надо, вы вызываете сниппет modLivestreet.run с пользовательским request_uri.

Кстати, вы можете для реальных MODX-страниц создать шаблон, в котором сниппет будет вызываться так: [[!modLivestreet.run?request_uri=`/modx/`]]
Плагин modLivestreet на стороне Livestreet сработает на УРЛ /modx/ и выполнит Action-класс livestreet/plugins/modlivestreet/classes/actions/ActionIndex.class.php и будет использован шаблон livestreet/plugins/modlivestreet/templates/skin/default/actions/ActionIndex/index.tpl
Сейчас этот класс расширяет базовый индексный класс и по сути вы увидите в общих чертах главную страницу, но вы можете изменить этот класс, а шаблон изменить, к примеру, вот так:
{include file='header.tpl' menu='blog'}
<div>[[*content]]</div>
{include file='footer.tpl'}

Тогда у вас будет контент MODX выводиться в шаблон Livestreet.

Вот, пожалуй, и все. Возникнут вопросы, спрашивайте. Надеюсь, каждый попробует и для себя что-нибудь написать и потом поделится ;-)

UPD: Кстати, имейте ввиду, что вся статика Livestreet прогоняется через MODX, что само по себе не круто и в любом случае негативно сказывается на производительности, а при серьезной посещаемости вообще может положить сервер, так что каждому советую настоятельно настроить правила rewrite на вашем сервере, чтобы при обращении к статике Livestreet сервер обращался напрямую к файловой системе в обход MODX.
У меня nginx и правила выглядят вот так:
location /templates/{
    root   /var/www/livestreet/public_html;
    access_log   off;
    expires      30d;
}

location /uploads/{
    root   /var/www/livestreet/public_html;
    access_log   off;
    expires      30d;
}

location ~/engine/.*\.js{
    root   /var/www/livestreet/public_html;
    access_log   off;
    expires      30d;
}

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

31 комментарий

avatar
Спасибо! Очень нужное описание.
avatar
Пожалуйста!
Возникнут вопросы, спрашивайте прям здесь, потому что не факт что все до кучи описал.
avatar
Описано все понятно, класс, но вот только я единственного не понял, скачал последнюю версию Revolution установил на денвере, скачал архив последний modLivestreet, закинул в папку /core/packages/, далее все по инструкции, установить пакет жму, но выдает сообщение 'Невозможно установить пакет с подписью: modlivestreet-0.6.1-rc' В чем загвоздка может быть? Или я не правильно все понял?
avatar
За денвер и, я так понимаю, windows, ничего не могу гарантировать. С большой долей вероятности могут возникнуть проблемы из-за другого направления слешей (разделителей директорий).
Заведите себе бесплатный дев-аккаунт на modxcloud.com и там тестируйте.
avatar
Спасибо, но все же, необходимо установить на хостинг только MODX Revolution? И все? И установить в него пакет modLivestreet? Я правильно понимаю? Никакого сайта на Livestreet отдельно не нужно устанавливать.
avatar
Да, никакого сайта отдельно ставить не надо. Ставите MODX Revolution, скачиваете из репозитория modLivestreet, устанавливаете его и все должно сразу работать.
avatar
Здравствуйте, поставил вашу последнюю сборку. Все прошло на ура. Немного не понял с синхронизацией пользователей. Вошел на сайт авторизовавшись как admin — admin, потом поменял пароль админа на другой и ввел нормальный Email, в итоге отправлено письмо подтверждения смены email на адрес admin@adm.loc. В общем пароль поменялся а email никак. Также авторизовавшись админом для LS автоматом по адресу site.ru/manager не входит, появляется окно авторизации. Наверное я что то не так сделал. В настройках системы в modx поставил modLivestreet.sync_users в значение «Да». Подскажте пожалуйста что не так сделал для синхронизации пользователей. Спасибо.
avatar
Здравствуйте!
Синхронизация работает по такому принципу: если она включена, то действия выполняются на обоих пользователях, и в MODX, и в Livestreet. То есть для этого пользователь с таким логином должен быть и в Livestreet, и в MODX.
Если синхранизация включена, то при создании пользователя через админку, или при регистрации на сайте Livestreet, пользователь будет создан и там, и там.
То есть для того, чтобы действия при включенной синхронизации распространялись на admin, надо чтобы такой пользователь был и в MODX.
Но надо признать, что еще не все функции четко работают здесь. Если в синхронном режиме зарегится новый пользователь, он будет и там, и там, и если он сменит пароль в профиле Livestreet, пароль сменится тоже везде, а вот если сменит емейл, то в MODX он не обновится. Это пока не доработано. На пользователя это как бы не повлияет, но в MODX информация будет не совсем актуальная.
avatar
Регистрация на стороне modx компонентом Login, регистрация modx пользователя проходит, но в Livestreet он не появляется.
avatar
Это очень сложный момент. Я не так давно ковырял Login, и я так понял, он преступно не использует механизмы самого MODX-а в плане создания пользователя, а именно системные процессоры создания пользователя, и главное — не вызывает системное событие на создание пользователя. А раз так, то и не срабатывает modLivestreet-плагин, и не создается livestreet-пользователь. В Login используются хуки. Честно сказать — не планирую дописывать функционал под Login. Сорри.
avatar
Может подскажите как подключить
<script type="text/javascript">
		var DIR_WEB_ROOT 			= '{cfg name="path.root.web"}';
		var DIR_STATIC_SKIN 		= '{cfg name="path.static.skin"}';
		var DIR_ROOT_ENGINE_LIB 	= '{cfg name="path.root.engine_lib"}';
		var LIVESTREET_SECURITY_KEY = '{$LIVESTREET_SECURITY_KEY}';
		var SESSION_ID				= '{$_sPhpSessionId}';
		var BLOG_USE_TINYMCE		= '{cfg name="view.tinymce"}';
		
		var TINYMCE_LANG = 'en';
		{if $oConfig->GetValue('lang.current') == 'russian'}
			TINYMCE_LANG = 'ru';
		{/if}

		var aRouter = new Array();
		{foreach from=$aRouter key=sPage item=sPath}
			aRouter['{$sPage}'] = '{$sPath}';
		{/foreach}
	</script>


к MODX?
avatar
спасибо сам разобрался
avatar
не за что
avatar
Здравствуйте. Как быть, если modx и LS используют разные базы?
avatar
Здравствуйте.
Да это в принципе пока не беда. В этой связке MODX и Livestreet работают самостоятельно. Главное чтобы доступ к файловой системе был.
А так, надо просто для LS четко прописать данные доступа к базе данных.
Сейчас при установке модуля для Livestreet создается файл /livestreet/config/config.local.php
Там четко прописаны данные доступа к БД.
Можете там переписать данные доступа к БД, или сделать так:
Создайте там же файл config.stable.php и в нем пропишите:
$config = array();
$config['db']['params']['host'] = 'host'; 
$config['db']['params']['dbname'] = 'dbname'; 
$config['db']['params']['user'] = 'user'; 
$config['db']['params']['pass'] = 'pass'; 
return $config;
Конечно же данные прописать свои.
Этот конфиг подгружается после config.local.php и просто перепишит соответствующие значения.
avatar
Здравствуйте, подскажите пожалуйста возможно ли в шаблонах MODX вставлять лишь нужные куски из Livestreet?
avatar
Можно, но все не просто так. LS использует Смарти, и вы не можете просто так вставить тег из Livestreet, и он бы отображался. Есть несколько вариантов.
1. Как я и говорил, если вы используете modLivestreet, то лучше все шаблоны, в том числе и MODX-шаблоны, хранить на стороне Livestreet, и даже MODX-страницы прогонять через Livestreet. Тогда можно создавать свои Action-классы на стороне Livestreet и в шаблоны втыкать ливстритовские Смарти-теги.
2. Написать модуль для ливстрита, чтобы формировать нужный блок информации, и через modLivestreet.run с указанием нужного УРЛ-а подгружать информацию. Как создавать модули для ЛС, я писал здесь: modxlivestreet.ru/blog/livestreet-lessons/9.html
3. Сегодня только опубликовал новый модуль: community.modx-cms.ru/blog/addons/9201.html
Он позволяет выполнять php в статических шаблонах. Если вы свою часть MODX-а переведете на Смарти, то получите максимальную интеграцию Livestreet и MODX на уровне шаблонизации.
avatar
Спасибо, уже разобрался со Smarty www.koshkidoma.ru/ но тут возникли проблемы. Из-за путей не отображается кнопка загрузки изображений галереи lsgallery, плагин категории не работает и ещё при попытке в топике загрузить картинку, выдаёт ошибку, что не может её обработать О_о Думаю это всё из-за путей, т.к. социалку я установил в папку /community/ а в главной директории лежит MODX. (((
avatar
Да, у вас именно проблемы с загрузкой файлов.

Если есть возможность, пропишите дополнительные реврайты на сервере. Если нет, дайте логин/пароль от админки в личку, я пропишу дополнительные пути в плагин modLivestreet. Подгрузку таких файлов всегда можно дописать в самом плагине.
avatar
Вроде отправил в лс данные. Ещё почему-то из чанка не выполняется сниппет PageNav на странице www.koshkidoma.ru/articles/ выдаёт ошибку.
avatar
Все, каптчу и стили поправил. Но у вас js-ошибка.
TypeError: jQuery(...).stickyTableHeaders is not a function
	
jQuery("table").stickyTableHeaders({ fixedOffset: $(".header") });

Это наверняка перегружается jQuery плагин, в котором есть функция stickyTableHeaders. Скорее всего поможет отключение стандартного jQuery в Livestreet-скине (там есть конфиг, где все CSS и JS прописаны).

А по чанку: это просто Нотисы лезут (они в индекс-файле в Livestreet прописаны error_reporting). А так как GET-параметр page не был передан, то и ключа $_REQUEST['page'] не было. На это PHP и ругался.
Но у вас сниппет кешируемый, потому пагинация не будет работать (так как кешируется результат). Поставьте! в вызываемом сниппете.
avatar
Спасибо большое) Но вот при загрузке картинки в топик чтобы вставить вылазиет ошибка «Невозможно обработать внешний файл». Это где-то в конфигах нужно настраивать?
avatar
Вот это уже не подскажу. У меня этой ошибки нет. Придется поковырять самому, я сейчас занят.
avatar
В существующий сайт на modx сначала установил Ваше дополнение. Затем создал на сайте папку livestreet. Загрузил туда файлы LS, то что здесь выше описывалось сделал, настройки в конфиге изменил. Сам движок LS работает при обращении к нему по адресу ptznew.ru/livestreet Главная страница сайта тоже работает, но только если шаблон родной modx, я попробовал назначить шаблоны LS для главной и получил ошибку:
Fatal error: Uncaught exception 'Exception' with message 'Can not find the template: actions/ActionError/index.tpl' in /...../ptznew.ru/livestreet/engine/modules/viewer/Viewer.class.php:329 Stack trace: #0 [internal function]: ModuleViewer->Display('actions/ActionE...') #1 /...../ptznew.ru/livestreet/engine/classes/Engine.class.php(551): call_user_func_array(Array, Array) #2 /....../ptznew.ru/livestreet/engine/classes/Router.class.php(439): Engine->_CallModule('Viewer_Display', Array) #3 /......./ptznew.ru/livestreet/engine/classes/Router.class.php(137): Router->__call('Viewer_Display', Array) #4 /......./ptznew.ru/livestreet/engine/classes/Router.class.php(137): Router->Viewer_Display('actions/ActionE...') #5 /......../ptznew.ru/livestreet/engine/classes/Router.class.php(127): Router->Shutdown(false) #6 /......../ptznew.ru/core/components/modlivestreet/livestreet/index.php(34): Router->Exec() #7 /..../data in /....../ptznew.ru/livestreet/engine/modules/viewer/Viewer.class.php on line 329

Подскажите пожалуйста в какую сторону копать? Почему не находит шаблон? Спасибо.
avatar
1. В системный настройках MODX в пространстве имен modLivestreet прописан путь до рабочей версии Livestreet.
2. Там же есть настройка имя шаблона. С моим пакетом устанавливается шаблон modx (копия synio с небольшими изменениями для демонстрации). Скорее всего у вас в вашей копии Livestreet нет шаблона modx, потому и ругань.

P.S. не советую держать публично LS, работающий в связке с MODX.
1. В устанавливаемой с пакетом версии внесено пару изменений для полной работоспособности.
2. Не безопасно. Через Livestreet могут прописать MODX-теги, и потом на MODX они выполнятся.
avatar
Подскажите, а как создать через LiveStreet вторичный шаблон, чтобы например вывести каталог в дизайне Livestreet? Вот пока я изменяю всё в файле /plugins/modlivestreet/templates/skin/default/actions/ActionCustom/index.tpl Можно там создать подобный шаблон но с названием скажем second.tpl?
avatar
Можно все, надо только знать как. Чтобы лучше во всем этом плавать, надо однозначно хотя бы чуть-чуть разобраться в Livestreet.
Вот здесь довольно подробно расписал процедуру создания плагинов для Livestreet. Это и понадобится для решения этой задачи.
avatar
Вот всё равно как ни крути не понимаю:
[[!modLivestreet.run?request_uri=`/modx_custom/`]] где можно поменять /modx_custom/ скажем на /[[*alias]]/ и чтобы это работало?! Я так понимаю сначало передаётся в адресной строке koshkidoma.ru/modx_custom/ ?! О_о Вывод такой я сделал когда в шаблоне livestreet ради интереса прописал:
print($_SERVER['REQUEST_URI']);
avatar
Сделайте проще: поковыряйте Livestreet и поймите как обрабатываются запросы на те же топики, комменты и т.п.
В LS принята такая иерархия: Action — Event. В роутере прописаны правила на обработку УРЛ-ов. ЛС — это не МОДХ, он в принципе рассчитан на два уровня УРЛов. Первый — Action (будет влиять на то, какой Action-класс будет вызываться). Второй — Event (будет влиять на то, какой Event-метод Action-класса будет вызываться).
/modx_custom/ на /[[*alias]]/ менять не стоит, так как modx_cusmot — это флаг Action-класса. Если вы наплодите кучу УРЛов первого уровня, вам придется наплодить кучу Action-классов под них.
Вот конфиг прописан:
Config::Set('router.page.modx_custom', 'PluginModLivestreet_ActionCustom');
То есть УРЛ-у modx_custom соответствует класс ActionCustom плагина ModLivestreet.
Вы можете создать свой плагин, зарегить для него УРЛ, типа /modx_aliases/ создать класс под него, и в нем уже перехватывать алиасы и делать что хотите.
avatar
ставлю modlivestreet-0.6.1-rc
Опишите пожалуйста подробнее куда нижеследующий кусок кода вставлять в указанном файле

Для этого откроем файл livestreet/engine/modules/session/Session.class.php и подправим функцию Start(). Прячем инициализацию сессии внутри проверки на наличие сессии.
if(!session_id()) {
session_regenerate_id();
session_start();
}
avatar
Здравствуйте.
В начале топика написано, что в последних версиях сразу все рабочее, и ничего не надо дополнительно прописывать (Livestreet с изменениями сразу устанавливается с пакетом). Это все осталось для заметки.
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.