iCMS – CMS не такая как другие
// PHP
На данный момент CMS системой никого не удивишь, но что-то мне захотелось создать свой велосипед, но не совсем обычный…
И так, основная идея – создать мини CMS, с максимально “прозрачной” админкой и структурой, и сделать упор на дружелюбность по отношению к неопытному пользователю.
Админка
Начнем с “прозрачной” админки, для этой цели решил не создавать громоздкую админ панель, она будет выглядеть вот так (кликабельно):
- 0 – кнопка которая отображает/прячет админку
- 1 – создать/редактировать запись
- 2 – меню для редактирования оформления
- 3 – меню для редактирования секций (о них позже)
- 4 – кнопка удаления записи
- 5 – выход из админки
А как же пользователь попадет в такую чудо-админку? Я решил отойти от стандартной процедуры авторизации (посредством связки логин/пароль из файла пароли.txt на рабочем столе), по этой причине Вам хватит правильной ссылки на админку типа /this-is-true-admin-link-please-remember-it.html, которую Вы сможете занести в букмарки…
Таким образом ходим по сайту, смотрим – “Ага, вот страничка которую хотел подредактировать” – клик по букмаркам – мы в админке, нажимаем “Редактировать” и видим WYSIWYG редактор – WYMeditor (кликабельно):

Если же Вам необходимо создать новую страницу – то достаточно будет указать желаемый URL и система сама предложит создать такую страницу (аналогично как сделано в Wiki).
Структура
Теперь стоит обратить внимание на “прозрачную” структуру, что я под этим подразумеваю – это значит, что обращаясь к адресу вида http://domain.com/news/happy-new-year.html Вы увидите содержимое файла, который и на FTP лежит по тому-же адресу – /news/happy-new-year.html (за исключением верстки – лишь контент), т.е. никаких заморочек – особенно если Вы, либо Ваш клиент, привыкли править всё по FTP (да-да данная CMS построена на файлах).
Кстати, и редактирование, и заливка файлов происходит через FTP аккаунт – это на тот случай если хостинг кривоват – и web-сервер создавая/редактируя файлы не дает права для FTP пользователя (ну и обратная ситуация – нет необходимости разрешать web-серверу редактирование файлов).
Каталог CMS выглядет следующим образом:
-\ mysite
|--\ application - тут сама система
|--\ css - оформление сайта - CSS да картинки
|--\ include - HTML разметка живет тута
|--\ js - различные javasript'ы (jQuery включен в поставку)
|--\ section - место обитания секций
|--\ upload - сюда заливаются файлы и картинки
|- .htaccess
|- error404.html - отвечает за вывод 404-ой ошибки
|- favicon.ico
|- index.html - выводится по умолчанию
|- index.php - этот файл так же используется для конфигурирования системы
|- readme.txt
|- robots.txt
Фичи
Теперь о фичах для web-мастера, начну с deployment’a – данная процедура состоит из копирования папки с iCMS да изменения лишь одного файла – index.php:
// FTP настройки обычно предоставляет хостинг
/* FTP START */
$options[ICMS_FTP]['host'] = 'domain.com';
$options[ICMS_FTP]['port'] = 21; // стандартный порт, зачастую не меняем
$options[ICMS_FTP]['user'] = 'username';
$options[ICMS_FTP]['pass'] = 'password';
$options[ICMS_FTP]['path'] = 'htdocs'; // папка где лежит сайт
$options[ICMS_FTP]['active'] = false;
/* FTP END */
$options[ICMS_ADMIN] = 'this-is-true-admin-link-please-remember-it'; // ссылка на админку
$options[ICMS_PATH] = '/'; // изменяем если система будет находиться в директории,
// т.е. http://domain.com/icms/
К сожалению, возможно Вам так же потребуется изменять файл .htaccess – и указать правильный путь к Вашему сайту (см. на mysite):
<IfModule mod_rewrite.c>
RewriteEngine On
Options +FollowSymlinks
Options -Indexes
RewriteBase /mysite/
RewriteCond %{REQUEST_URI} !^/mysite/js/
RewriteCond %{REQUEST_URI} !^/mysite/css/
RewriteCond %{REQUEST_URI} !^/mysite/upload/
RewriteCond %{REQUEST_URI} !(\.php|\.ico)$ [NC]
RewriteRule ^.*$ index.php [NC,QSA,L]
</IfModule>
Данное изменение может понадобиться в двух случаях:
- Вы устанавливаете систему в поддиректорию
- Вы устанавливаете систему на поддомен, с больно хитрым хостингом (поддомен раскидываются посредством .htaccess’а лежащего в корне домена)
Теперь перейдем к кастомизации – всё оформление у нас лежит в директории include – это обычные PHP файлы содержащие HTML разметку, кроме оной мы так же можем (должны) использовать ряд PHP функций:
- toolbar() – вызов этой функции обязателен в тэге <head> – иначе админка не будет работать (понимает пока лишь один параметр – ajax – позволяет в режими пользователя подгружать контент страниц через AJAX)
- placeholder() – это главная чудо-функция именно она отвечает за то, чтобы при обращении к URL: http://domain.com/path/to/your/content.html был подгружен файл /path/to/your/content.html (по умолчанию подгружается index.html)
- load() – вспомогательная функция – алиас для include
- head() – подключает файл include/header.php
- footer() – подключает файл include/footer.php
- sidebar() – подключает файл include/sidebar.php
- menu() – подключает файл include/menu.php
- section() – вспомогательная функция – подключает файлы из директории section, если это необходимо (см. ниже)
- path() – возвращает значение $options[ICMS_PATH] – помогает указывать правильные пути к Вашим CSS и JS файлам
Итого index.php у нас может выглядеть следующим образом:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" id="html">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>iCMS :)</title>
<link type="image/x-icon" rel="icon" href="<?php path(); ?>favicon.ico" />
<link rel="stylesheet" href="<?php path(); ?>css/styles.css" type="text/css" media="screen" />
<?php toolbar("ajax=0"); ?>
</head>
<body>
<div class="container">
<div class="content">
<?php placeholder() ?>
<?php section('banner') ?>
</div>
</div>
</body>
</html>
Раскладки
Кроме всего прочего, система поддерживает лейауты – т.е. мы можем сказать, что если идет обращение к файлу about.html, то для него будем использовать шаблон из файла index2.php:
$options[ICMS_LAYOUT]['about.html'] = "index2.php";
Таким образом
Секции
Секции странная вещь – основной смысл – они подключают определенный php файл из директории section, при этом Вы можете отключать/изменять их для определенных страниц:
$options[ICMS_SECT]["banner"]["_default"] = "banner.php"; // установим значение по умолчанию для секции "banner" $options[ICMS_SECT]["banner"]["about.html"] = false; // при обращении к about.html мы ничего не выводим
TODO-лист
- Добавить поддержку Internet Explorer
- Дополнить requirements-лист
- Сделать редактирование по FTP опциональным
- Добавить поддержку других WEB-серверов, кроме Apache
- Добавить генерацию thumbnail’ов для картинок
- Добавить возможность подключать другой WYSIWYG
- Добавить мультиязычность
- Добавить раздел справки в админке
- Создать инсталлятор
- Избавить web-мастера от необходимости изменять .htaccess
- Дать возможность редактировать CSS файлы из админки
- Сжать все JavaScript’ы
- Протестировать систему и пофиксить баги
- Провести рефакторинг кода
- Нарисовать свой шаблон
Известные баги
- IE6, IE7, IE8 – эти вопросы к разработчикам данных программных продуктов ;)
- По истечении сессии при попытке редактировать страницу отображается сообщение “Wrong Action”
Собственно весь список смотрим на Code-Google, голосуем там же ;)
Требования
Пока полный список требований еще формируется, но на данный момент известно следующее:
- PHP 5.2+
- Apache + mod_rewrite
Скачиваем
На данный момент скачать iCMS можно со странички Code Google:
Либо с моего блога:
Если же Вы знакомы с SVN’ом – то милости прошу за самыми последними обновлениями.
P.S. Для оформления дефолтной поставки iCMS был использован бесплатный шаблон Dirtylicious

