Подключение «внешних» php-файлов в MaxSite CMS

Просмотров: 397Комментарии: 0
MaxSite CMSОбщие вопросы

В 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-кода или создание динамических изображений.

Оставьте свой комментарий!

Комментарий будет опубликован после проверки

Вы можете войти под своим логином или зарегистрироваться на сайте.

(обязательно)

О проекте

MaxSite CMS предназначена для создания сайтов любой сложности. Система отлично подходит обычным пользователям, вебмастерам, фрилансерам и вебстудиям.