SSI+PHP Печать
Статьи - PHP программирование

Бытует мнение и оно в принципе верное что использовать SSI и PHP в одном шаблонизаторе, есть нонсенс. Однако, существовало (и таки реализовано) ТЗ, в котором одним из требований было совмещение паттернов и инструкций SSI. Оставлю в стороне “законность” такого требования/решения и опишу что в результате получилось. Далее подкатом …

Под паттерном (называйте как хотите) в данном контексте подразумевается выражение вида <%menu%> или #menu# , которое присутствует в темплейте страницы и позволяет в некотором роде отделить логику от HTML кода. То есть, проще говоря имеем обработчик, темплейт и паттерны. В зависимости от модуля (скажем страница категории), обработчик берет нужный темплейт, выдирает из него паттерны и заменяет их собранными кусками кода, которые затем и выводятся в виде полноценной страницы.

Так вот в эту схему слабо вписываются инструкции SSI. Имеем подводный камень (камни?) - расширение страницы, чтобы сервер правильно обработал SSI , должно быть .shtml , а значит речь о PHP идти не может в принципе. Таким образом, если в нашем салате есть шаблонизатор с обработкой паттернов и SSI документы, которые нужно включить в страницу - представляется совсем грустная картина. Либо мы должны сначала собрать SSI страницу и затем заместить паттерны кусками кода, либо наоборот собрать темплейт из паттернов, сохранить как постоянный документ на сервере с нужным расширением и затем вызвать для подключения SSI инклюдов.

Готовое решение заключается в следующей последовательности действий:

- cобственно фишка: в темплейте создаем паттерн вида:

 

<%include_virtual(’/cgi-bin/script.cgi?ssi=1&’.$_SERVER['QUERY_STRING']);%>

 

- берем нужный темплейт с расширением .php , который содержит паттерны и может содержать PHP инклюды (include_once(’header.php’)) и не выводя в браузер берем из буфера:

 

ob_start();
include(TEMPLATES.$module['name'].’.mod.php’);
$page=ob_get_contents();
ob_end_clean();

 

Делаем собственно с этим кодом, все что нам заблагорассудится, как то - меняем паттерны и пр.

- для вышеупомянутого паттерна, содержащего последовательность include_virtual используем правило замены с использованием замечательной функции virtual() , в данном конкретном случае паттерн очищался от <%include_%> и оставшаяся часть исполнялась с помощью eval:

 

eval(”virtual(’/cgi-bin/script.cgi?ssi=1&’.$_SERVER['QUERY_STRING']);”);

 

Получился совмещенный с SSI инклюдами шаблонизатор.