Курилка.co.ua
Orphus RSS kurilka.co.ua

Category

Archives

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

Author wmas wmas | Category Category PHP

Здравствуйте, уважаемые посетители моего блога Курилка.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. На этом всё и спасибо за внимание.

Publish: Четверг Фев 4, 2010

15 Responses for "Самый простой CMS своими руками"

feed for comments on this post

  • Комментарий #637 author: Sam Reply
    publish: Среда Дек 5, 2007 at 6:47 пп

    И где тут CMS? Надо было бы назвать «начинаем писать простейший фреймворк».

  • Комментарий #638 author: wmas Reply
    publish: Среда Дек 5, 2007 at 10:59 пп

    2Sam хм, возможно и фреймворк. CMS это система управления контентам, в моем примере управление весьма относительное, но я не особо знаю, что такое фреймворк. Да и CMS как-то людям привычней :P

  • Комментарий #635 author: Sam Reply
    publish: Четверг Дек 6, 2007 at 1:10 пп

    Привычней-то привычней, но это не CMS.

  • Комментарий #636 author: wmas Reply
    publish: Четверг Дек 6, 2007 at 2:04 пп

    2Sam: согласен, но как по мне, рассматривая затронутую ситуацию, это неплохая альтернатива :idea:

  • Комментарий #643 author: Ctox Reply
    publish: Четверг Дек 27, 2007 at 10:27 дп

    на на прикол.ру закинуть сей пост… про кмс

  • Комментарий #644 author: wmas Reply
    publish: Четверг Дек 27, 2007 at 12:43 пп

    2Ctox: можно и на прикол.ру :mrgreen: но ведь работает ;)

  • Комментарий #645 author: Неисправимый Оптимист Reply
    publish: Понедельник Дек 31, 2007 at 8:20 пп

    Я тоже страдал подобной фигнёй, пока не прикончил свою лень и не разобрался, как работать с MySQL, теперь писать свою CMS стало куда проще и с меньшим количеством кода, чем в этом примере. Хотя новичков твой пост может подстегнуть ;)

  • Комментарий #646 author: wmas Reply
    publish: Вторник Янв 1, 2008 at 11:28 дп

    2Неисправимый Оптимист: с MySQL я знаком ну может не так давно года 2-3, так что может и плоха в нем разбираюсь :lol: но честно говоря не вдуплю как он может повлиять на уменьшение кода, если MySQL, говоря уж совсем простым языком, средство для удобного хранения данных. При этом, необходимо разработать интерфейс, который бы выводил хранимое в БД, да еще и позволял его редактировать, а тут зашел по FTP открыл файл и делай че хочешь, хоть текст меняй, хоть разметку, а хошь и PHP-код 8)

  • Комментарий #1465 author: Nalivaeff Reply
    publish: Понедельник Мар 10, 2008 at 2:56 пп

    Отличный пост. Люблю подобные скрипты. Чтоб простенько и со вкусом. Кому нужно и немного сечет — может сам прикрутить и админ панель и модули всякие. Очередной респект и уважуха!

  • Комментарий #1466 author: Nalivaeff Reply
    publish: Понедельник Мар 10, 2008 at 4:03 пп

    P.S. правда я заменил строчку $page = $_PAGE['page'];
    на
    $page = $_GET['page'];

  • Комментарий #1467 author: wmas Reply
    publish: Понедельник Мар 10, 2008 at 4:07 пп

    2Nalivaeff: как таково, это не готовый к употреблению скрипт, а концептуальное решение которое можно использовать при небольшом сайте как альтернативу хоть качественным но имхо громозским CMS ;-)

  • Комментарий #1468 author: wmas Reply
    publish: Понедельник Мар 10, 2008 at 4:13 пп

    2Nalivaeff: да, спасибо, была небольшая ошибочка. Вообще можно даже использовать $_REQUEST тогда можно не париться с post/get, но в некоторых случаях это не безопасно, т.к. включает в себя и значения из $_COOKIE. Хотя, что-то утверждать не возьмусь :oops:

  • Комментарий #2568 author: Vect0r Reply (subscribed to comments)
    publish: Пятница Фев 5, 2010 at 9:27 дп

    Для начинающих очень даже неплохой вариант.

    Вот только напрягла следующая строчка:

    if ( in_array($page, $pages) ) $page = 'index';

    Разве не должно быть «…!in_array…» ?
    Долго думал, но кажется, что восклицательный знак должен быть.

  • Комментарий #2569 author: wmas Reply
    publish: Пятница Фев 5, 2010 at 3:32 пп

    2Vect0r: Привет Виктор, да действительно пропустил. Просто слегка решил обновить заметку и чуть улучшив код… вот и улучшил :mrgreen: теперь поправил, вроде всё правильно :oops:

  • Комментарий #2821 author: dnua Reply (subscribed to comments)
    publish: Среда Июн 8, 2011 at 3:22 пп

    ;-)

    Да уж, простые вещи. Но про них иногда забываешь.


Popular links

Copyright © since 2006 Курилка.co.ua,
powered by WordPress