Ядро
Обработка запросов
Чтобы запросы к разделам попадали на обработчик _core.php, нужно правильно настроить корневой файл .htaccess. Пример файла:
Options -Indexes
# Включаем mod_rewrite
RewriteEngine On
# Устанавливаем корневой путь (если CMS установлена в подпапку, укажите здесь)
RewriteBase /
# Исключаем обращения к реальным файлам (изображения, css, js и т.п.)
RewriteCond %{REQUEST_FILENAME} !-f
# Перенаправляем ВСЁ в _core.php
RewriteRule ^(.*)$ _core.php [QSA,L]
Содержимое _core.php:
<?php
// Отладка: включаем отображение ошибок
error_reporting(E_ALL);
ini_set('display_errors', 1);
require_once $_SERVER['DOCUMENT_ROOT'].'/_tmpl/define.php';
require_once CORE . '/core/core.php';
// обновляем карту сайта
if (mc::is_admin()
&& (!is_file(SITEROOT.'/sitemap.xml') || (intval(stat(SITEROOT.'/sitemap.xml')['mtime']) + 60*60) < time())) {
module('sitemap');
}
?>
В строках 3 и 4 включается отображение всех предупреждений и ошибок. На работающем сайте рекомендуется отредактировать или закомментировать эти строки.
Строка 6 подключает основные настройки сайта.
Строка 7 запускает инициализацию движка.
Со строки 9 запускается генерация файла карты сайта sitemap.xml. Можно убрать этот функционал в планировщик Cron.
Среди констант, подключенных в define.php, есть те, которые указывают пути к папке движка CORE, папке шаблонов TMPL и папке скриптов и стилей INC:
define('CORE_URI', '_mc2');
define('CORE', $_SERVER['DOCUMENT_ROOT'].'/'.CORE_URI);
define('TMPL', $_SERVER['DOCUMENT_ROOT'].'/_tmpl');
define('INC', '_inc');
Инициализация
Ядро:
- последовательно подключает необходимые файлы
- устанавливает константу MC2_CORE в true
- загружает пользователя и его права доступа
- читает _section.php и _menu.php открытого раздела и загружает эти данные в переменные класса mc.
- определяет право на доступ пользователя к разделу и в зависимости от этого:
- читает index.php раздела
- или читает модуль, указанный в _section.php
- или выдаёт ошибку
- определяет подходящий шаблон _template.php и выдаёт его
Класс mc
Private static переменные содержат информацию о разделе, меню и пользователе. Доступ к ним осуществляется через методы класса.
private static $section = [];
private static $menu = [];
private static $user = null;
private static $admin = [];
private static $script = [];
Доступные публичные методы класса:
mc::section($param = '', $value = '')
Выводит или обновляет информацию о параметрах раздела, которые прочитаны из _section.php.
Если не указана $param, то выводится весь массив.
Если указана $param, то только значение указанной переменной.
Если указана $value, то $param присваивается новое значение.
mc::menu()
Выводит массив меню.
mc::user($param = '')
Выводит информацию о пользователе.
Если не указана $param, то выводится весь массив информации.
Если указана $param, то только значение указанной переменной.
mc::admin($param = ''): bool|array
Выводит информацию о правах доступа пользователя.
Если не указана $param, то выводится весь массив имеющихся прав.
Если указана $param, то только значение указанной переменной true/false.
mc::is_admin(): bool
Возвращает true/false является ли пользователь хоть каким-нибудь администратором.
mc::error(int $code)
Запускает отображение страницы ошибки с указанным кодом.
mc::init(): string
Инициализирует ядро. Возвращает строку $uri.
mc::section_access($access): bool
Проверяет права доступа пользователя, возвращает true/false. $access - требуемые права доступа, разделенные запятыми ",". Если хотя бы одно право есть у пользователя, то доступ разрешён.
mc::set_script(string $module, string $template, string $file)
Добавляет в private массив mc::$script ссылку на самый приоритетный javascript файл $file для модуля $module с шаблоном $template. Сам файл ищется по следующей схеме:
- Максимальный приоритет у файла по пути SITEROOT/INC/$module/$template/$file
- Если предыдущий не найден, то SITEROOT/INC/$module/$file
- Если ни один не найден, то CORE/inc/$module/$file
Такой подход позволяет заменять стандартные javascript файлы модуля на свои. Для этого их нужно скопировать в папку SITEROOT/INC/$module/$file или SITEROOT/INC/$module/$template/$file и уже там изменять.
mc::get_script(): array
Возвращает массив ссылок на скрипты для использования в шаблоне страницы _template.php. Пример использования:
mc::set_script('main', '', 'script.js');
mc::set_script('main', '', 'gallery.js');
mc::set_script('message', '', 'script.js');
foreach (mc::get_script() as $script_link) {
echo '<script src="'.$script_link.'"></script>'."\n";
}
mc::is_user(): bool
Возвращает true/false является ли посетитель зарегистрированным пользователем сайта.
mc::admin_uri()
Проверяет, находится ли вызов внутри админки. Возвращает true/false.