Модульный сайт изнутри

Перейдем наконец к написанию 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


© Alexander Semion