PHP: ob_start(); extract($this->vars); include($this->template); $content = ob_get_clean(); ob_end_clean(); return $content; вот любопытно а как вы вложенные шаблоны обходите ? ob_end_clean(); - завершит же все открытые буферы ....
Отлично, так и запишем PHP: <?php final class view { // Буфер переменных private $vars = array(); // Шаблон (путь, файл) private $template = null; // Установка шаблона function __construct($path) { $this -> template = $path; } // Установка переменной function set($var, $val) { $this -> vars[$var] = $val; } // Выполнение шаблона с возвращением строки public function __toString() { ob_start(); include($this -> template); return ob_get_clean(); } // Вывод результата работы function flush() { extract($this -> vars); include($this -> template); } } Не, пускай flush делает вывод, а не возвращает значение Смотри фокус PHP: <?php ob_start(); echo 'Hello'; ob_start(); echo 'World!'; $b = ob_get_clean(); $a = ob_get_clean(); var_dump(compact('a','b'));
Неа. Этот метод чтобы делать так: PHP: <?php $view -> set($block, new view('block.php')); неймспейс экстрактом засорять не надо.
Брр. Не гони. Ты сам себя лишаешь возможности передать в подшаблон переменные. Более того, если где-то у тебя сделается echo $view Для основного шаблона, то он вылезет без переменных вовсе. Это вообще о чем?
Остановился на варианте с прокси PHP: <?php final class view { // Буфер переменных private $vars = array(); // Шаблон (путь, файл) private $template = null; // Установка шаблона function __construct($path) { $this -> template = $path; } // Установка переменной function set($var, $val) { $this -> vars[$var] = $val; } // Прокси к compile public function __toString() { return $this -> compile(); } // Компилирование результата function compile() { extract($this -> vars); ob_start(); include($this -> template); return ob_get_clean(); } }
Тогда вообще лучше волшебно PHP: <?php final class view { // Буфер переменных private $vars = array(); // Шаблон (путь, файл) private $_path = null; // Установка шаблона function __construct($_path) { $this -> _path = $_path; } // Установка переменной function __set($var, $val) { $this -> vars[$var] = $val; } // Получение переменной function __get($var) { if (isset($this -> $var)) { return $this -> _path; // funny? :) } return $this -> vars[$var]; } // Выполнение шаблона function __toString() { extract($this -> vars); ob_start(); include($this -> _path); return ob_get_clean(); } }
PHP: <?php final class view extends ArrayObject function __construct() { parent::__construct(ArrayObject::ARRAY_AS_PROPS) //не помню как там точно } function __toString() { ob_start(); include($this->path); return ob_get_clean(); } )
Только одна неточность - view и ArrayObject - логически разные вещи... Да и часть методов ArrayObject не нужны для view. =))
PHP: <?php // Шаблонизатор class view { protected _content = false; ... function __toString() { if (!$this -> _content) { extract($this -> vars); ob_start(); include($this -> _path); return ob_get_clean(); } return $this -> _content; } } // MySQL final class count extends view { function __construct($table, $by = '*', $where = false) { $query = 'SELECT COUNT(' . ($by == '*' ? '*' : '`'.$by.'`') . ') FROM `' . $table . '`'; if ($where) { $query .= ' WHERE ' . $where; } $res = mysql_query($query); $this -> _content = mysql_result($res, 0); } } // =) echo new count('users');
PHP: <?php function __construct($table, $by = false, $where = false){ $query = 'SELECT COUNT(' . ($by ? '*' : '`'.$by.'`') . ') FROM `' . $table . '`' . ($where ? '' : ' WHERE ' . $where) ; ...
[vs] а ты попробуй попользоваться этим в средненьком проектике, посмотришь какая лажа может выйти....
И вообще если мы наследуем от шаблона, то это тоже должен быть шаблон =)): PHP: <?php final class count extends view { function __construct($table, $by = '*', $where = false) { if(!file_exists("count.tpl")){ StandartTemplate::createCount(); } parent::__construct("count.tpl"); $query = 'SELECT COUNT(' . ($by ? '*' : '`'.$by.'`') . ') FROM `' . $table . '`' . ($where ? '' : ' WHERE ' . $where) ; $res = mysql_query($query); $this -> _content = mysql_result($res, 0); } } ?> veiw берем старый, без _content. =))
А че PHP: <? if ((string)new count(cfg::$DB_PRX.'accounts', '*', '`nick`=\''.$data['nick'].'\'')) ... проверка на занятость ника
Можно засорить весь неймспейс такими классами и функциями, да, не гибко, но зачем гибкость, если код пишется под конкретную задачу?
Не знаю не знаю я всегда писал сайты где HTML тесно переплетается c PHP и затрудняет разбор кода даже для меня ) шаблоны позволяют же отделить HTML от php и тогда каждый занимается своим делом. например есть группа дизайнеров и группа програмистов одни ваяют стиль и табличную верстку а другие клепают программу после чего подключают модуль шаблонизатора и он берет страничку стиля и меняет выражения типа $GLOBAL_BLOCK_NEWS$ на новостную ленту которая в свою очередь была выведена из базы данных и сохранена в переменную