Активный view vs Пассивный view

skwee

Новичок
Привет всем!
Для начала хочу представится, звать меня Дмтирий.

Меня интересует один вопрос а именно информация об Активных и Пассивных view. Ни как не могу сформулировать подходящий запрос в гугл.
Интересует все: что это и с чем их кушают, какие плюси и минусы, примеры реализации и тд.

Спасибо за ранее.
 

skwee

Новичок
Дмитрий вроде 3 или 4 по популярности имя) Но спасибо за комплимент)

А мешает спросить то, что все началось с того что мвц в пхп уже не тот и ктото ляпнул что есть два вида вью:
1. Активный - тот который дергает модели и говорит "дай мне юзеров, шоппинг карт юзера и тд"
2. Пассивный - тот которому говорят "вот тебе юзеры, вот тебе шоппинг карт, рисуй".

Просто вот маюсь уже который день как сделать вью. Роутер есть, контроллеры есть, диспачер есть, модели накидать не сложно, а вот вью.
Вроде как склоняюсь к активному ибо не хочу кормить пассивого из контроллера, но встают вопросы
1. Что вью может дергать? Можно ли ему дергать раутер чтобы выводить ссылки например (раутер вроде не модель)? А куки он читать может? и тд.
2. Как создать layout? Ведь есть header, footer они везде одинаковые, как к ним прикрутить контент той или иной страницы?

Вот и пытаюсь найти информацию.

Ragazzo
да читал я этот тред) с него вроде все и началось))
 

AmdY

Пью пиво
Команда форума
здесь зависит от проекта, в маленьком проекте активные шаблоны рулят, потому что сильно ускоряет разработку. но если проект большой и его нужно долго поддерживать, а код будет часто меняться, то активные шаблоны могут помочь прострелить ногу. ни то, чтобы их вовсе нельзя было использовать, но нужно быть крайне осторожным и не увлекаться.

по хорошему, при использовании активных шаблонов, не забывай, что данные можно тянуть, но не изменять, read only mode.
 

skwee

Новичок
то активные шаблоны могут помочь прострелить ногу
Хочется спросить - почему? Толко из за того что мой проект "большой"? И что такое большой?

я тут подумал что можно например взять активный вью но вместо того чтобы он дергал модели, он будет дергать чтото вроде ViewModel (обертка модели в хтмл хелпер) и тогда такой код:
PHP:
$cart = Model::factory('Cart')->getUserCart($currentUserId);
foreach($cart->items as $item) {
echo "<blabla>$item</blabla>";
}
будеть выглядеть так:
PHP:
<?=CartViewModel::showUserCart($currentUserId);?>
флоппик
Аргументируй плиз.
Как аргумент могу сказать что пассивный вью намертво привязан к контроллеру (ибо второй кормит первого)
 

Absinthe

жожо
Мое мнение - в активном нет смысла.
По результатам той темы.

И там же я предложил несколько альтернатив в классическом пассивном стиле.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
флоппик
Аргументируй плиз.
Как аргумент могу сказать что пассивный вью намертво привязан к контроллеру (ибо второй кормит первого)
Виду без разницы, какой именно контроллер его кормит данные, поэтому он к нему не привязан.
Аргументирую — так как шаблоны придуманы для того, что бы не мешать логику с отображением, пассивные просто не дают это сделать.
 

Absinthe

жожо
Аргументирую — так как шаблоны придуманы для того, что бы не мешать логику с отображением, пассивные просто не дают это сделать.
А активные целенаправленно это делают.
 

Духовность™

Продвинутый новичок
из пустого в порожнее

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

ни разу не видел активные шаблоны. сделать что-то на их базе не получилось, масса подводных камней.
 

skwee

Новичок
Ну для начала давайте решим что есть пассивный вью. Я понимаю это так:
Пассивный вью это нечто что не имеет ни какой логики кроме if, whilte, for. Вся дата в него приходит из вне (контроллер). Я прав?

А теперь пара вопросов.
1. Есть раутер, он умеет выдавать ссылки, например если я сказал что ссылка ввиде /home будет называется home то данный код
PHP:
<a href="<?=$router->urlFor('home')?>">Home</a>
выдаст данный хтмл
PHP:
<a href="/home">Home</a>
При пассивном вью, что я передаю в него? весь обьект раутера? только нужный url? а если их десятки:
PHP:
$this->view->url['home'] = $this->router->urlFor('home');
$this->view->url['user_vasya'] = $this->router->urlFor('user', 'vasya');
....
$this->view->render('template.tpl');
2. есть форма логина. она используется на двух страницах, home и login. Как мне ее отрисовать не делая копи-паст? include 'forms.login.tpl'? а если ее тоже кормить нада?
 

Ragazzo

TDD interested
skwee
2. есть форма логина....
делай рендеринг в вью, и передавай параметры дальше во вложенный при рендеренге, это нормально
PHP:
//первый view
echo $someName;
//нужно отрендерить еще одну произв. форму
$this->render('someForm',$someParamsArray);
 

skwee

Новичок
skwee

делай рендеринг в вью, и передавай параметры дальше во вложенный при рендеренге, это нормально
PHP:
$form = new View('login');
$form->username = $username;

$page = new View('page');
$page->login_form = $form->render();
$page->... = ..;
return $page->render();
так? если да то
PHP:
$form = new View('login');
$form->username = $username;
дублируется в HomeController и в LoginController и тогда по сути это уже другой контроллер\метод
 

Ragazzo

TDD interested
skwee
2 строчки несомненно громадный вклад в оптимизацию, по сравнению с тем что ты потеряешь 3-4 часа на том как сделать код еще более запутанней :)
 

AmdY

Пью пиво
Команда форума
будеть выглядеть так:
PHP:
<?=CartViewModel::showUserCart($currentUserId);?>
прекрасный пример, теперь чтобы поправить ОТОБРАЖЕНИЕ, нужно лезть внутрь CartViewModel::showUserCart, такая практика порочна даже на маленьких проектах.
пассивные шаблоны используются везде. классическая схема - скрипт отработал, подключили шаблон, он вывел данные
и где-то посреди этой работы, я уже пью пиво с друзьями, пока ты опасаешься подводных камней. Я активно использую активные шаблоны и не наступал на подводные камни. Скажу более, ты скорее всего тоже используешь активные шаблоны.
 

Ragazzo

TDD interested
AmdY
можешь привести пример рабочего активного шаблона из IRL, а не абстракцию?интересно посмотреть насколько независимы у тебя контроллер + шаблон
 

skwee

Новичок
Ragazzo
это был как пример. Если хочеш то можно взять за пример сводку новостей (a-la новости с парва в facebookи. там я уверен намного больше двух строчек, а он есть на всех страницах).

И да еше вопрос, как сделать layout на пассивных шаблонах уж не хочется в каждом акшене писать:
PHP:
$this->view->header = View::factory('header.tpl')->render();
$this->view->.. = ..;
$this->view->.. = ..;
$this->view->footer = View::factory('footer.tpl')->render();
(и это при условии что хедер и футер кормить не надо)
 

Ragazzo

TDD interested
skwee
то что ты хочешь делается у всех обычным основным layout, в который потом рендерится контент. самое простое это:
PHP:
//main layout
//header
<?php echo $content;?>
//footer
и метод render смотрит какой ему основной шаблон рендерить и все. возьми какой-нибудь фреймворк уже и посмотри, эта тема может продолжаться до бесконечности.
 

AmdY

Пью пиво
Команда форума
Ragazzo
сейчас под рукой нет кода, но типичный вывод блока последних 10 новостей, 5 последних видео, делаю так.
PHP:
<?php
$oNews = new Model_News();
$oNews->findLast(10);
?>
<ul>
<?php foreach($oNews AS $news) { ?>
     <li><?=$this->escape($news['title'])?></li>
<?php } ?>
</ul>
В экшине тяну основную центральную часть, если нужно. А доп. блоки по возможности так как описал выше. Хотя, может быть и полностью пустой экшин, а данные тянутся в шаблоне.
Завтра сброшу пример.
 
Сверху