Самый простой CMS своими руками

Здравствуйте, уважаемые посетители моего блога Курилка.co.ua. Термин CMS у меня всегда вызывает ощущение чего-то большого и функционального. Однако правда жизни такова, что чем сложнее тем больше ограничений. Стоят ли внимания все эти: визуальные редакторы, модули и т.п. — если речь идет о сайте из 5-8 страничек статического текста и пары динамический блоков? Судите сами, а я постараюсь рассказать как создать один из самых простых CMS.

Давайте разберемся, из чего состоит наш «маленький сайт»? Первое, это конечно же – шаблон. В большинстве случаев его каркас одинаков для всех страницах: шапка, боковая панель (с меню, картинками и т.п.) и подвал. Все это можно поместить в корневой файл index.php как есть. Далее – контент (содержание), который меняется и потому, в зависимости от необходимой страницы, мы будет вставлять его там, где нам это нужно, тем самым автоматизируя весь процесс. Как это сделать?

Так как я говорю о PHP, то самый простой способ использовать функцию include(). При этом, содержание страниц, в виде отдельных *.php файлов (дополнительная предосторожность, в случае если вы будете вставлять не только HTML-код но и какой-то скрипт), будут находиться в директории pages/. А вот и сам код из index.php:

<?php
if ( isset($_GET['page']) ) $page = $_GET['page'];
elseif ( isset($_POST['page']) ) $page = $_POST['page'];
else $page = '';
$pages = array('index','about','news','service','contacts');
if ( !in_array($page, $pages) ) $page = 'index';
$page_file = 'pages/'.$page.'.php';
if ( file_exists($page_file) ) include_once $page_file;
else echo 'Not found';
?>

Здесь, значением переменная $page, является «название» страницы контента, которое передается скрипту методом GET или POST. Чтобы обезопасить наш CMS от попыток подсунуть в переменную $page какую-то «гадость» мы ограничим диапазон её значений соответствующим набором вариантов $pages. В дальнейшем идет проверка, есть ли полученное значение названия страницы $page в массиве $pages, в противном случае вставляем контент страницы идущей по умолчанию. В моем примере это pages/index.php. Дополнительно мы проверяем существование вставляемого файла, иначе возвращаем сообщение: «Not found».

Понятно, что вызов страницы скажем «О компании» будет иметь вид:

http://sitename.ru/index.php?page=about

На этом можно и остановиться, но если хочется более приемлемого варианта URL, скажем:

http://sitename.ru/about.html

то тут придется использовать RewriteRule — серверная опция модуля mod_rewrite, которая позволяет производить необходимую нам манипуляцию, внося определенные установки в файл .htaccess. В нашем случае это может выглядеть так:

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(.*).html$ /index.php?page=$1
</IfModule>

Здесь мы проверяем, существует ли на сервисе поддержка модуля mod_rewrite, включаем его и задаем правило, которое будет применено к URL’ям заканчивающимся строкой «.html». При этом, остальная часть будет использоваться как значение, передаваемое index.php в переменной page. Конечно, можно побаловаться с регулярными выражениями, скажем введя ограничения на допустимые символы:

RewriteRule ^([-a-zA-Z0-9_]+).html$ /index.php?page=$1

В любом случае будьте аккуратны, дабы обезопасить свой CMS, и все будет хорошо. Для того же чтоб страницы с контентом не могли просмотреть отдельно от каркаса шаблона, можно использовать простенькую фишку. В файле index.php определим константу PAGE_ACCESS:

<?php define("PAGE_ACCESS", "OK"); ?>

это будет своего рода «маячок доступа», обозначающий что страница контента инклудится, а не вызывается отдельно. При этом в страницах контента ставим условие:

<?php if (PAGE_ACCESS!="OK") die ('no access'); ?>

Конечно, все это простые и не самые оригинальные вещи, но быть может для кого-то станет более удобным решением, чем навороченный CMS. На этом всё и спасибо за внимание.