Я пишу свою собственную структуру MVC и пришел к визуализатору вида. Я устанавливаю vars в своем контроллере в объект View, а затем получаю vars по echo $ this-> myvar в сценарии .phtml.
В моем default.phtml я вызываю метод $ this-> content () для вывода viewcript.
Так я это делаю сейчас. Это правильный способ сделать это?
class View extends Object { protected $_front; public function __construct(Front $front) { $this->_front = $front; } public function render() { ob_start(); require APPLICATION_PATH . '/layouts/default.phtml' ; ob_end_flush(); } public function content() { require APPLICATION_PATH . '/views/' . $this->_front->getControllerName() . '/' . $this->_front->getActionName() . '.phtml' ; } }
Вот пример того, как я это сделал:
<?php class View { private $data = array(); private $render = FALSE; public function __construct($template) { try { $file = ROOT . '/templates/' . strtolower($template) . '.php'; if (file_exists($file)) { $this->render = $file; } else { throw new customException('Template ' . $template . ' not found!'); } } catch (customException $e) { echo $e->errorMessage(); } } public function assign($variable, $value) { $this->data[$variable] = $value; } public function __destruct() { extract($this->data); include($this->render); } } ?>
Я использую функцию назначения из своего контроллера для назначения переменных, а в деструкторе я извлекаю этот массив, чтобы сделать их локальными переменными в представлении.
Не стесняйтесь использовать это, если хотите, я надеюсь, что это даст вам представление о том, как вы можете это сделать
Вот полный пример:
class Something extends Controller { public function index () { $view = new view('templatefile'); $view->assign('variablename', 'variable content'); } }
И в вашем файле вида:
<?php echo $variablename; ?>
Пример простого класса вида. Действительно похож на ваш и Дэвид Эрикссон.
<?php /** * View-specific wrapper. * Limits the accessible scope available to templates. */ class View{ /** * Template being rendered. */ protected $template = null; /** * Initialize a new view context. */ public function __construct($template) { $this->template = $template; } /** * Safely escape/encode the provided data. */ public function h($data) { return htmlspecialchars((string) $data, ENT_QUOTES, 'UTF-8'); } /** * Render the template, returning it's content. * @param array $data Data made available to the view. * @return string The rendered template. */ public function render(Array $data) { extract($data); ob_start(); include( APP_PATH . DIRECTORY_SEPARATOR . $this->template); $content = ob_get_contents(); ob_end_clean(); return $content; } } ?>
Функции, определенные в классе, будут доступны в представлении следующим образом:
<?php echo $this->h('Hello World'); ?>