В MaxSite CMS для подключения php-файлов используется стандартные функции require() и include(). Подключение файлов прописывается в плагинах или шаблонах и не вызывает никаких трудностей. Однако, иногда перед вебмастером стоит задача сделать вызов php-файла напрямую, как это делается, например, при получении стилей.
Предположим мы хотим сделать css-файл в виде php. Причем так, чтобы css-стили формировались на основе каких-то опций. На первый взгляд задача решается примитивно.
Создаем файл css.php, указываем в нем все нужные php-инструкции и подключаем как обычный css-файл:
<link rel="stylesheet" href="<?= getinfo('stylesheet_url') ?>css/css.php" type="text/css" media="screen">
То есть по сути мы формируем вызов скрипта по адресу: http://сайт/путь-до-шаблона/css/css.php.
В таком варианте у нас возникает две сложности.
Первая - если в css.php используется верхняя строчка
<?php if (!defined('BASEPATH')) exit('No direct script access allowed');?>
То такой файл вообще не будет выполнен, поскольку не определена константа BASEPATH (она определяется один раз при инициализации CodeIgniter). Собственно эта строчка является стандартной с той целью, чтобы не допустить выполнение php-файлов по обычному запросу с помощью браузера. Строго говоря это защита системы от различных хакерских атак. Поскольку обратиться к php-файлу напрямую нельзя, то не получится отправить на этот файл какой-то вредоносный запрос.
Если бы такой строчки (защиты) не было бы, то вероятность взломов сайтов многократно увеличилось бы. Предположим, хакер нашел уязвимость в каком-то файле принимающим POST данные. Ему бы ничего не стоило сформировать нужный запрос и эксплуатировать уязвимость.
Таким образом стандартно все php-файлы в CodeIgniter и MaxSite CMS принято сопровождать строчкой-защитой.
В нашем же примере с css.php файл просто не выполнится - сработает защита. Следовательно нам нужно подключить файл на уровне самой системы.
Вторая сложность - предположим мы просто убираем защиту-строчку и файл прекрасно выполняется из браузера. Но в этом случае мы лишаемся возможности получить данные из MaxSite CMS. Например в опциях мы получаем цвет какого-то блока. По сути это одна строчка кода (с mso_get_option() - см. предыдущую лекцию), но увы, она недоступна - ведь файл выполняется вне уровня системы.
Для решения подобных задач в MaxSite CMS используется тип данных require-maxsite. То есть для подключения «внешнего» php-файла нужно использовать адрес http://сайт/require-maxsite/код-файла.
Код файла - это путь и имя файла относительно каталога application/maxsite/ в base64-кодировании.
Чтобы немного упростить использование require-maxsite, можно использовать вот такую конструкцию:
$path = getinfo('require-maxsite') . base64_encode ( 'templates/' . getinfo('template') . '/css/style-require-maxsite.php' );
В данном примере мы получаем полностью готовый (с http://) путь к нужному php-файлу.
Тип require-maxsite имеет одну существенную особенность. В нем имя файла должно строго соответствовать шаблону «имя-require-maxsite.php». Это сделано с той целью, чтобы нельзя было напрямую обратиться к другим php-файлам (о защите см. выше). Естественно, создавая файл для require-maxsite вебмастер должен десять раз проверить его на «вредоносность», особенно, если файл принимает POST или GET-запросы и вносит какие-то изменения.
Теперь давайте вернемся к практическому примеру. Пусть у нас будет опция в шаблоне, по которой можно выставить произвольный стиль ссылок. Для этого нам прекрасно подойдет обычное текстовое поле. В файле options.ini задаём опцию.
[Стиль ссылок] options_type = templates options_key = my_style_links type = textfield description = "Укажите произвольный стиль ссылок" default = "color: red"
Проверим чтобы опция появилась в настройках шаблона.
Теперь подключим наши стили через php-файл в header.php шаблона:
<link rel="stylesheet" href="<?= getinfo('require-maxsite') . base64_encode('templates/' . getinfo('template') . '/css/style-require-maxsite.php') ?>" type="text/css" media="screen">
То есть наш файл будет css/style-require-maxsite.php шаблона.
Теперь сам style-require-maxsite.php:
<?php if (!defined('BASEPATH')) exit('No direct script access allowed'); header('Content-type: text/css'); $a_style = mso_get_option('my_style_links', 'templates', ''); echo " a { $a_style } ";
Первая строчка - защита.
Вторая - отправляем заголовок браузеру, что у нас css-файл.
Третья - получаем опцию.
Последней строчкой выводим полученный результат.
В данном варианте мы используем двойные кавычки (") с той целью, чтобы PHP интерпретировал php-переменные. Обратите внимание на проблелы внутри «{}».
Одна особенность PHP: при таком выводе строк переменные можно экранировать с помощью «{}». То есть если мы запишем:echo "a {$a_style}";то PHP воспримет текст «{$a_style}» как значение переменной $a_style. То есть «{}» будут потеряны при выводе. В нашем случае возникает конфликт синтаксиса CSS и PHP. Чтобы его избежать мы добавляем пробелы между «{}». Если же совсем строго, то код должен быть таким:echo "a { {$a_style} }";
Пример с динамическим CSS показывает одну из областей применения типа require-maxsite. Навскидку можно придумать и пару других вариантов: формирование динамического js-кода или создание динамических изображений.