- PVSM.RU - https://www.pvsm.ru -
На самом деле скорее CMF, а название сложилось исторически. Смысл CMS/CMF в том, чтобы сделать разработку сайта проще, быстрее и дешевле. Но в реальной жизни можно столкнуться с тем, что отклонение от стандартного поведения в CMS вынуждает лезть в исходники ядра, что чревато последующими проблемами с обновлением и безопасностью, а в CMF можно столкнуться с высоким порогом входа и достаточно большим весом системы.
Моей целью было сделать баланс функциональности, сложности и удобства как можно более гармоничным.
Система имеет определённое количество велосипедов, немного магии, и большие планы.
На данный момент CleverStyle CMS может быть интересной игрушкой именно для разработчиков, так как позволяет быстро начать разработку и получать результаты, предоставляет сложным и/или рутинным задачам простой интерфейс, потому и статья об некоторых технических особенностях с примерами в общем.
Поддержка Windows отпала постепенно, слишком много оберток нужно было поддерживать для того, чтобы заставить всё работать идентично, и в определённый момент было решено выбросить это всё во имя простоты и скорости.
Возможно, и будет работать, но гарантий никаких не даю.
Начинается всё с установки. Она предельно простая: один установочный файл (автономный), одна страничка, несколько полей. Так, как чаще всего используется БД MySQL, а хост localhost — они используются по-умолчанию, но в режиме эксперта это можно изменить.
Установочный файл являет собой phar архив, и содержит в себе как установщик, так и исходники всей системы, а так же может комплектоваться произвольным набором компонентов. Для создания такого установщика есть специальный сборщик, который позволяет делать произвольные сборки в графическом режиме.
Результатом первого шага является готовая пустая CMS c гостем и корневым администратором (что-то вроде root в Linux).
Если вы — разработчик, вам захочется что-то написать. Начать можно с простого файла index.html c содержимым:
Привет, мой друг!
Затем зайти в components/modules от корня сайта, создать директорию Hello и бросить туда index.html
Это готовый модуль, чтобы его активировать нужно зайти в админку Компоненты/Модули, нажать Обновить список модулей. Появившийся модуль нужно установить и включить, после чего он появится в меню:
Вот так просто.
Немного более сложный вариант — использовать вместо index.html файл index.php.
В этом случае простым выводом уже не обойтись:
global $Page;
$Page->content('Привет, мой друг!');
Впрочем, не на много сложнее. Таких как $Page глобальных системных объектов несколько:
$Cache, $Config, $Core, $db, $Error, $Index, $Key, $L, $Mail, $Page, $Storage, $Text, $User
Все они доступны практически всегда, и отвечают каждый за свою часть общей функциональности. В общем название объекта соответствует названию класса (с некоторыми исключениями).
Все методы и некоторые (пока не все) свойства объектов имеют PhpDoc секции с объяснением типов входящих параметров, их описанием и даже некоторыми примерами входных данных. В wiki все объекты описаны, и многие имеют примеры готового кода, который можно скопировать 1 в 1 и он будет работать.
Так же есть один системный класс h, который используется как статический для рендеринга HTML с помощью CSS-подобного синтаксиса:
global $Page;
$Page->content(h::p('Параграф');
$Page->content(h::{'h1#some_id.and-class.another-class[data-type=title]'}('Заголовок статьи');
Система поддерживает работу с несколькими БД и их зеркалами одновременно, поддерживает различные backend-ы для кеша, умеет работать с несколькими хранилищами статических файлов и прочими вещами, но предоставляет для разработчика простой интерфейс взаимодействия со всем этим.
Работа с объектами сделана максимально натуральной и очевидной (вот тут немного магии):
global $Cache;
$Cache->item = 5;
$item = $Cache->item;
unset($Cache->item); //Хотя можно использовать и ::get() ::set() ::del() методы если вы правда считаете что эта магия будет для вас узким местом
$Cache->{'Movies/1'} = 1;
$Cache->{'Movies/2'} = 2;
unset($Cache->Movies); //Удаляет оба фильма из кеша
С многоязычным интерфейсом работать тоже легко:
global $L, $Page;
$Page->content($L->hello); //Здравствуйте
Так же можно использовать следующую интересную конструкцию:
global $L, $Page;
$Page->content($L->installation_of_module('Hello')); //Установка модуля Hello
Файлы перевода — JSON, а строки могут быть оформлены как для функции sprintf [1]. Для предыдущего примера:
"installation_of_module" : "Установка модуля %s"
Так можно делать персонализированные сообщения.
Аналогичный формат используется при работе с БД:
global $db;
$db->q(
"SELECT `login`
FROM `[prefix]users`
WHERE `id` = '%d'",
2
);
В этом примере перед подстановкой значение ещё будет обработано для защиты от SQL инъекций.
В случае нескольких запросов за раз можно так:
global $db;
$db->q(
[
"DELETE FROM `[prefix]users`
WHERE `id` = '%d'",
"DELETE FROM `[prefix]users_groups`
WHERE `id` = '%d'"
],
2
);
Кроме очевидности написанного, такой код красиво подсвечивает IDE.
Сайт имеет обычные страницы для конечного польззователя, как было в первых примерах, административные, и странички API, которые не имеют интерфейса и отдают контент в формате JSON.
Создаем внутри components/modules/Hello директорию api, а в ней файл index.php c содержимым:
global $Page;
$Page->json([
'title' => 'Привет!',
'description' => 'Приветствие хабрахабру через API'
]);
И обратившись с помощью jQuery по адресу api/Hello нам придет JSON строка с необходимым заголовком и телом.
Это если кратко. Например, модули и плагины ещё поддерживают зависимости (могут что-то требовать, с чем-то конфликтовать).
Компоненты устанавливаются тоже из phar архивов, которые если открыть напрямую покажут не установщик, а свой readme. Компоненты и система обновляются из тех же установщиков.
Всё это открыто и под дружелюбной MIT лицензией доступно всем желающим на GitHub, там же в wiki документация на английском.
https://github.com/nazar-pc/CleverStyle-CMS [2]
Часть независимых, но полезных функций вынесена и доступна отдельно, будет полезена любому PHP разработчику:
https://github.com/nazar-pc/Useful-PHP-Functions [3]
Это самые простые вещи, под данную CMS можно писать как предельно просто, так и немного сложнее.
Статья получилась не очень богатой на реальные примеры, если интересуют отдельные аспекты: разработка API сайта, работа с БД, роутингом, что-то ещё – напишу отдельную статью с простыми рабочими примерами.
Спасибо за внимание, буду рад любой обоснованной критике и пожеланиям, в состоянии Alpha каждый может повлиять на то, какой система будет в будущем.
Автор: nazarpc
Источник [4]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/cms/38302
Ссылки в тексте:
[1] sprintf: http://www.php.net/manual/ru/function.sprintf.php
[2] https://github.com/nazar-pc/CleverStyle-CMS: https://github.com/nazar-pc/CleverStyle-CMS
[3] https://github.com/nazar-pc/Useful-PHP-Functions: https://github.com/nazar-pc/Useful-PHP-Functions
[4] Источник: http://habrahabr.ru/post/186056/
Нажмите здесь для печати.