Два года назад я писал про готовую сборку интернет-магазина на 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 билетов. Если кто заинтересован, поторопитесь.

Комментарии (19)


  1. yegreS
    28.09.2015 16:07

    так я и не понял, а на существующий сайт NewsModxBox можно установить?


    1. Fi1osof
      28.09.2015 16:38

      Внимание!!! Не устанавливайте этот пакет на боевой сайт. Это снимок полного сайта и он затрет текущий сайт. Устанавливается только на чистый MODX.

      Уточняю: нельзя. То есть это основа для нового проекта, а не просто дополнительный модуль г существующему сайту.


  1. EzS
    28.09.2015 22:38

    Все крупные проекты стараются для себя самописку написать, чтобы точно все работало так, как им хочется. Но все писать с нуля — нет смысла.
    Это основной прицип любой CMF :)

    На досуге посмотрю ваше новое творение!


    1. Fi1osof
      28.09.2015 22:51

      ОК. Буду рад комментам.


  1. MetaDone
    29.09.2015 13:06

    Генерация превьюшек из PSF для журналов

    опечаточка


    1. Fi1osof
      29.09.2015 14:23

      Новый формат PSD + PDF)))
      Спасибо! Поправил.


  1. MetaDone
    29.09.2015 13:20

    Смутил эпизод в пункте «Бешенная техническая оптимизация»
    Хотелось бы узнать характеристики сервера, а еще узнать почему если сервер не удалось завалить то почему 100% в вашем же скрине отвалились по таймауту с 414 активными пользователями.

    Во-первых, пакет весит 50+ метров, и где памяти мало выделено, он может просто не распаковаться

    В этом случае он будет по вашим словам быстро работать?


    1. Fi1osof
      29.09.2015 14:34

      Смутил эпизод в пункте «Бешенная техническая оптимизация»
      На портале 75 000 статей страницу отдавал за 0.05 сек. Считаете это плохой результат? К слову, да, забыл вот эту статью приложить: habrahabr.ru/post/253737 Это часть этой технической оптимизации.

      Хотелось бы узнать характеристики сервера, а еще узнать почему если сервер не удалось завалить то почему 100% в вашем же скрине отвалились по таймауту с 414 активными пользователями.
      Сервер — VDS 4 ядра 4Гб оперативы, за 839 рублей/месяц.
      По поводу падения, цитата из скрина:
      This is quite excelent result. There`s a weird peak at 414 users — it looks like memcache had a hiccup, but it recovered fast and delivered a lot of responses!
      Перевод гуглом крайне смешной, поэтому если кто хорошо английский знает, просьба перевести в комменте. Но суть в том, что на 414 пользователях как будто мемкеш отваливался, но быстро восстанавливался, при этом сервер генерировал кучу ответов. То есть речь не о падении всего сервера, а о падении одной службы. Да, это нарушало работу сайта, но стоит просто поднастроить получше мемкеш и все полетит. Да 2000 юзеров онлайн, согласитесь — это совсем не мало.

      В этом случае он будет по вашим словам быстро работать?
      Да, будет. Ведь это полный пакет, включая библиотеки типа Smarty, phpMorphy и многое другое. Не все же за раз выполняется, а только то, что нужно для решения определенной задачи. Уточню: это не одна маленькая либа, а полный сайт с кучей всего.


      1. MetaDone
        29.09.2015 15:25

        На портале 75 000 статей страницу отдавал за 0.05 сек

        Результат хороший, но не дает объективного представления о быстродействии, т.к. mysql кеширует запросы, т.е. обращение к одной странице даже без кэша движка будет быстрым.
        Если бы такой же показатель был при переходе по пагинации, количество новостей постоянно увеличивалось, а часть удалялась и скорость все равно была такой же — уже было бы ближе к истине, а если в результате тестирования количество информации в базе не меняется — то кэш ускорит все немеренно на любой платформе.
        Если мемкэш отваливается, разумно предусмотреть переключение хотя б на файловый кэш при нехватке места или недоступности


        1. Fi1osof
          29.09.2015 16:12

          Быстрее и быстро — не всегда одно и то же. Но доказывать сильно ничего не буду. Для меня работает ОК. Много кто из тех, кто понимает в MODX тоже считают что очень даже ОК (включая саму команду MODX). А кому-то будет не ОК. Пусть каждый остается при своем мнении. А то очередной холивар разводить вообще не хочется.


          1. MetaDone
            29.09.2015 16:29
            +1

            Проводили нагрузочное тестирование, 75 000 статей и 2000 пользователей онлайн не смогли положить сервер

            Это не долгое выполнение скрипта, а просто какая-то ошибка

            покажите свой сайт, который при 2000 юзеров онлайн выдаст 14% OK200

            Для меня работает ОК

            Что-то подсказывает мне что пункт про «бешеную техническую оптимизацию» был выложен в надежде что никто его не посмотрит, а поверят на слово.
            Я вот не понимаю в modx и по мне так абсолютно нет разницы на чем сделан сайт — он или работает, или нет. Тормозит при каких-то обстоятельствах или нет.
            Из приведенной вами же статистики видно, что картина не настолько радужная, есть еще над чем работать


            1. Fi1osof
              29.09.2015 16:35
              -1

              Что-то мне подсказывает, что вы не выложите ничего лучше, и тем более бесплатно, и не факт что от вас вообще хоть что-то можно будет дождаться, так как ни одного топика подобного у вас нет, а только куча комментариев, которые вероятно кому-то чем-то должны помочь.
              NewsModxBox хоть и свежий продукт, но он еще лучше ShopModxBox-а, а тот продукт оценило не мало народа за два года, и интерес только возрастает. В том числе, кстати, и из-за производительности.


              1. MetaDone
                29.09.2015 16:57
                +1

                не факт что от вас вообще хоть что-то можно будет дождаться, так как ни одного топика подобного у вас нет

                топики — это просто статьи, они точно ничего не говорят о желании/возможности писать и выкладывать что-то. вместо написания статей здесь предпочитаю изучить что-то новое, кто знает, может и ваш NewsModxBox когда-нибудь пригодится (но это крайне маловероятно)
                Странно, почему такая агрессия на конструктивное замечание — не очень гладкие результаты нагрузочного тестирования, настройте до конца и выложите обновленные результаты. Иначе создается впечатление о недобросовестном изложении фактов.


                1. Fi1osof
                  29.09.2015 17:04
                  -2

                  В том-то и дело, что конструктива нет. Конструктив — это «возражаешь — предлагай». То есть даете продукт качественней и лучше — ОК. А тут что? Фиии…
                  Ну ОК, не нравится — я не возражаю. Пусть вам не нравится. Только на диалог не надо вынуждать, он не имеет смысла.


                  1. MetaDone
                    29.09.2015 17:12

                    Я вам предложил проверять доступность мемкэша, сделать его альтернативу в случае недоступности, не выдавать сырые результаты за положительные. Если вы в этом видите не конструктивные замечания, а только личные нападки, то продолжать диалог действительно не имеет смысла. Судя по всему я не правильно понимаю понятие «быстродействие» в рамках работы с modx. Если

                    Много кто из тех, кто понимает в MODX тоже считают что очень даже ОК (включая саму команду MODX)

                    — то ок, все круто. Но результаты нагрузочного тестирования все равно лучше обновить


                    1. Fi1osof
                      29.09.2015 17:14

                      Может когда-нибудь обновим. Это не специально подготовленная версия. Может она и далека от идеала, зато реальная.


  1. TheEvil
    29.09.2015 14:48
    +1

    Проводили нагрузочное тестирование, 75 000 статей и 2000 пользователей онлайн не смогли положить сервер.
    А это ничего, что в вашем же тесте 86% «ответов» — 502 Bad Gateway, т.е. отвалился бэкенд? Если вы этого не видите, то глубже даже лезть бессмысленно.


    1. Fi1osof
      29.09.2015 16:08
      -3

      А ничего, что timeout показывает 0%? В таком случае как раз очень имеет смысл лезть глубже. Это не долгое выполнение скрипта, а просто какая-то ошибка.
      И если по вашему все это очень плохой результат, то покажите свой сайт, который при 2000 юзеров онлайн выдаст 14% OK200.


      1. TheEvil
        29.09.2015 19:00
        +4

        Ясно. Просто ясно.

        Это не «какая-то ошибка», а у вас бэкенд лежит почти всё время теста, приём. Иными словами, вы протестировали, насколько быстро ваш веб-сервер отдаёт статичные страницы с ошибкой. С этим он справляется блестяще, мы всё поняли.