Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > вопрос с includ'om и переменными


Автор: sandland 28.11.2008, 01:07
Добрый день. Недавно занялся написанием небольшой библиотеки для собственных разработок, и решил как положено сделать разделение кода и шаблонов. 
Вопрос первый: посоветуете что-нибдь на тему того, как реализовывается данная модель в современных фреймворках?
Вопрос второй: Для начала решил сделать так: Выполянется дейсвтие (php- код), где определяются все переменные, которые будут использоваться в шаблоне, с помощью самописных классов, а далее вызывается метод setTamplate , который подключает шаблон, в мое случае он пока его просто инклудит в файл действия.
ну для примера:
test.php :
<?php
$page=new Page();
$title=$page->getTitle();
$page->setTamplate('test_tamplate.php');  // include "tamplates/test_tamplate.php";
?>

test_tamplate.php :
<head>
<? echo $title; ?>
</head>
<body>
  <h1>Test Page</h1>
</body>



Проблема. в том, что при таком подключении переменная $title в test_tamplate.php  не определена. Я пытался считать файл в строку, и вывести . само собой такой варинат не годится. Можно попробовать ф-цию eval, но это тоже невариант.

Подскажите поалуйста что делать



Автор: ZlojEzh 28.11.2008, 01:53
передавайте объекту Page необходимые данные
что-то вроде такого
Код

$page->set('title', 'my title');

а в темплейте
Код

<?= $this->get('title'); ?>


покопайтесь в фреймворках на предмет идей
тот же Zend_View, например

Автор: sandland 28.11.2008, 01:58
передавать переменные - это не выход, т.к. для каждой страницы свой шаблон,  и свой набор выводимых переменных. Можно, конечно формировать массив каждый раз, и передавать, но тогда вообще проще не делать разделение на дейсвтия и шаблоны.
Я пытался в Symfony найти это, пока безуспешно

Автор: ZlojEzh 28.11.2008, 02:12
дык, в шаблонизаторах обычно так и происходит
данные передаются темплейту (или объекту, создающему представление)
smarty, например:
$smarty->assign(...)
{$my_var}


Цитата(sandland @  28.11.2008,  01:58 Найти цитируемый пост)
для каждой страницы свой шаблон,  и свой набор выводимых переменных

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

конкретно в Вашем вопросе, думаю, поможет функция get_defined_vars
но это очень некрасивое решение

Автор: Pentium133 28.11.2008, 11:07
Цитата

Я пытался в Symfony найти это, пока безуспешно 

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

Автор: nerezus 28.11.2008, 14:05
Цитата

передавать переменные - это не выход, т.к. для каждой страницы свой шаблон,  и свой набор выводимых переменных. 
 Естественно.
И передавать данные в шаблон.

Почему же тогда не выход?
Тем боллее, что ты "решил как положено сделать разделение кода и шаблонов".

Цитата

Подскажите поалуйста что делать
 assign юзать.
Можно не мучать мозг сексом и использовать smarty.
Или мой шаблонизатор для шаблонов на PHP:
Код

function php_template($filename, $values=array()) {
     extract($values);
     ob_start();
     include "templates/$filename";
     $result = ob_get_contents();
     ob_end_clean();
     return $result;
}

function escape($str) {
    return htmlentities($str, ENT_COMPAT, 'UTF-8');
}


Автор: sandland 28.11.2008, 22:44
про get_defined_vars() почитал - дейсвтительно , онарешает все проблема, вот только она передает абсолютно все переменные окружения. а омжно как-то запретить передавать то что не нужно? или передачаа лишних переменных ничего не решает? - ну и решение некрасивое...


а что вы скажете на счет идеи с сессиями? что если на все страницах сайта держать одну сессию и передавать переменные через нее?

nerezus, воспользовался идеей с буфером, спасибо!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)