Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Ошибка в замене части строки функцией
 
 автор: Desh   (02.06.2008 в 18:06)   письмо автору
 
 

Здравствуйте,

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

Шаблон (i.tpl):

<html>
<head>
<title>Главная страница</title>
</head>
<body>
<center>Текст</center><br>
<!-- Вставка кода в HTML шаблон -->
{CODE}
</body>
</html>


Обработчик:

<?
// Файл с шаблоном
$st "i.tpl";
// Открытие и чтение файла с шаблонами
$fd fopen($st"r");
$str fread($fdfilesize($st));

// Регулярное выражение для поиска содержимого, содержащегося между { и } в шаблоне.
$pat "#{[/s]*([^<]*)[/s]*}#i";
// Поиск всех совпадений.
preg_match_all($pat,$str,$mat,PREG_SET_ORDER);

// Цикл для обработки полученного массива.
for($i=0$icount($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 код. И вообще, имеет ли эта система шаблонов право на существование или это в корень не правильная реализация?

Заранее спасибо,
С Уважением, Дмитрий.

   
 
 автор: mihdan   (02.06.2008 в 18:32)   письмо автору
 
   для: Desh   (02.06.2008 в 18:06)
 

Не нужно вам это. Не надо велосипед изобретать. Воспользуйтесь готовым проверенным решением. Если сайт простой, то подойдет XTemplate, иначе Smarty

<?
// Раз переменная в цикле, то так
$str .= str_replace("{CODE}",CODE(),$str); 
?>

   
 
 автор: BinLaden   (02.06.2008 в 21:27)   письмо автору
 
   для: Desh   (02.06.2008 в 18:06)
 

Шаблонизаторы бывают с использованием eval() и без него. Первый тип предоставляет, как понимаете, больше свободы действий, однако желательно позаботиться об обнаружении синтаксических ошибок во время преобразования кода шаблона в PHP-код и кешировании полученных результатов.

Второй более безопасный, но ограничен в некоторых возможностях, которые требуют больших ресурсов для обработки кода шаблона. Это непозволительно, поскольку кеширование тут проблематично.

По сути дела: не понял я Вашей логики, когда Вы подключаете func.php однократно, но запихнув, тем не менее, его в цикл, Вы сможете лицезреть выполнение функции CODE() только в том случае, если {CODE} будет первым тегом в Вашем шаблоне.

А ошибка в том, что функция CODE() должна не выводить текст, а возвращать.

   
 
 автор: Desh   (02.06.2008 в 21:39)   письмо автору
 
   для: BinLaden   (02.06.2008 в 21:27)
 

Воспользуюсь, пожалуй, готовыми решениями) Сайт не очень сложный потому решил не пользоваться Smarty и попросту сделать что-то своё.


Всем большой спасибо за помощь)

   
 
 автор: BinLaden   (02.06.2008 в 22:33)   письмо автору
 
   для: Desh   (02.06.2008 в 21:39)
 

Smarty слишком прожорливый...Больно много там того, что Вам, возможно, никогда не потребуется.

   
 
 автор: sim5   (03.06.2008 в 08:11)   письмо автору
 
   для: BinLaden   (02.06.2008 в 22:33)
 

Но удобный, когда делаешь все один.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования