Перейдем наконец к написанию CMS. Писать мы её конечно будем на PHP. В данной статье я не буду подробно рассматривать создание плагинов (я уже показывал пример в своей другой статье), а так же соединение с базой данных и управление пользователями. Все это будет позже, а пока я покажу основные принципы.
Сердцем нашей системы будет ядро.
<? class core { public $db; //через эту переменную модули будут коннектиться к БД $core->db private $page; //в этой переменной хранится класс отвечающий за вывод страницы function __construct() { $this->db=new dbconnect(); //cоздаем страницу $this->page=new page($this); //анализируем запрос
//лично я резервирую данные переменные для системы //q-определяет модуль который надо подгрузить, например news //a-параметр для модуля, например id новости $query=$_GET['q']; if(!isset($query)) //определяем стандартный модуль { $query="news"; } else { //разрешаем только цифры и буквы(представьте если хакер наберет запрос ../.htapasswords) preg_match("/[0-9a-z_]+/i", $query,$match); if($match[0]!=$query) { $query="news"; } } $_GET['q']=$query; //загружаем модуль в страницу $this->page->addModule($query);
//ищем какую тему загружать $theme=mysql_fetch_array($this->db->query("SELECT * FROM `skins` WHERE `selected`=1")); $this->page->setTheme($theme['name']);//загружаем тему
//Здесь я загружаю плагины
$this->page->render();//просим страницу вывестись клиенту } } ?> |
Следующая по значимости является страница
<? class page { public $themefolder;//Это папка со скином public $module;//Здесь хранится модуль public $core;//это ссылка на ядро
function __construct(&$core) { $this->core=$core; } //------------------------------------------------------------------------------ function setTheme($theme) { $this->themefolder=$theme; } //------------------------------------------------------------------------------ function addModule($name)//Добавляем модуль { if(file_exists("modules/".$name."/mod.php"))//проверяем наличие модуля { include("modules/".$name."/mod.php"); $this->module=new mod($this->core); } else //иначе используем стандартный модуль { include("modules/news/mod.php"); $this->module=new mod($this->core); } $this->module->onStart(&$this); } //------------------------------------------------------------------------------ function render()//Выводим страницу { $page="";//Здесь будет контент $query=$_GET['q']; ob_start(); //загружаем скин if(file_exists("themes/".$this->themefolder."/".$query."theme.php"))//вы можете зделать отдельную тему для модуля форума например { include("themes/".$this->themefolder."/".$query."theme.php"); } else if(file_exists("themes/".$this->themefolder."/theme.php"))//Ноесли таковой нет используем стандарт { include("themes/".$this->themefolder."/theme.php"); } else //Выводим ошибку темы нет { print "Theme $themefolder does not exists"; } $page=ob_get_contents(); ob_end_clean(); //загружаем модуль $this->module->beforeRender();//подготавливаем модуль к выводу $page=str_replace("",$this->module->returnContent(),$page);//добавляем контент модуля в страницу $page=str_replace("7ion blog «Модульный сайт изнутри»",$this->module->title,$page);
echo ($page);//выводим контент flush();//Отсылаем пользователю готовую страницу $this->module->afterRender();//Вызываем событие что мы вывели на экран } //------------------------------------------------------------------------------ } ?> |
Осталось показать как делать модуль, помните у нас был стандарт для модулей
<? abstract class module { public $title; abstract public function __construct(&$core);//инитилизация, лучше не помещать сюда никаких сложных алгоритмов
abstract public function onStart(&$page);//Здесь начинаем основные действия
abstract public function beforeRender();//Финальные изменения
abstract public function returnContent();//тут только вывод контента
abstract public function afterRender();//Изменить, что-то уже нельзя, но можно сделать «чистку» } ?> |
Ну и собственно сам модуль, он должен храниться в папке modules/имя_модуля/ и иметь имя mod.php
<? include_once("modules/sys/class.module.php"); //стандарт class mod extends module //Стандарта надо придерживаться { public $title="Первый опыт"; private $content;//сюда поместим контент function __construct($core){ $content="Первый опыт"; } function onStart(&$page){ for($i=0;$i<10;$i++) { $content.="<br>Как прекрасен этот мир"; } } function beforeRender(){ $content=str_replace("мир","скрипт",$content); } function returnContent(){ return $content; } function afterRender(){ } } ?> |
Конечно же приведенный мною скрипт несовершенен, в нем неучтены многие аспекты безопасности, в частности нет достаточной фильтрации переменных. Но со своей обучающей задачей он справляется. Улучшеная версия этой системы, работает на этом сайте.
Наконец я написал эту статью, надеюсь она поможет многим веб программистам. Следующий цикл статей будет посвещен улучшению этого кода.
Удачи, всегда ваш Александр 7ion