Создание своей «php cms» — Часть 3 (Тема для админки и первый модуль)

До недавнего времени мы создавали этакий каркас для нашей системы. Теперь пришло время создать темку и написать первый модуль для нашей с вами цмс-ки.

Первым что мы сделаем это будет создание html разметки в нашем шаблоне. Сделаем ее как можно проще. Создадим 2 колонки. Левую и правую.

Создание шаблона админ панели

Создадим файлик template.php в /panel/themes/alexa .

В него поместим следующее содержимое:

< !DOCTYPE HTML>
<html lang="ru-RU">
<head>
<meta charset="UTF-8">
<title>Alexa</title>
</meta></head>
<body>
<table width="1024">
<tr>
<td>left</td>
<td>center</td>
</tr>
</table>
</body>
</html>

Чтобы наша с вами тема работала надо прописать ее название в config.php файле:


$_SETTINGS['admin_theme'] = 'alexa';

Теперь мы немного изменим файл /panel/index.php и добавим в него файл для маршрутизации запросов и вьюшку для отображения содержимого модулей.

До недавнего времени наш файл /panel/index.php выглядел так:


session_start();

define('ACCESS', 1);

include 'config.php';

include 'core/APPLICATION.php';

include_once 'stack.php';

// Инициализируем систему и модули
$APPLICATION->init(true);

Теперь мы добавим в него 2 строчки


include_once 'core/rout.php'; // маршрутизация запросов

include 'themes/'.$_SETTINGS['admin_theme'].'/template.php'; // подключение файла темки

Теперь он выглядит так:


session_start();

define('ACCESS', 1);

include 'config.php';

include 'core/APPLICATION.php';

include_once 'stack.php';

include_once 'core/rout.php'; // маршрутизация запросов

$APPLICATION->init(true); // Инициализируем систему и модули

include 'themes/'.$_SETTINGS['admin_theme'].'/template.php'; // Подключаем файл темки

Теперь если вы запустите то что получилось у вас вылезет много различных warning-ов.

Чтобы это исправить создадим для начала модуль по умолчанию.

Создание первого модуля

В папке /panel/modules/ создадим папку default со следующей структурой.

models

models/default.php

views

views/default.php

controller.php

В файле controller.php пропишем


$action = isset($_GET['action'])? $_GET['action']: '';

switch ($action){

default:

$model = 'default';

$_CONTROLLER['view'] = 'default';

break;

}

include_once $_SETTINGS['doc_dir'].'/panel/modules/'.$a.'/models/'.$model.'.php';

<!—adsense#block468—>

Вы скажете а зачем писать так если можно проще и без переключателя? Это я показываю принцип работы модулей. В них может быть разные условия и разные переключатели действий.

Теперь нам необходимо создать функцию которая будет инициализировать модули и давать нам массив активных модулей.


/**
* Функция проверяет наличие модулей , которые активны в базе данных и возвращает их имена
*
* Принимает значения true или false
* Значения true устанавливается , если необходимо инициализировать как активные так и неактивные модули
* Значение false устанавливается как правило для клиентской части, и тогда функция инициализирует только активные модули.
* Возвращает массив имен модулей.
*
*/
public function module_init($vcontent = false) {

global $_SETTINGS;

if ($vcontent) :

$this->sql = "SELECT * FROM `modules`";

$modules_dir = '/panel/modules/';

else :

$this->sql = "SELECT * FROM `modules` WHERE `active`='1'";

$modules_dir = '/modules/';

endif;

unset($this->active_modules);

$query = mysql_query($this->sql, $this->db_link);

if (mysql_num_rows($query) > 0) {

while ($row = mysql_fetch_object($query)) {

if (file_exists($_SETTINGS ['doc_dir'] . $modules_dir . $row->name . '/controller.php')) {

$this->active_modules [] = $row->name; //Заносим название модулей в массив
}
}
}
}

Добавим эту функцию в наш файл /panel/core/APPLICATION.php  и изменим метод инициализации системы добавив в него наш новый метод инициализации модулей. Также хотел бы отметить что добавил в начале класса объявление массива активных модулей  $active_modules :


if (!defined('ACCESS')) die('ACCESS_DENIED');
/**
* Основной класс системы, содержащий методы, для соединения с базой даных, инициализации системы, модулей,
* */

class APPLICATION {

/**
*
* Линк соединения с базой данных
* @var DBlink
*/

public $db_link; // Линк соединения с базой

public $view_name;
// Массив содержит активные модули возвращенные методом module_init()
public $active_modules = array();

private function dbconn() {
global $_SETTINGS;
$this->db_link = mysql_connect ( $_SETTINGS ['dbhost'], $_SETTINGS ['dbuser'], $_SETTINGS ['dbpass'] );
if ($this->db_link == false) {
die ( DB_CONNECT_ERROR );
}
if (mysql_select_db ( $_SETTINGS ['dbname'] ) == false) {
die ( DB_SELECT_ERROR );
}
mysql_query ( "SET character_set_client = '" . $_SETTINGS ['db_charset'] . "'" );
mysql_query ( "SET character_set_connection = '" . $_SETTINGS ['db_charset'] . "'" );
mysql_query ( "SET character_set_results = '" . $_SETTINGS ['db_charset'] . "'" );
mysql_query ( "SET NAMES '" . $_SETTINGS ['db_charset'] . "'" );

}

/**
* Производит инициализацию приложения (исполняет функцию установления соединения с базой, инициализирует модули).
*
* Данная функция должна быть выполнена раньше других скриптов.
* Параметр $vcontent необходим для указания места вызова функции. Передается в функцию инициализации модулей module_init ( $vcontent )
* Принимает значения true или fasle
* Значения true устанавливается , если необходимо инициализировать как активные так и неактивные модули
* Значение false устанавливается как правило для клиентской части, и тогда функция инициализирует только активные модули.
*
* */

public function init($vcontent = true) {

global $_SETTINGS;

if ($_SETTINGS ['debugging']) {

error_reporting ( $_SETTINGS ['error_level'] );

}

$this->dbconn ();
$this->module_init($vcontent);
}

/**
* Функция проверяет наличие модулей , которые активны в базе данных и возвращает их имена
*
* Принимает значения true или false
* Значения true устанавливается , если необходимо инициализировать как активные так и неактивные модули
* Значение false устанавливается как правило для клиентской части, и тогда функция инициализирует только активные модули.
* Возвращает массив имен модулей.
*
*/
public function module_init($vcontent = false) {

global $_SETTINGS;

if ($vcontent) :

$this->sql = "SELECT * FROM `modules`";

$modules_dir = '/panel/modules/';

else :

$this->sql = "SELECT * FROM `modules` WHERE `active`='1'";

$modules_dir = '/modules/';

endif;

unset($this->active_modules);

$query = mysql_query($this->sql, $this->db_link);

if (mysql_num_rows($query) > 0) {

while ($row = mysql_fetch_object($query)) {

if (file_exists($_SETTINGS ['doc_dir'] . $modules_dir . $row->name . '/controller.php')) {

$this->active_modules [] = $row->name; //Заносим название модулей     в массив
}
}
}
}

}

$APPLICATION = new APPLICATION ();

Последнее что нам осталось, так это добавить подключение файла отображения. Его мы добавим в наш с вами шаблон панели управления в центральную часть.


< !DOCTYPE HTML>
<html lang="ru-RU">
<head>
<meta charset="UTF-8">
<title>Alexa</title>
</meta></head>
<body>
<table width="1024">
<tr>
<td>left</td>
<td>< ? include_once 'core/view.php'; ?></td>
</tr>
</table>
</body>
</html>

Все, необходимый минимум мы создали. Теперь давайте посмотрим что у нас получилось. Для этого в модели модуля по умолчанию (default) объявим переменную и выведем ее во view части.

я объявил переменную $title в файле /panel/modules/default/models/default.php и вывел ее в /panel/modules/default/views/default.php

В результате мы с вами увидели слово Alexa в центральной части. Да это не густо но это основное что мы должны были сделать перед тем как перейдем к разработке полноценных модулей и механизмов их автоматической установки, активации через панель и изменении их настроек.

В следующей статье мы рассмотрим примеры создания главного модуля призванного управлять другими модулями — устанавливать, удалять, редактировать другие модули.

 

<!—adsense#block468—>

15 Ответы на “Создание своей «php cms» — Часть 3 (Тема для админки и первый модуль)”

  1. Подскажите, Я добавил модуль test путем копирования defaul и там изменил выводимые данные. После прописал в бд таблицу этот модуль, указав только имя.(этого хватит) Но мой модуль не используется, почему ? Я не пойму переменной $a и $_GET[‘a’] , откуда это все будет браться ? Единственное я думаю все они будут прописаны в stack.php который я не представляю как писать. Если еще долго ждать очередной статьи то подскажите идею.

  2. И еще… Если мы индексом файле панели вызываем $APPLICATION->init(true);// Инициализируем систему и модули после stack и rout то в rout.php $APPLICATION->active_modules не заполняется н , чем и будет пуста для него .Хотя после инит она наполняется из бд. Тут у меня тоже недопонмание…

  3. Хотелось бы посмотреть на исходники и собственно следующий урок по созданию модуля

  4. интересно было бы еще написание модульной model-view-controller cms со smarty шаблонизатором

  5. $APPLICATION->choose_theme()
    ват оф фак?
    такого же метода нет в application.php
    http://www.alexa.loc/panel/ по такому пути ошибка
    Fatal error: Call to undefined method APPLICATION::choose_theme() in S:\home\alexa.loc\www\panel\core\view.php on line 17

  6. И насчет шаблонизатора было бы интересно увидеть статью не про smarty, а написать свой хотя бы минимальный шаблонизатор

Добавить комментарий для Илья Отменить ответ