понедельник, 6 октября 2008 г.

Структура CMS

Когда я писал самую первую версию своего движка, то почему-то особо не задумывался какую выбрать структуру. Так сказать, что первое в голову пришло – то и написал. Попытаюсь объяснить основной принцип работы. 
Движок работает с модулем Apache mod_rewrite, что позволяет сделать «дружественные» URL.Файл .htaccess:
RewriteEngine On
RewriteCond %{REQUEST_URI} ![^/]+\.[^./]+$
RewriteRule (.+)/? index.php?$1
И файл index.php:
require_once('./bin/core.php'); //основной файл
$engine = new Processor(); 
$engine->start($_SERVER['QUERY_STRING']); 

В последней строчке передаём в метод start запрошенный адрес. Например если мы обращаемся к, то $_SERVER['QUERY_STRING'] будет /module/param. 
Что же делает метод start? Для начала расчленим полученный $_SERVER['QUERY_STRING']:  
$mm = explode('/', $request);
где $request – свойство метода start(), а $mm – массив, полученный после расчленения.
$mm[0] будет не что иное как запрошенный модуль.

Думаю самое время позаботиться о безопасности и сделать всему $_POST и массиву $mm обреза…т.е. фильтрацию простив SQL инъекции и XSS. Если в дальнейшем будет использоваться кукис, то и его отфильтровать.

Тут надо остановиться и не писать хрень типа include(“/modules/”.$mm[0].”/index.php”). Для начала надо сделать обязательную проверку на существование запрошенного модуля.

Далее подключаем основной шаблон, объявляем класс с модулем.
Впереди, наверное самое сложное: необходимо определить какой метод запускать при определённом запрошенном адресе. Общий вид «определителя» я взял из CakePHP. Повторюсь: общий вид, а не код. Вот как примерно это выглядело:
$this->rewrite(“/news/top”, $function, $template, $currentUrl);
Первое свойство – шаблон предполагаемого URL, $function – метод, который необходимо запустить если предполагаемый URL равен действительному, $template – шаблон, $currentUrl – массив $mm (читайте выше). $this->rewrite выполняет сравнение предполагаемого и действительного URL и если всё ОК, то запускает метод $function. Пример вида шаблона: если мы ввели адрес “/news/view/4”, то шаблон предполагаемого URL будет “/news/view/*”.

Это один из возможных вариантов структуры CMS. Сейчас я создаю движок почти по такой же структуре, но добавил несколько полезных вещей: многоязычность, определение параметров модуля в БД (если мы ввели http://site/novosti_mira/ то будет запущен модуль news, т.е. другими словами: можно задать любой URL для любого модуля), полностью новый Rewrite.

Комментариев нет: