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

Рубрика: MaxSite CMS -> Для чайников
Четверг, 29 июля 2010 г.
Просмотров: 923
Подписаться на комментарии по RSS
]]>
]]>

В MaxSite CMS для подключения php-файлов используется стандартные функции require() и include(). Подключение файлов прописывается в плагинах или шаблонах и не вызывает никаких трудностей. Однако, иногда перед вебмастером стоит задача сделать вызов php-файла напрямую, как это делается, например, при получении стилей.

Предположим мы хотим сделать css-файл в виде php. Причем так, чтобы css-стили формировались на основе каких-то опций. На первый взгляд задача решается примитивно.

Создаем файл css.php, указываем в нем все нужные php-инструкции и подключаем как обычный css-файл:

  1.  <link rel="stylesheet" href="<?= getinfo('stylesheet_url') ?>css/css.php" type="text/css" media="screen">

То есть по сути мы формируем вызов скрипта по адресу: http://сайт/путь-до-шаблона/css/css.php.

В таком варианте у нас возникает две сложности.

Первая - если в css.php используется верхняя строчка

  1.  <?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, можно использовать вот такую конструкцию:

  1.  $path = getinfo('require-maxsite')
  2.   . base64_encode
  3.   (
  4.   'templates/' . getinfo('template') . '/css/style-require-maxsite.php'
  5.   );

В данном примере мы получаем полностью готовый (с http://) путь к нужному php-файлу.

Тип require-maxsite имеет одну существенную особенность. В нем имя файла должно строго соответствовать шаблону «имя-require-maxsite.php». Это сделано с той целью, чтобы нельзя было напрямую обратиться к другим php-файлам (о защите см. выше). Естественно, создавая файл для require-maxsite вебмастер должен десять раз проверить его на «вредоносность», особенно, если файл принимает POST или GET-запросы и вносит какие-то изменения.

Теперь давайте вернемся к практическому примеру. Пусть у нас будет опция в шаблоне, по которой можно выставить произвольный стиль ссылок. Для этого нам прекрасно подойдет обычное текстовое поле. В файле options.ini задаём опцию.

  1.  [Стиль ссылок]
  2.  options_type = templates
  3.  options_key = my_style_links
  4.  type = textfield
  5.  description = "Укажите произвольный стиль ссылок"
  6.  default = "color: red"

Проверим чтобы опция появилась в настройках шаблона.

Теперь подключим наши стили через php-файл в header.php шаблона:  

  1.  <link rel="stylesheet" href="<?= getinfo('require-maxsite')
  2.   . base64_encode('templates/' . getinfo('template')
  3.   . '/css/style-require-maxsite.php') ?>" type="text/css" media="screen">

То есть наш файл будет css/style-require-maxsite.php шаблона.

Теперь сам style-require-maxsite.php:

  1.  <?php if (!defined('BASEPATH')) exit('No direct script access allowed');
  2.  
  3.  header('Content-type: text/css');
  4.  
  5.  $a_style = mso_get_option('my_style_links', 'templates', '');
  6.  
  7.  echo "
  8.   a { $a_style }
  9.  ";

Первая строчка - защита.

Вторая - отправляем заголовок браузеру, что у нас css-файл.

Третья - получаем опцию.

Последней строчкой выводим полученный результат.

В данном варианте мы используем двойные кавычки (") с той целью, чтобы PHP интерпретировал php-переменные. Обратите внимание на проблелы внутри «{}».

Одна особенность PHP: при таком выводе строк переменные можно экранировать с помощью «{}». То есть если мы запишем:
  1.  echo "a {$a_style}";
то PHP воспримет текст «{$a_style}» как значение переменной $a_style. То есть «{}» будут потеряны при выводе. В нашем случае возникает конфликт синтаксиса CSS и PHP. Чтобы его избежать мы добавляем пробелы между «{}». Если же совсем строго, то код должен быть таким:
  1.  echo "a { {$a_style} }";

Пример с динамическим CSS показывает одну из областей применения типа require-maxsite. Навскидку можно придумать и пару других вариантов: формирование динамического js-кода или создание динамических изображений.

]]>twitter.com Google Buzz google.com bobrdobr.ru del.icio.us technorati.com linkstore.ru news2.ru rumarkz.ru memori.ru moemesto.ru]]>

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

Не регистрировать/аноним

Используйте нормальные имена. Ваш комментарий будет опубликован после проверки. Если вы зарегистрированы в Твиттере, то перед логином укажите «@», например: @maxsite

Если вы уже зарегистрированы как комментатор или хотите зарегистрироваться, укажите пароль и свой действующий email.
(При регистрации на указанный адрес придет письмо с кодом активации и ссылкой на ваш персональный аккаунт, где вы сможете изменить свои данные, включая адрес сайта, ник, описание, контакты и т.д.)



grin LOL cheese smile wink smirk rolleyes confused surprised big surprise tongue laugh tongue rolleye tongue wink raspberry blank stare long face ohh grrr gulp oh oh downer red face sick shut eye hmmm mad angry zipper kiss shock cool smile cool smirk cool grin cool hmm cool mad cool cheese vampire snake excaim question

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