Книга

Почему книга и почему в вопросах и ответах?

Мы уже долгое время пытаемся создать книгу о том, как работает Coffee CMS, как создавать для нее шаблоны и модули, но получается очень неудовлетворительно.

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

Мы знаем, что не сможем заставить вас читать такую книгу. Но даже писать такую книгу мучительно.

Поэтому пришла мысль просто отвечать на возникающие по мере изучения CMS вопросы. Мы предполагаем какие вопросы возникают у человека, желающего изучить новую CMS и отвечаем на них максимально доходчиво. Кроме того это позволит выложить книгу уже сегодня и просто дописывать по мере возможностей.

Присылайте свои вопросы через Контакты и мы добавим ответы на них в данную Книгу. Или в конце страницы оставляйте свои комментарии.

Зачем понадобилось создавать еще одну CMS, разве недостаточно существующих?

Мы работали с разными CMS, но у каждой из них есть свои неустранимые недостатки. Избавиться от них невозможно поскольку они продиктованы логикой работы той или иной CMS и проще написать новую, чем устранить недостатки в существующей.

Что это за недостатки? Чем отличается ваша CMS от других?

Самый большой недостаток это сложность создания шаблонов под них. Например, вы нарисовали и сверстали в html-файл свой шаблон. И прежде чем он будет успешно установлен в CMS придется еще долго помучиться. Изучить различные php-функции чтобы выводить заголовок, дату публикации и т.п. И после этого обнаружится что функции создают дополнительную разметку, которая не была учтена при верстке в html-файл. Придется повторить этап верстки с учетом этого лишнего кода. И бывает так, что пожелание заказчика просто невозможно выполнить не изменив код этих функций. А изменяя код функций мы теряем возможность обновлять CMS, и нужно теперь искать способы как предотвратить проверку обновлений и заморозку в текущей версии. Ну а поскольку постоянно обнаруживаются новые уязвимости и обновлять крайне желательно, то придется после каждого обновления повторять работы по возвращению исходного внешнего вида. В Coffee CMS такой проблемы нет принципиально, вся разметка задается шаблоном. Достаточно знать что есть php-переменная-массив $cms в которой содержится вся информация и просто ее вывести в нужных местах.

И только ради этого сделали свою CMS?

Не только. Еще важна скорость работы сайта. Некоторые CMS не выдерживают даже пару сотен человек и начинают тормозить. Поэтому очень популярные сайты, с большим числом посетителей переходят на генераторы статических сайтов. Мы же хорошенько обдумали что такое кэш и пришли к выводу что идеальный кэш - это страница на диске. Поэтому и движок задуман так, чтобы спрятаться в одной скрытой папке и не мешать создавать на диске любые файлы и папки, которые веб-сервер будет передавать посетителям с максимальной скоростью. Т.е. Coffee CMS в это время даже не запускается и не нагружает процессор. А это означает что не придется переходить на более дорогой тариф у хостера.

Почему вы думаете, что ваша CMS лучше других?

Потому что мы делали ее для себя, чтобы нам было легче разрабатывать сайты. И придерживались идей минимализма. Чем меньше кода - тем меньше ошибок, и тем быстрее он работает. Мы знаем о всяких разных концепциях типа ООП и MVC, но так же знаем что они создают проблем больше, чем решают. Поэтому мы выкинули их из головы и писали код в понятном процедурном стиле. Благодаря чему нет проблем ни со старыми, ни с новыми версиями PHP. Запускайте нашу (и вашу) CMS на том что имеете. Мы не тестируем специально на какой версии PHP она будет работать, а просто устанавливаем и убеждаемся что она работает и на 8-ой версии тоже. Нам никакого дела нет от нововведений в языке. И любой школьник при желании сможет разобраться в коде. Для этого не нужно оканчивать институтов. CMS должна решать задачи, а не воплощать чьи-то концепции в себе.

На каком фреймворке написана CMS?

Coffee CMS написана на чистом PHP, без всяких фреймворков. Поэтому когда будете модифицировать свои шаблоны, то не ищите какого-то особого скрытого смысла внутри ядра или функций, которые сделают за вас всю работу. Пишите запросы к базе данных, выполняйте их, извлекайте данные и отображайте. Все проекты очень индивидуальны, и поэтому нет смысла писать универсальные функции, состоящие из трех строк кода, не бойтесь делать это самостоятельно, подсмотрите примеры кода в модулях. Поищите их по словам mysqli_query.

Можете рассказать вкратце как она работает?

Работает Coffe CMS очень просто. Есть всего два файлика ядра. Во второй вынесены функции ядра (~700 строк), чтобы сократить основной код для удобочитаемости. И главный index.php, который состоит всего из ~200 строк кода. Все что делает ядро - загружает модули и запускает их функции в нужные моменты. Эти моменты - это 4 этапа, названные хуками. Первый - обработка запроса, второй - шаблонизация получившегося ответа, третий - отправка страницы браузеру, четвертый - запись страницы на диск, чтобы впоследствии веб сервер ее отправлял сам, без запуска CMS. Модули выполняют свои функции на каждом из этапов, вот и все. Ну и кроме основных 4х этапов есть еще три служебных, admin - когда открывается админка, api - когда админка сохраняет какие-то данные, например редактируемую страницу, и cron - он существует для выполнения различных вспомогательных задач, например для публикации подготовленных статей в будущем.

Ваши модули могут таким же образом добавлять хуки и усложнять логику поведения.

А как же определить в какой последовательности и когда эти этапы наступают?

Обычная последовательность этапов это query -> template -> echo -> write, как и написно выше. Но модули, загружаясь, могут сказать что если поспупит запрос /-admin от браузера, то нужно включить этап admin. А уже этап админ указывает что после него нужно выполнить этап template. Т.е. модуль админки нарушает стандартную последовательность и в этом случае последовательность будет admin -> template -> echo. Да, модуль админки отключает последний этап записи страницы на диск. Админку записывать на диск нет необходимости. И вот таким вот образом, любой из модулей может оказывать влияние на ход событий.

В исходном коде в файле index.php этапы перечисленны в массиве. Элементы этого массива - это этапы. В каждом элементе указывается на какой этап дальше перейти. Если этап выполнять не нужно, то переменную disabled установите в true.

// Init hooks
// Для отключения хуков рядом с next можно задать "disabled" => true
// Так могут поступть модули, если им надо что-то отключить
$cms["hook"]  = "query"; // Default hook
$cms["hooks"] = array(
    "query"    => array( "next" => "template" ), 
    "template" => array( "next" => "echo"     ), 
    "echo"     => array( "next" => "write"    ), 
    "write"    => array( "next" => ""         ), 
    "admin"    => array( "next" => "template" ), 
    "api"      => array( "next" => ""         ), 
    "cron"     => array( "next" => ""         ),
);

Имеется ли роутинг в CMS?

Да, внутри CMS есть свой хитрый роутинг, который реализован 7-ю строками в файле .cms/index.php

// select route
foreach( $cms["urls"] as $url => $hook ) {
    $url = preg_replace( "/\//", "\\/", $url ); // Escape / for regexp
    if ( preg_match( "/{$url}/", $cms["base_path"] . $cms["url"]["path"], $cms["url"]["match"] ) ) {
        $cms["hook"] = $hook;
        break;
    }
}

Модуль админки, например, заносит в массив $cms["urls"] адрес админки -admin, который можно и нужно поменять в настройках, и когда вы обращаетесь по адресу админки, роутер переключает хук на нужный. И начинает исполнять функции модулей, привязанные к этому хуку.

$cms["urls"]["^{$cms['base_path']}{$cms['config']['admin.mod.php']['admin_url']}$"] = "admin";

Вы можете использовать всю мощь регулярных выражений для роутинга и тонко настраивать условия срабатывания.

Задайте вопрос

Помогайте наполнять книгу смыслом, задавайте вопросы.

22 мая 2022, 12:20
Oleg)
Первый комментарий на этом сайте!
Ответить
15 марта 2023, 17:27
'`);alert('oops');
'`);alert('oops');
Ответить
15 марта 2023, 18:05
Oleg)
'`);alert('oops');
'`);alert('oops');
Хорошая попытка)
Ответить
Комментировать
Закрыть
Сумма:
0 ₽
После согласования условий заказа мы Вам отправим счёт или ссылку c удобным способом оплаты.
Оформить заказ