Обработка смешанного HTML и PHP кода с приравниванием в переменную.

trooll

PHP кодер
Регистрация
22 Дек 2008
Сообщения
482
Реакции
117
Приветствую.

есть два файла:
1) tpl.php :
PHP:
<html>
<head>
	<title><?php echo $title; ?></title>
</head>
<body>

<?php echo $body; ?>

</body>
</html>

и

2) index.php :
PHP:
<?php
$title = 'ЗАГОЛОВОК ДОКУМЕНТА';
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';

include('./tpl.php');
?>

Сейчас скрипт просто вставляет содержимое файла tpl.php в скрипт index.php подставляет переменные и выплевывает в браузер.

Интересуют варианты обработки tpl.php не в браузер, а в переменную. То есть необходимо результат не выплюнуть в браузер, а вернуть переменной. Вот как бы это реализовать. Файл tpl.php редактировать нельзя. Только сам скрипт index.php.
 
да собственно с помощью простых функций работы с файлами...
например:
PHP:
<?php 
$title = 'ЗАГОЛОВОК ДОКУМЕНТА'; 
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'; 

//include('./tpl.php'); 
$lines = file('./tpl.php');
foreach ($lines as $line_num => $line) {
    echo "Строка #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
?>
все зависит от того с какой целью это все делается...
 
да собственно с помощью простых функций работы с файлами...
например:
PHP:
<?php 
$title = 'ЗАГОЛОВОК ДОКУМЕНТА'; 
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'; 
//include('./tpl.php'); 
$lines = file('./tpl.php');
foreach ($lines as $line_num => $line) {
    echo "Строка #<b>{$line_num}</b> : " . htmlspecialchars($line) . "<br />\n";
}
?>
...

Не не то... Получилось в итоге:
Код:
Строка #0 : <html> 
 Строка #1 : <head> 
 Строка #2 : <title><?php echo $title; ?></title> 
 Строка #3 : </head> 
 Строка #4 : <body> 
 Строка #5 : 
 Строка #6 : <?php echo $body; ?> 
 Строка #7 : 
 Строка #8 : </body> 
 Строка #9 : </html>

А надо если на конкретном твоем примере так:
Код:
Строка #0 : <html> 
 Строка #1 : <head> 
 Строка #2 : <title>ЗАГОЛОВОК ДОКУМЕНТА</title> 
 Строка #3 : </head> 
 Строка #4 : <body> 
 Строка #5 : 
 Строка #6 : ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА 
 Строка #7 : 
 Строка #8 : </body> 
 Строка #9 : </html>


То есть надо исполнить код в tpl.php и загнать его в переменную, но все это дело должно произойти в скрипте index.php.


...все зависит от того с какой целью это все делается...

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

Вот и интересует есть ли возможность исполнить код в tpl.php но не выводить его а просто передать результат отработки этого кода переменной.
 
Приветствую.
есть два файла:
1) tpl.php :
PHP:
<html>
<head>
	<title><?php echo $title; ?></title>
</head>
<body>
<?php echo $body; ?>
</body>
</html>
и
2) index.php :
PHP:
<?php
$title = 'ЗАГОЛОВОК ДОКУМЕНТА';
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';
include('./tpl.php');
?>
Сейчас скрипт просто вставляет содержимое файла tpl.php в скрипт index.php подставляет переменные и выплевывает в браузер.
Интересуют варианты обработки tpl.php не в браузер, а в переменную. То есть необходимо результат не выплюнуть в браузер, а вернуть переменной. Вот как бы это реализовать. Файл tpl.php редактировать нельзя. Только сам скрипт index.php.

PHP:
Если я тебя правильно понял. то это делается при помощи синтаксиса heredoc
<?php 
include('./tpl.php'); 
$title = 'ЗАГОЛОВОК ДОКУМЕНТА'; 
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'; 

    
$str = <<<EOD
<html> 
<head> 
<title>$title</title><br/> 
</head> 
<body> 
$body
</body> 
</html> 
EOD;
echo $str; 
  

?>
Вообщем возможно где-то ошибся, но в теории должно работать
 
PHP:
Если я тебя правильно понял. то это делается при помощи синтаксиса heredoc
<?php 
include('./tpl.php'); 
$title = 'ЗАГОЛОВОК ДОКУМЕНТА'; 
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'; 
$str = <<<EOD
<html> 
<head> 
<title>$title</title><br/> 
</head> 
<body> 
$body
</body> 
</html> 
EOD;
echo $str; 
?>
Вообщем возможно где-то ошибся, но в теории должно работать

Нет, не то, ты не правильно понял задачу.

код в файле tpl.php должен исполниться в среде скрипта index.php и результат исполнения tpl.php необходимо присвоить переменной.

если бы шаблон tpl.php находился в одном файле (index.php) то это бы выглядело так:
PHP:
<?php
$title = 'ЗАГОЛОВОК ДОКУМЕНТА';
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';

$out = '<html>
<head>
	<title>'.$title.'</title>
</head>
<body>
	'.$body.'
</body>
</html>';
?>

но у нас шаблон находиться в внешнем файле, его надо подцепить к скрипту index.php исполнить его в index.php и приравнять результат исполнения переменной.
 
Забери тогда файл через
PHP:
<?php 
$title = 'ЗАГОЛОВОК ДОКУМЕНТА'; 
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'; 
$TPLF=file_get_contents("tpl.php");
$TPLF=str_replace("{title}","$title",$TPLF);
$TPLF=str_replace("{key}","$title",$TPLF);
echo $TPLF;
или записать в файл.
В чем выгода  того  что в дизайне будут переменные?
?>
что то делаем с переменной
PHP:
$tpl
сождержащей шаблон
только зачем в шаблоне пихать переменные, не проще сунуть сразу что то типа
так
HTML:
 <html> 
<head> 
    <title>{title}</title> 
</head> 
<body> 
    {body}
</body> 
</html>
 
Забери тогда файл через
PHP:
<?php 
$title = 'ЗАГОЛОВОК ДОКУМЕНТА'; 
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА'; 
$TPLF=file_get_contents("tpl.php");
$TPLF=str_replace("{title}","$title",$TPLF);
$TPLF=str_replace("{key}","$title",$TPLF);
echo $TPLF;
или записать в файл.
В чем выгода  того  что в дизайне будут переменные?
?>
что то делаем с переменной
PHP:
$tpl
сождержащей шаблон
только зачем в шаблоне пихать переменные, не проще сунуть сразу что то типа
так
HTML:
 <html> 
<head> 
    <title>{title}</title> 
</head> 
<body> 
    {body}
</body> 
</html>

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

PHP:
<?php
$title = 'ЗАГОЛОВОК ДОКУМЕНТА';
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';

ob_start();
include('./tpl.php');
$text = ob_get_contents();
ob_end_clean();

?>

Готово )
 
Не нужно никаких плясок со строками и парсинга.
Достаточно просто перехватить выходной поток
PHP:
<?php
$title = 'ЗАГОЛОВОК ДОКУМЕНТА';
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';
ob_start();
include('./tpl.php');
$text = ob_get_contents();
ob_end_clean();
?>
Готово )

:yahoo: Ага робит, я догадывался что это можно реализовать функциями ob_* но почемуто оставил их на десерт, надо было сразу попробовать.

Ну в общем вариант пока годиться подводных камне пока не увидел, буду тестировать. Собственно если кто то может предложить другое решения делитесь, обсудим...
 
главное - фантазия ;)
если у тебя во втором файле только конструкции вроде <?php echo $somevar; ?>, то можно так:
PHP:
<html> 
<head> 
    <title>$title</title> 
</head> 
<body> 

$body

</body> 
</html>
и
PHP:
<?php
error_reporting(E_ALL & ~E_NOTICE);
$title = 'ЗАГОЛОВОК ДОКУМЕНТА'; 
$body = 'ТЕЛО ДОКУМЕНТА, КАКОЙТО ПРОИЗВОЛЬНЫЙ КОД, БЛА БЛА БЛА';
eval("\$t=\"".file_get_contents("2.php")."\";");
echo $t;
?>

а если с несложными текстовыми функциями, то можно и так:
PHP:
<html> 
<head> 
    <title>".strtolower($title)."</title> 
</head> 
<body> 

$body

</body> 
</html>
 
Назад
Сверху