Я работаю на небольшом PHP-сайте, основанном на MVC. У меня есть фронт-контроллер ( front.php
), который загружает контроллер ( services.php
), запускает метод действия ( hostingAction()
) и включает html ( view.phtml
). Существует вызов метода в view.phtml ( $this->renderContent()
), который включает внутренний контент ( hosting.phtml
).
ВОПРОС: Как я могу установить свойства (например, $title = 'My Title';
) в hostingAction()
а затем в view.phtml do <title><?php echo $title ?></title>
$title = 'My Title';
<title><?php echo $title ?></title>
?
Zend Framework делает что-то вроде $this->view->title = 'My Title';
в контроллере, а затем в представлении делает что-то вроде <title><?php echo $view->title; ?></title>
<title><?php echo $view->title; ?></title>
.
В настоящее время я перегружаю свойства. Я могу настроить свойства в действии контроллера, но не смог получить к ним доступ в моем представлении. Что я здесь делаю неправильно?
ОБРАЗЕЦ КОДА:
front.php
class front { private $view; function __construct() { $this->view = new viewProperties(); $this->constructController(); include('application/views/view.phtml'); } private function constructController() { $c = new services(); $this->doAction($c); } public function renderContent() { include('application/views/services/hosting.php'); } private function doAction($c) { $c->hostingAction(); } }
вclass front { private $view; function __construct() { $this->view = new viewProperties(); $this->constructController(); include('application/views/view.phtml'); } private function constructController() { $c = new services(); $this->doAction($c); } public function renderContent() { include('application/views/services/hosting.php'); } private function doAction($c) { $c->hostingAction(); } }
вclass front { private $view; function __construct() { $this->view = new viewProperties(); $this->constructController(); include('application/views/view.phtml'); } private function constructController() { $c = new services(); $this->doAction($c); } public function renderContent() { include('application/views/services/hosting.php'); } private function doAction($c) { $c->hostingAction(); } }
services.php
class services { public function hostingAction() { $this->view->page_title = 'Services - Hosting'; $this->view->banner_src = '/assets/images/banners/home_02.jpg'; $this->view->banner_title = 'reload'; } }
viewProperties.php
class viewProperties { private $data = array (); public function __set($name, $value) { $this->data[$name] = $value; } public function __get($name) { if (array_key_exists($name, $this->data)) { return $this->data[$name]; } } }
view.phtml
<html> <head> <title><?php echo $this->view->page_title; ?></title> </head> <body> <?php $this->renderContent() ?> </body> </html>
hosting.phtml
<div id="banner"> <img src="<?php echo $this->view->banner_src ?>" alt="<?php echo $this->view->banner_title ?>" /> </div>
Объект Services
не имеет доступа к $view
.
Попробуйте эти моды:
front.php (с сеттером)
class front { private function constructController() { $c = new services(); $c->setView($this->view); $this->doAction($c); } }
services.php (с сеттером)
class services { private $view; public function setView(viewProperties $view) { $this->view = $view; } public function hostingAction() { $this->view->page_title = 'Services - Hosting'; $this->view->banner_src = '/assets/images/banners/home_02.jpg'; $this->view->banner_title = 'reload'; } }
Кроме того, вы можете сделать viewProperties синглом (по вашим комментариям):
viewProperties (с singleton)
class viewProperties { private $instance = null; private function __construct() {} public static function getInstance() { if (null === $this->instance) { $this->instance = new self(); } return $this->view; } }
передний (с одноэлементным)
class front { private $view; function __construct() { $this->view = viewProperties::getInstance(); $this->constructController(); include('application/views/view.phtml'); } }
вclass front { private $view; function __construct() { $this->view = viewProperties::getInstance(); $this->constructController(); include('application/views/view.phtml'); } }
services.php (с singleton)
class services { private $view; function __construct() { $view = viewProperties::getInstance(); } public function hostingAction() { $this->view->page_title = 'Services - Hosting'; $this->view->banner_src = '/assets/images/banners/home_02.jpg'; $this->view->banner_title = 'reload'; } }
Наконец, что касается использования «banner_src» и «banner_title», вы можете использовать метод, упомянутый в вашем исходном сообщении, который масштабируется лучше.
ПРИМЕЧАНИЕ . Пример ниже был скопирован из моего ответа на ваш оригинальный пост и не был исправлен в соответствии с вашим новым кодом. Он показывает, что вы можете хранить массивы () для многомерных данных и показывать, как получить к ним доступ из вашего представления.
class services extends controller { public function indexAction() { $this->view->banner = array ( 'src' => '/path/to/images/banners/home_02.jpg', 'alt' => 'banner title' ); } public function hostingAction() { $this->view->banner = array ( 'src' => '/path/to/images/banners/home_02.jpg', 'alt' => 'banner title' ); } } <img src="<?php echo $this->view->banner['src'] ?>" alt="<?php echo $this->view->banner['title'] ?>" />