Всем доброго времени суток. Сегодня мы с Вами реализуем одну очень важную вещь, которую стоило бы реализовать с самого начала. По задумке, в CMS RS-MINI будет возможность обновление движка в полуавтоматическом режиме (обновление придется скачивать самим, а не через спец написанный скрипт). Апдейтер должен будет, после обновления, поменять версию движка, что в данной ситуации немного проблематично, так как номер версии храниться в файле /project/conf/config.class.php, и прописывается прям руками в константу VERSION.
Дабы облегчить нам способ смены одного номера версии на другой, было решено вынести некоторые системные константы, прямо в базу данных (править БД легче, чем парсить файл). Так же данное изменение позволит нам в будущем управлять некоторыми важными настройками системы прям из админ панели движка, что явно облегчит управление CMS'ой
Для начала предлагаю создать таблицу в которой мы будем хранить информацию для формирования необходимых системных констант.
Табличка будет состоять всего из трех полей:
Для начала нам достаточно будет вынести всего три константы, а именно:
Давайте составим и исполним скуль запрос на создание таблицы и заполнение ее необходимой информацией:
CREATE TABLE IF NOT EXISTS `rs_constant` (
`constant_id` int(11) NOT NULL AUTO_INCREMENT,
`constant_name` varchar(255) NOT NULL,
`constant_value` varchar(255) NOT NULL,
PRIMARY KEY (`constant_id`)
)
ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
INSERT INTO
`rs_constant`
(
`constant_id`,
`constant_name`,
`constant_value`
)
VALUES
(
1,
'DOM',
'TRUE'
),
(
2,
'CMS',
'RS-MINI'
),
(
3,
'VERSION',
'0.0.1'
)
;
Так как теперь константы будут поднимаются из базы данных, то подключение к mysql серверу нужно производить именно в этом классе (в config.class.php) а не в application.class.php.
Так же решено было отказаться от свойства self::$db в классе config.class.php (если Вы не помните, В этом свойстве хранятся настройки для подключения к базе данных). На смену свойства придут четыре константы:
поэтому нам так же придется подправить класс sql.class.php, но для начала давайте реализуем получение и регистрацию констант. Вот так теперь выглядит класс config.class.php (файл лежит в папке /project/conf/)
<?php
/*
* @package RS-MINI
* @copyright (c) 2015 Alexey Glumov aka Rio-Shaman (support@rio-shaman.ru)
* @license GNU General Public License version 2; see LICENSE.txt
*
*/
namespace conf;
if(!defined('RS-MINI')) die();
/*
* config v 1.0
*
* класс с настройками движка
*
*/
class config
{
/*
* установка настроек движка
*
* @access - public
*/
public static function setConfig()
{
// получаем и регаем константы проекта
self::setConstant();
}
/*
* метод запрашивает и запоминает константы проекта
*
* @access - private
* @return - boolean
*/
private static function setConstant()
{
// константы БД
define('DB_SERVER', 'localhost'); // сервер БД
define('DB_USER', 'root'); // юзер БД
define('DB_PASS', '123456'); // пароль БД
define('DB_NAME', 'rs_mini'); // имя БД
// стартуем подключение к БД
\core\sql::setConnect();
// получаем список констант
if (!$constantList = \core\sql::query('SELECT * FROM rs_constant')->fetch())
// если списка нет, то выводим false
return FALSE;
// листаем список
foreach ($constantList as $constant) {
// пытаемся определить булевое ли значение
switch (mb_strtolower($constant['constant_value'])) {
// если значение равно 'true'
case 'true':
// приводим к булю
$value = TRUE;
break;
// если значение равно 'false'
case 'false':
// приводим к булю
$value = FALSE;
break;
// по умолчанию
default:
// сохраняем значение константы без изменений
$value = $constant['constant_value'];
break;
}
// регистрируем константу
define($constant['constant_name'], $value);
}
return TRUE;
}
}
Тут нет ничего сложного, но есть один момент который хотелось бы прокомментировать. Обратите внимание, что в базе данных, типом поля для хранение значение констант является varchar(255). Но как известно значения наших констант бывают не только строковыми (обычный текст) но и булевыми (имеют значение true или false). Поэтому в методе setConstant() присутствует условный оператор switch, который поможет нам отловить строковое значение TRUE и FALSE и принудительно привести его (значение) к типу boolean.
В этом классе, нам всего лишь нужно удалить вызов метода setConnect() класса sql.class.php. Вот новый код метода run() (файл называется application.class.php и лежит в папке /rs-mini/core/)
/*
* главный метод. запуск системы
*
* @access - public
*
*/
public static function run()
{
// поднимаем некоторые классы ядра
// объект по работе с структурой сайта
self::$map = new map();
// объект прослойка между контроллерами и вьюшкой
self::$dom = new dom();
// получаем открываемую страницу
if (!self::$map->getPage())
self::notFound();
// мероприятия по объеденению унаследованных контроллеров с конечной страницей
self::unionRun();
// запускаем контроллеры
self::controllerRun();
}
Ну что же, нам всего лишь осталось подправить последний класс, а именно изменить код подключения к базе данных.
Первым делом избавимся от строчки (файл sql.class.php который лежит в папке /rs-mini/core/)
use \conf\config AS config;
так как класс конфига нам тут теперь не нужен.
Ну и на по следок изменяем метод setConnect() (тот же файл в той же папке)
/*
* подключаемся к БД
*
* @access - public
*
*/
public static function setConnect()
{
// подключаемся к БД
self::$resource = @mysqli_connect(
DB_SERVER, // сервер
DB_USER, // юзер
DB_PASS, // пароль юзера
DB_NAME // база данных
);
// если подключение прошло с ошибкой
if (!self::$resource)
die('Ошибка ' . CMS . ' v' . VERSION . ': При подключение к базе данных произошла ошибка');
// устанавливаем кодировку базы
mysqli_set_charset(self::$resource, "utf8");
}
Ничего сверхъестественного в данном материале нет, но если у Вас возникли какие либо вопросы, то пишите их в комментариях, попробую на них ответить.
Результат проделанной работы Вы как всегда можете скачать в конце статьи.
Всего Вам наилучшего, на сегодня у меня все!