snitko
Новичок
объект инклудящий файлы #2, MVC и как все сделать
Возвращаюсь к поднятой вчера теме. Поразмыслил. Пришел к выводу что таки да, единственный способ - это НЕ определять переменные, которые видны за пределами шаблонов. Но для этого нужно как-то переделать обычную архитектуру MVC. Сейчас покажу пример, иллюстрирующий проблему.
В обычном случае при архитектуре MVC мы имеем модель:
Контроллер (я для контроллера тоже использую класс, методы которого вызываются в зависимости от запроса пользователя):
и Шаблон:
И это все будет работать нормально.
Теперь предположим, что мне требуется добавить в шаблон блок, который будет выводить информацию о том залогинен ли пользователь или нет. Я поступаю следующим образом: добавляю в метод modellist() строку, создающую нужный объект:
А затем внутри шаблона 'template.tpl.php' наверху дописываю:
При этом сам user.tpl.php выглядит примерно так:
Описанный подход работает хорошо до тех пор, пока мне не потребуется немного усложнить процедуру инклуда. Предположим (в порядке бреда) я хочу писать 'God Loves you!' каждый раз, как что либо инклудится из папки '/parts/'. То есть, нужно было бы сделать что-то типа этого:
но только так, чтобы вторую строчку не пришлось бы писать каждый раз после инклуда.
Вот именно поэтому я спрашивал в предыдущем посте, а нельзя ли сделать объект, который будет инклудить шаблоны и при этом выполнять еще некоторые действия. Из-за проблем с областью видимости, придется, видимо, как-то переделать архитектуру. Вопрос в том - как?
Надеюсь достаточно подробно и понятно изложил. Буду благодарен за ответы.
Возвращаюсь к поднятой вчера теме. Поразмыслил. Пришел к выводу что таки да, единственный способ - это НЕ определять переменные, которые видны за пределами шаблонов. Но для этого нужно как-то переделать обычную архитектуру MVC. Сейчас покажу пример, иллюстрирующий проблему.
В обычном случае при архитектуре MVC мы имеем модель:
PHP:
class Car {
private $brand;
function __construct($brand) {$this->brand=$brand;}
function getListOfModels() {/*implementation*/};
function getBrand() {return $this->brand;}
}
PHP:
class ControllerCar {
function modelist($brand) {
$car=new Car('BMW');
include('template.tpl.php');
}
PHP:
So here's model list for <?=$car->getBrand();?>:
<?php foreach($car->getListOfModels() as $element) print $element;?>
Теперь предположим, что мне требуется добавить в шаблон блок, который будет выводить информацию о том залогинен ли пользователь или нет. Я поступаю следующим образом: добавляю в метод modellist() строку, создающую нужный объект:
PHP:
class ControllerCar {
function modelist($brand) {
$car=new Car('BMW');
$user=new User();
include('template.tpl.php');
}
PHP:
include('/parts/user.tpl.php');
PHP:
Your status: <?=$user->getStatus();?>
PHP:
include('/parts/user.tpl.php');
print 'God Loves you';
Вот именно поэтому я спрашивал в предыдущем посте, а нельзя ли сделать объект, который будет инклудить шаблоны и при этом выполнять еще некоторые действия. Из-за проблем с областью видимости, придется, видимо, как-то переделать архитектуру. Вопрос в том - как?
Надеюсь достаточно подробно и понятно изложил. Буду благодарен за ответы.