До недавнего времени мы создавали этакий каркас для нашей системы. Теперь пришло время создать темку и написать первый модуль для нашей с вами цмс-ки.
Первым что мы сделаем это будет создание 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—>
079.$modules_dir = ‘/vcontrol/modules/’;
Наверное имелось ввиду ‘/panel/modules/’
Да, вы правы.
Подскажите, Я добавил модуль test путем копирования defaul и там изменил выводимые данные. После прописал в бд таблицу этот модуль, указав только имя.(этого хватит) Но мой модуль не используется, почему ? Я не пойму переменной $a и $_GET[‘a’] , откуда это все будет браться ? Единственное я думаю все они будут прописаны в stack.php который я не представляю как писать. Если еще долго ждать очередной статьи то подскажите идею.
Чтобы он работал его надо прописать в базе со значениями включен (1)
а вызвать его можно по адресу http://site.ts/?a=ваш модуль
И еще… Если мы индексом файле панели вызываем $APPLICATION->init(true);// Инициализируем систему и модули после stack и rout то в rout.php $APPLICATION->active_modules не заполняется н , чем и будет пуста для него .Хотя после инит она наполняется из бд. Тут у меня тоже недопонмание…
Все библиотеки у нас подключаются в stack.php
Включите отображение notice-ов и посмотрите что говорит интерпретатор
Хотелось бы посмотреть на исходники и собственно следующий урок по созданию модуля
Вася, будет. Дождитесь
интересно было бы еще написание модульной model-view-controller cms со smarty шаблонизатором
$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
ПРошу прощения. Видать выложил след-ю версию.
Очень жду продолжения! Когда уже)?
Когда будет следующий урок ? :))
Спасибо за интересную статью, я хоть наконец то разобрался с этими модулями.
И насчет шаблонизатора было бы интересно увидеть статью не про smarty, а написать свой хотя бы минимальный шаблонизатор