В прошлом году время от времени работал с фреймворком Laravel. Писал API для одного некоммерческого проекта, перевел на него (с голого PHP) один коммерческий. Понравилось, даже статейку небольшую написал. Однажды, в какой-то из новостных лент по теме, попалось упоминание October CMS. В упоминании говорилось, что у этой CMS под капотом как раз самый настоящий Laravel и есть, версии 5.0. Немедленно захотелось посмотреть, и вот на днях — удалось поставить, поиграться и даже написать пару небольших плагинов. Делюсь впечатлениями.
Первым делом посмотрел вводный ролик. Глядя как человек вбивает html-разметку прямо в браузере и представляет процесс как прогрессивный — пришел в легкое замешательство. Ну, потому что будучи старым друпальщиком, знаю, что вбивать тот или иной код от руки внутри админки — это, скорее всего, странно. Однако ближе к концу ролика выяснилось, что весь вбитый таким образом код — попадет в файлы, составляющие тему сайта. То есть вбивать его из админки, или из любимой IDE — вообще без разницы, результат будет один. А редактор кода в админке просто для удобства сделан. Хороший, кстати, редактор, с подсветочкой, с поддержкой горячих клавиш, автокомплита только не хватает. Да и не надо, IDE же есть.
На том замешательство закончилось, стал изучать дальше. Выяснил, что сайт в October довольно четко разделяется на фронтэнд и бэкэнд. В бэкэнде пользователь с соответствующими правами создает, редактирует, удаляет и настраивает. Во фронтэнде отображаются конечные страницы: материалы, ленты материалов, в общем, то, что видит обычный юзер.
Фронтэнд полностью определяется темой сайта. Только, в отличие от Друпала, тема здесь — это не просто набор темплейтов и ассетов. В October вариант «переключил тему и получил то же самое в другом оформлении» не прокатит. Тема в October, помимо темплейтов и ассетов, содержит определение всех страниц фронтэнда сайта и правил их роутинга. То есть, если в теме создана страница /blog с лентой постов, то пользователь ее увидит. А если переключиться на тему, где такой страницы нет — ленту постов не увидит никто. Друпалеру это непривычно. Но на практике довольно удобно: структура страниц сайта не раскидана по модулям, нодам, да настройкам в БД, а явно задана файлами темы. И клонировать такую структуру довольно просто.
Почитал документацию про создание темы. Выяснил, что у темы есть следующие основные составляющие:
- layout — это каркас, общая разметка страницы: хедер, футер да скрипты. Ближайший аналог в Друпале: html.tpl.php. Лейаутов может быть несколько.
- page — это шаблон отдельной страницы, который помимо разметки содержит к тому же и URL. Например / — главная страница, /blog/:id — страница отдельного поста с id в качестве параметра и т.п. При создании страницы нужно указать используемый лейаут, так что можно разные страницы выводить в разных лейаутах.
- partial — это шаблон блока, пригодный для повторного использования, например, меню.
- content — это тот же partial, но статичный: подойдет когда не нужно вставлять никакие динамические компоненты, например, блок контактной информации; поддерживает html, plain text и markdown.
- assets — стили, скрипты, картинки, в общем понятно.
Шаблонизатором в October работает Twig, что привычно друпалеру, уже знакомому с восьмой версией, но не очень привычно разработчику Laravel, где по умолчанию применяется Blade (хотя ничто не мешает перейти на Twig и там). Каждый htm-шаблон может содержать 3 секции, разделенные знаками == : секцию настроек, PHP-кода (например, чтобы подготовить данные к выводу) и, собственно, разметки Twig.
Основным кирпичиком фронт-энда в October является компонент. В двух словах это view для каких-либо динамических данных. Например, лента постов. Или отдельный пост. Или список фотогалерей. Изнутри компонент — это класс для подготовки выводимых данных, а также дефолтный шаблон с разметкой (который можно переопределить в теме). Снаружи компонент просто прикрепляется к нужной странице, а в разметке шаблона пишется:
{% component 'myComponent' %}
В классе компонента задаются разнообразные настройки и гибкость повторного использования компонента определяется гибкостью этих настроек. Например, можно вывести на главной 3 поста из блога без пагинации, а на странице /blog — 10 постов с пагинацией, и для этого используется один и тот же компонент.
В ходе изучения покопался в админке. Впечатления от нее в целом — довольно положительные. Все удобно, особенно радует, что при редактировании любого элемента можно просто нажать Ctrl+S для сохранения. Отдельные вещи конечно могут вогнать в ступор. Не все сразу соображают, для чего нужен знак >_ в настройках компонентов (его и заметить можно не сразу). А я, например, долго искал управление плагинами и нашел только перебором всего что есть в админке в секции Settings→System→Update (кто бы мог подумать). Но в целом — чистенько, удобно и добротно, не стыдно и заказчику такую админку предъявить.
Конечно, как разработчику мне интересно и всякое про Laravel. Встреча с ним в October начинается прямо с консоли: используемая в Ларавеле утилита artisan (аналог drush) применяется тут на полную катушку. Есть команды для scaffolding-а моделей, контроллеров, компонентов и целых плагинов. Есть и для скачивания/переустановки этих плагинов, и для обновления кэша, и для запуска миграций. И мало того, что всеми возможностями фреймворка можно пользоваться, разработчики October и сами добавили к ним удобностей. Например, благодаря бэкэнд-контроллерам в October можно для каждой создаваемой модели очень быстро собрать полноценную CRUD-админку и список экземпляров, с пагинацией и поиском. Просто заполнив несколько yaml-файлов.
Еще о моделях вот что следует сказать. В October модели растут из ларавельного класса Model (который есть реализация паттерна ActiveRecord). Обобщенных сущностей с бандлами, как в Drupal 7, тут нет, если они действительно нужны — нужно их строить на ORM Ларавела, через отношения между разными моделями. Для удобства создания моделей, кстати, можно использовать плагин Builder. В нём много всего для скаффолдинга из админки, можно и модели «накликать». На выходе получится код класса-наследника от Model и миграция, содержащая таблицу с накликанными полями.
Кстати, то что сделанные настройки и изменения легко попадают в код — полюбилось первее всего. Помимо контроля версий и деплоя, это еще очень удобно для разнообразных экспериментов. Поставил отдельную копию демо, накидал страницу для проверки какой-нибудь идеи, насоздавал моделей в билдере и т.д. Если результат понравился — залез в код и скопировал все, что нужно. И не надо заново «повторять все нужные клики» на рабочей копии.
Что еще понравилось.
- Приятный менеджер загрузок, похожий на тот, что в Вордпрессе.
- Плагин Blog из коробки поддерживает формат Markdown и, что еще круче, CSV-импорт и экспорт материалов.
- AJAX framework бодренький, а в бэкэнде многое и вовсе автоматически аяксифицируется.
- Документация хотя и не сильно большая, но освещает все основные моменты, нужные для вхождения в систему. Правда, как я понимаю, предполагается, что пользователю будет не сложно ради знаний заглянуть и в код ядра/плагинов, что на пороге вхождения скажется обязательно.
- GUI-инсталлятор тоже весь такой симпатичный, хотя на регулярной основе проще ставить из консоли.
Конечно, есть и недостатки. Например, друпальный комбо path alias + redirect, такой привычный, что воспринимается как должное, по умолчанию отсутствует. Да, любой странице можно задать адрес, в том числе и с применением шаблонов (как в pathauto), и даже транслит с кириллицы из коробки работает. Но если у меня блог-посты имеют адрес /:year/:month/:day/:name (для чего кстати пришлось попатчить плагин Blog), а я хочу чтобы вот этот конкретный пост был с адресом /articles/octobercms — это будет довольно нетривиальная задачка. Впрочем, далеко не каждый сочтет этот недостаток серьезным.
По большей части же недостатки скорее обусловлены молодостью системы и сравнительно небольшим числом разработчиков. То есть каких-то фич нет просто потому что их еще никто не сделал. Коммьюнити не очень большое, по форуму и гитхабу видно, что люди с системой работают, движение есть. Но на вопросы отвечают не очень быстро и ссаными тряпками никто никого не гоняет. Есть и русскоязычное сообщество, очень маленькое, если на форум смотреть. В этом смысле с Друпалом конечно сложно сравнивать — и с коммьюнити, и с объемами доступного кода. Но Друпал, можно сказать, уже старец. А Октябрь — наоборот.
В целом, по первым впечатлениям, October — это скорее CMS для разработчиков, которые не боятся кодить, а не для любителей «накликать сайт». Под капотом прогрессивный PHP-фреймворк. Конфиги и модели, даже будучи накликанными в админке, попадают в код, что удобно для деплоя. Темизация — мощный Twig и минимум прослоек между данными и, собственно, версткой. Мне всё это нравится.
Вот такие у меня получились первые впечатления. Безусловно, это не полномасштабный обзор, не было цели его писать. Но так или иначе — вряд ли эта заметка долго будет единственной про October CMS на домовой странице.