|
|
|
| Здравствуйте,
Пытаюсь сделать примитивную систему по работе с шаблонами. Она состоит из шаблонов, файла с функциями и обработчика. Вот их код (тестовый вариант).
Шаблон (i.tpl):
<html>
<head>
<title>Главная страница</title>
</head>
<body>
<center>Текст</center><br>
<!-- Вставка кода в HTML шаблон -->
{CODE}
</body>
</html>
|
Обработчик:
<?
// Файл с шаблоном
$st = "i.tpl";
// Открытие и чтение файла с шаблонами
$fd = fopen($st, "r");
$str = fread($fd, filesize($st));
// Регулярное выражение для поиска содержимого, содержащегося между { и } в шаблоне.
$pat = "#{[/s]*([^<]*)[/s]*}#i";
// Поиск всех совпадений.
preg_match_all($pat,$str,$mat,PREG_SET_ORDER);
// Цикл для обработки полученного массива.
for($i=0; $i< count($mat); $i++)
{
// Подключаем файл с функциями, где идёт проверка на совпадение содержимого массива и в зависимости от этого выполняется та или иная функция.
require_once("func.php");
}
// Вывод изменённого шаблона
echo $str;
// Закрытие файла шаблона
fclose($fd);
?>
|
Файл с функциями (func.php)
<?
// Если содержимое массива равно CODE, то выполняем функцию CODE
if($mat[$i][1] == "CODE")
{
function CODE()
{
echo "Тест";
}
// Замена {CODE} в файле шаблона на содержимое функции CODE()
$str = str_replace("{CODE}",CODE(),$str);
}
?>
|
Вроде всё работает, но вот с моментом замены происходит ошибка: фраза "тест", которая выводится с помощью функции CODE() отображается на странице в самом начале (перед словом "Текст"), хотя {CODE} в шаблоне находится после слова "Текст".
В следующей строчке:
$str = str_replace("{CODE}",CODE(),$str);
|
CODE() заменял на обычную переменную $code, дав ей перед этим значение "Тест". Получалось нечто следующее:
$code = "Тест";
$str = str_replace("{CODE}",$code,$str);
|
В таком варианте всё работало как надо.
А потому хочу узнать, как мне решить сложившуюся ситуацию, чтобы вывод был нормальный. Использовать функцию просто необходимо, т.к. там будет использоваться PHP код. И вообще, имеет ли эта система шаблонов право на существование или это в корень не правильная реализация?
Заранее спасибо,
С Уважением, Дмитрий. | |
|
|
|
|
|
|
|
для: Desh
(02.06.2008 в 18:06)
| | Не нужно вам это. Не надо велосипед изобретать. Воспользуйтесь готовым проверенным решением. Если сайт простой, то подойдет XTemplate, иначе Smarty
<?
// Раз переменная в цикле, то так
$str .= str_replace("{CODE}",CODE(),$str);
?>
|
| |
|
|
|
|
|
|
|
для: Desh
(02.06.2008 в 18:06)
| | Шаблонизаторы бывают с использованием eval() и без него. Первый тип предоставляет, как понимаете, больше свободы действий, однако желательно позаботиться об обнаружении синтаксических ошибок во время преобразования кода шаблона в PHP-код и кешировании полученных результатов.
Второй более безопасный, но ограничен в некоторых возможностях, которые требуют больших ресурсов для обработки кода шаблона. Это непозволительно, поскольку кеширование тут проблематично.
По сути дела: не понял я Вашей логики, когда Вы подключаете func.php однократно, но запихнув, тем не менее, его в цикл, Вы сможете лицезреть выполнение функции CODE() только в том случае, если {CODE} будет первым тегом в Вашем шаблоне.
А ошибка в том, что функция CODE() должна не выводить текст, а возвращать. | |
|
|
|
|
|
|
|
для: BinLaden
(02.06.2008 в 21:27)
| | Воспользуюсь, пожалуй, готовыми решениями) Сайт не очень сложный потому решил не пользоваться Smarty и попросту сделать что-то своё.
Всем большой спасибо за помощь) | |
|
|
|
|
|
|
|
для: Desh
(02.06.2008 в 21:39)
| | Smarty слишком прожорливый...Больно много там того, что Вам, возможно, никогда не потребуется. | |
|
|
|
|
|
|
|
для: BinLaden
(02.06.2008 в 22:33)
| | Но удобный, когда делаешь все один. | |
|
|
|