Два года назад я писал про готовую сборку интернет-магазина на MODX Revolution. За это время было сделано не мало интернет-магазинов на ShopModxBox (о бОльшая их часть силами сторонних разработчиков) и на сегодня количество установок движка составляет 200-300 штук в месяц. Проект и сегодня продолжает развиваться, получая в ядро новый полезный функционал.
Главные качества, которые мы отмечаем в ShopModxBox — это высокая производительность, гибкость и минимальный объем кода (ShopModxBox — это решение на базе фреймворка MODX Revolution, и его собственная часть кода составляет буквально 3-5 тысяч строк php-кода + Smarty-шаблоны).
И вот на днях мы выпустили новую сборку NewsModxBox. Здесь основа та же, что и в ShopModxBox, только логика заточена именно под новостные порталы и СМИ. Сборка пилилась под реальный и совсем не маленький новостной портал и во многом отвечает реалиям бизнес-логики электронных и смешанных СМИ.
Что, к примеру, есть в NewsModxBox?
И еще много-много всего.
- Специализированный редактор статей. joxi.ru/52a104ZhjqK720 В нем, помимо прочего, есть такая фишка, как создание нового документа во всплывающем окне. Скажу так: это была одна из сложнейших задач в нем.
- Кастомный медиа-манагер с использованием базы данных и прямой заливкой файлов. О нем я местами уже писал, например здесь. С этим редактором могут работать сотни людей и не умрет он и на сотнях тысяч файлов.
- Морфологический поиск. Да-да, он там работает :) Хотя на каждом индивидуальном проекте может понадобиться подкрутка, в зависимости от специфики.
- Бизнес-логика, заточенная под реалии новостных порталов, с различными группами доступов, отправкой на редактуру и т.п.
- Типографика текстов by Jevix
- Возможность задавать статьям параметр индексировать ссылки в них или нет (если нет, то всем ссылкам будет проставляться rel=«nofollow»)
- Готовая выгрузка в яндекс-новости и в гугл-новости (специальный полнотекстовый RSS).
- Собственный постраничный sitemap.xml на неограниченное кол-во документов.
- Банерная система.
- Облако тегов.
- Блого-социальная составляющая.
- Виджеты валют и погоды.
- Интеграция с hh.ru (раздел Работа). Кстати, все страницы раздела Работа ЧПУшные, и выглядят для поисковиков как часть сайта.
- Бешенная техническая оптимизация. Движок рассчитан на сотни тысяч статей. На среднем сервере держит сотни пользователей онлайн. Проводили нагрузочное тестирование, 75 000 статей и 2000 пользователей онлайн не смогли положить сервер. Пруфф joxi.ru/Dr8Ke8OIYgKlA6
- Раздел для платных материалов по подписке
- Генерация превьюшек из PDF для журналов
- Партнерские ссылки. Это полезно, когда у вас партнерки какие-нибудь есть. Вот пример: joxi.ru/D2PjRW0SOZqWr3 joxi.ru/eAOqaVNf3K98mo
- Дополнительные рубрики. То есть статью можно разместить сразу в несколько рубрик.
- Хитрая система новостных выборок и шаблонизации, которая не позволит в нескольких местах случайно вывести одну и ту же новость.
- Пользовательские публикации. joxi.ru/a2XVypGu8kDerg
- Авторизация через социальные сети.
И еще много-много всего.
Немного технической информации.
Программная часть
Практически вся логика прописана в процессорах. О их логике я довольно давно писал здесь. С тех пор их парадигма в целом осталась прежней, но технически они изменились, став по большей части class-based. Довольно свежая и подробная статья о новых процессорах и используемых нами здесь.
В чем прелесть процессоров? Во-первых, в их расширяемости. Не придется плодить повторяющиеся куски кода. Во-вторых, в их универсальности. В MODX-е их можно вызывать как напрямую (из других скриптов или Smarty-шаблонов), так и через коннекторы (Ajax-запросы и т.п.). В-третьих, удобство отладки. К примеру, можно сделать выборку статей в MODX-консоли.
PHP-код для запроса в консоли
<?php
print '<pre>';
ini_set('display_errors', 1);
$modx->switchContext('web');
$modx->setLogLevel(3);
$modx->setLogTarget('HTML');
$namespace = 'modxsite'; // Неймспейс комопонента
$params = array(
"limit" => 3,
);
if(!$response = $modx->runProcessor('web/resources/articles/getdata',
$params
, array(
'processors_path' => $modx->getObject('modNamespace', $namespace)->getCorePath().'processors/',
))){
print "Не удалось выполнить процессор";
return;
}
print_r($response->getResponse());
Пример полученного ответа.
Array
(
[success] => 1
[message] =>
[count] => 3
[total] => 28
[limit] => 3
[page] => 0
[object] => Array
(
[86981] => Array
(
[id] => 86981
[type] => document
[contentType] => text/html
[pagetitle] => Дональд Трамп. Искусство заключать сделки.
[longtitle] =>
[description] =>
[alias] => kopiya-donald-tramp.-iskusstvo-zaklyuchat-sdelki
[link_attributes] =>
[published] => 1
[pub_date] => 0
[unpub_date] => 0
[parent] => 86915
[isfolder] => 0
[introtext] => Данная книга крайне рекомендуется к прочтению амбициозным людям, стремящимся к лидерству.
[content] =>
В свое время эта книга меня очень сильно вдохновила. Она автобиографична, то есть из нее вы многое узнаете о самом Дональде Трампе. И в книге большое внимание уделяется именно личным качествам человека, лидера. Сам Дональд считает, что многие успешные люди достигли успеха не благодаря каким-то знаниям, а по большей степени благодаря определенным личным качествам (амбиции, целеустремленность, ответственность и т.п.). Если вы считаете себя лидером, вы просто обязаны прочитать эту книгу.
[richtext] => 1
[template] => 2
[menuindex] => 5
[searchable] => 1
[cacheable] => 1
[createdby] => 422
[createdon] => 1443280367
[editedby] => 422
[editedon] => 1443280510
[deleted] => 0
[deletedon] => 0
[deletedby] => 0
[publishedon] => 1443225840
[publishedby] => 422
[menutitle] =>
[donthit] => 0
[privateweb] => 0
[privatemgr] => 0
[content_dispo] => 0
[hidemenu] => 0
[class_key] => modDocument
[context_key] => web
[content_type] => 1
[uri] => rubriki/books/kopiya-donald-tramp.-iskusstvo-zaklyuchat-sdelki.html
[uri_override] => 0
[hide_children_in_tree] => 0
[show_in_tree] => 1
[properties] =>
[article_type] =>
[image] => lazy/images/65588288e12ab09ae49c8a6f7552e130.jpg
[article_status] => 2
[mssql_id] =>
[tags] =>
[pseudonym] =>
[news_list] => 1
[rss] => 1
[top_news] => 0
[mailing] => 0
[article_genre] => 0
[main] => 0
[fasturl] =>
[views] => 148
[hide_on_mainpage] => 0
[hide_adverts] => 0
[object_id] => 86981
[tv_27_gallery] =>
[tv_30_sell_link] => [{"MIGX_id":"1","title":"\u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430 Ozon.ru","link":"http:\/\/www.ozon.ru\/context\/detail\/id\/21419581\/?partner=business-vs-crisis_ru&from=bar","icon_class":"glyphicon-shopping-cart"}]
[tv_31_original_source] =>
[tv_32_hide_image] =>
[section_title] => Рекомендуемая литература
[author_avatar] => /assets/avatars/copy.jpg
[tvs] => Array
(
[sell_link] => Array
(
[tv_id] => 30
[value] => [{"MIGX_id":"1","title":"\u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430 Ozon.ru","link":"http:\/\/www.ozon.ru\/context\/detail\/id\/21419581\/?partner=business-vs-crisis_ru&from=bar","icon_class":"glyphicon-shopping-cart"}]
)
)
[imageDefault] => /uploads/images/No-Photo.jpg
[public_image] => /uploads/lazy/images/65588288e12ab09ae49c8a6f7552e130.jpg
[gallery] => Array
(
)
[sell_link] => Array
(
[0] => Array
(
[MIGX_id] => 1
[title] => Купить на Ozon.ru
[link] => http://www.ozon.ru/context/detail/id/21419581/?partner=business-vs-crisis_ru&from=bar
[icon_class] => glyphicon-shopping-cart
)
)
).................
Как это выглядит в админке
При этом в вызове в переменной $params можно указать лимит, сортировку, условия поиска и т.д. и т.п. В процессе разработки нет необходимости каждый раз перезагружать страницу во фронте, чтобы проверить результат изменения кода в процессоре выгрузки. Сначала отладили все в админке, и если там выборка идет как надо, то и во фронте будет тот же самый результат. То же самое касается механизмов комментирования, публикаций, форм обратной связи и всего остального.
Шаблонизация
Шаблонизация построена на базе Smarty и прекрасно дружит с процессорами. К примеру, вот так можно получить массив новостей и набить их в цикле в конечный HTML:
{$params = [
"limit" => 10,
"sort" => "pagetitle",
"dir" => "DESC"
]}
{processor action="web/resources/articles/getdata" ns="modxsite" params=$params assign=result}
{if $result.success && $result.object}
{foreach $result.object as $object}
<p>{$object.pagetitle}</p>
{/foreach}
{else}
<div class="alert alert-danger">{$result.message|default:"Записи не были получены"}</div>
{/if}
Конечно это простой пример (в реалии там расширяемые шаблоны, блоки, инклюды и т.п.), но в целом представление о том, как там примерно сделано, дает. Причем обратите внимание на схожесть вызова в шаблоне и консоли. И там и там передается путь к вызываемому процессору (в нашем случае это web/resources/articles/getdata) и не обязательный параметр-массив $params.
Но, пожалуй, главное преимущество использования Smarty — это возможность использования сразу нескольких шаблонов оформления (скинов). У нас принцип такой, что есть базовый шаблон (поставляемый вместе со сборкой), и когда на конечном сайте надо поменять оформление и/или логику какую-то изменить, не надо делать полную копию скина и полностью на него переключаться, а просто указываете дополнительный скин и в нем уже вносите изменения. Это не только позволит уменьшить количество собственных скинов, но и позволит на уже работающий сайт накатывать изменения самой сборки, получая новый функционал и не ломая текущее оформление. Вот подробный мануал как это делается. Там на примере ShopModxBox, но повторюсь, принципы в NewsModxBox все те же самые.
Где и как скачать
Способ 1. Установка на чистый MODX
Внимание!!! Не устанавливайте этот пакет на боевой сайт. Это снимок полного сайта и он затрет текущий сайт. Устанавливается только на чистый MODX.
Итак, процесс установки относительно прост для тех, кто уже работает с MODX Revolution. Ставите чистый MODX. Затем в управлении пакетами добавляете новый репозиторий с адресом http://rest.modxstore.ru/extras/ и с него качаете и устанавливаете пакет NewsModxBox.
Не рекомендую устанавливать MODX версии 2.4.0 и 2.4.1, так как там есть весьма неприятная бага, патч на которую пока еще не приняли. Лучше ставить 2.3.6
Способ 2. Из архива.
Способ первый удобен, но не на всех хостинг-площадках пройдет. Во-первых, пакет весит 50+ метров, и где памяти мало выделено, он может просто не распаковаться. Во-вторых, установка длится не две секунды, и процесс установки может просто по таймауту прерваться (а на таймвеб.ру при загрузке процессора на 100% и через пять секунд скрипт обрывается). В таком случае для тех, кто знаком с MODX или просто не первый день занимается веб-разработкой, подойдет вариант развернуть сайт из полного дампа. Здесь сайт упакован полностью с MODX-ом, в корне имеется dump.sql. Все что требуется — распаковать его, создать базу данных, залить в нее дамп и подправить конфиги сайта.
Оба способа установки подробно описаны на странице закачки ShopModxBox (есть даже видео).
Ну а для тех, кто не может или не хочет устанавливать самостоятельно сборку, но хочется посмотреть ее изнутри, есть третий вариант — заказать установку тестового сайта у нас. Цена вопроса 300 рублей, сайт будет доступен на месяц. Устанавливается на наш хостинг и от вас не потребует никаких лишних движений. Форма заказа услуги находится здесь.
Наполнение
По наполнению основные моменты:
1. В раздел Рубрики добавляем нужные нам разделы с шаблоном Раздел.
2. Теперь разделы доступны в самом редакторе новостей. Там статьи и создаем/редактируем.
Кратко плюсы/минусы системы
Наша политика здесь такая же как и с ShopmodxBox — эта сборка просто для быстрого старта. В любом случае на конечных проектах придется что-то докручивать под частные бизнес-процессы. Мы заботимся не о всеобъемлющем функционале и универсальности, а о минимизации ядра, производительности и гибкости. То есть это что-то среднее между самопиской и CMS. Все крупные проекты стараются для себя самописку написать, чтобы точно все работало так, как им хочется. Но все писать с нуля — нет смысла. Вот здесь и свое дописать не сложно, и с нуля все писать не придется.
P.S. в эту пятницу (02.10.2015) в 19.00 в нашем офисе по адресу Москва, Новый Арбат, 21 пройдет мастер-класс по NewsModxBox. Всего 6 билетов. Если кто заинтересован, поторопитесь.