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

skwee

Новичок
Ragazzo
Мда ты прав, забыл про это. В Зенде вроде так, называется two step view вроде..
 

Ragazzo

TDD interested
AmdY
т.е по сути ничем не отличается от
PHP:
// тут действия в экшене
$this->render('someView',array(
   'oNews' =>  (new Model_News())->findLast(10);
  )
);
//а во вью как дальше описал ты
чем твоя ситуация выйграшнее чем просто в экшене тянуть данные? или это распространяется на те вью, которые могут быть использованы множеством разных экшенов, и чтобы в каждом из экшенов не писать в рендеренге одни и те же параметры, ты их сбросил во вью? (если то что ты сбросил есть активные шаблоны, то я тоже использую их получается, как наверное и 90% остальных :) )
 

Sufir

Я не волшебник, я только учусь
те вью, которые могут быть использованы множеством разных экшенов, и чтобы в каждом из экшенов не писать в рендеренге одни и те же параметры
Т.е. viewHelper'ы?
 

AmdY

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

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


я же говорю, практически все используют активные шаблоны.
 

Ragazzo

TDD interested
Sufir
только не вводи новые обозначения, а то все скатиться к тому, что один называет одно и то же так, другой по-другому, и не разберемся в итоге :)
AmdY
Ок, понял, но пример все равно ждем потом :)
 

Sufir

Я не волшебник, я только учусь
Sufir
только не вводи новые обозначения, а то все скатиться к тому, что один называет одно и то же так, другой по-другому, и не разберемся в итоге :)
Так я и пытаюсь разобраться о чём речь. То что вы с AmdY описали очень напоминает то, что в ZF называется viewHelper и при этом view ни чуть не выходит за рамки "Пассивный вью это нечто что не имеет ни какой логики кроме if, whilte, for. Вся дата в него приходит из вне (контроллер)." Только кое-что может приходить не из контроллера а из хелпера, как-раз таки очень удобно в описываемых случаях.
 

Ragazzo

TDD interested
Sufir
я особо не всматривался в ZF, то что ты имел ввиду по viewHelper я понял, просто не хотел заострять на этом внимания. В общем случае это просто отдельный файл с мини-логикой, которую вынесли потому что уже "ни туда и ни сюда" не? приведи пример пожалуйста своего ZF кода с viewHelper.
 

skwee

Новичок
Только кое-что может приходить не из контроллера а из хелпера, как-раз таки очень удобно в описываемых случаях.
вот тут та и граница между активным и пассивным

PHP:
class ViewHeler {
  public static function urlFor($name, $uname, array $params = array()){
    return '<a href="' . Router::instance()->urlFor($uname, $params) . '">' . $name . '</a>';
  }
}
это приемлемо в пассивном вью? или это уже активный? если это пассивный то чем это нет:
PHP:
class ViewHeler {
  public static function getShoppingCart($forUserId){
    $cart = Model::factory('ShoppingCart')->getFor($forUserId);
    $html = '<ul>';
    foreach($cart->items as $item)
      $html .= '<li>' . $item . '</li>';
    $html .= '</ul>';
    return $html;
  }
}
 

Sufir

Я не волшебник, я только учусь
Sufir
приведи пример пожалуйста своего ZF кода с viewHelper.
PHP:
class Zend_View_Helper_AuthForm extends Zend_View_Helper_Abstract {
    
    public function authForm( /*Sfr_Form_Auth*/ $form )
    {

        $html = '';
        $auth = Zend_Auth::getInstance();
        
        if ( Zend_Registry::isRegistered( 'user' ) ) {
            $User = Zend_Registry::get( 'user' );
        }
        
        if ( isset($User) ){ // Если в реестре есть user - значит отображаем аватар

                $html .= '<div id="user"><a href="/user"><img id="main-avatar" src="' . $User->getAvatar( 'l' ) . '" title="'
                        . $User->name . ' ' . $User->family
                        . '"></a></div>';

        } else { // иначе форму

            $html .= $form;

        }

        return $html;

    }

}
PHP:
// В layout, чтоб был на всех страницах, так же можно использовать в отдельных view
<aside id="sideLeft">
        <?php echo $this->authForm( $this->authForm ) ?> // форма или аватар
    <nav>
        <?php echo $this->navigation()->menu( $this->mainMenu() )->setUlClass( 'main-menu' ); ?> // главное меню
    </nav>
</aside>
Никакие контроллеры не затрагиваются, а view и layout абсолютно пассивны.
 

AmdY

Пью пиво
Команда форума
Sufir
угу, это тоже самое что view helper, единственное, что мне не нравится, что многие пытаются viewHelper заставить выдавать html, тем самым влазя в обязанности шалона.
 

skwee

Новичок
Sufir
Ты хочешь сказать что это пассивный вью? По моему это как раз активный.
 

Ragazzo

TDD interested
Sufir
PHP:
$this->authForm
тут что? какое-то внутреннее приведение через __toString() что-ли чтобы можно было делать:
PHP:
        } else { // иначе форму

            $html .= $form;

        }
skwee
каким обзовешь такой и будет :D

вообщем чтобы сильно код не "пах" все выносят во viewHelper/еще какой-то там хелпер. Только вот html мне тоже не особо нравится в данном случае в методах viewHelper, лучше чтобы он вызывал свой вью и рендерил в него, а потом возвращал результат если надо.
 

skwee

Новичок
A Passive View handles this by reducing the behavior of the UI components to the absolute minimum by using a controller that not just handles responses to user events, but also does all the updating of the view. This allows testing to be focused on the controller with little risk of problems in the view.
http://martinfowler.com/eaaDev/PassiveScreen.html

Значит активный это противоположность данной цитаты, а раз так то не мой ViewHelper в посте №28 не ViewHelper в посте Sufir №29 не могут быть пассивными по определению. Так и скажите что все юзают активный вью но называт его пассивным ;)
 

Absinthe

жожо
Мда ты прав, забыл про это. В Зенде вроде так, называется two step view вроде..
2 step view, layout, master page и т.д.
И может быть не 2 шага, а сколько угодно.
Кстати в ZF лейауты и рядовые шаблоны - это почему-то разные сущности. Не понятно, почему разделили. И не понятно, почему управление родительским отображение засунили в контроллер, а не в дочернее отображение.

При пассивном вью, что я передаю в него? весь обьект раутера? только нужный url?
$this->url('home') для статичных адресов, $item->permalink() для объектов.

И да еше вопрос, как сделать layout на пассивных шаблонах уж не хочется в каждом акшене писать:
Унаследовать другой шаблон, в котором есть хедер и футер.
 

skwee

Новичок
Не, я ничего не утверждаю. Я изучаю. Так это активный?
Так вот я тоже не знаю, выходит что да. Кроме меня ни кто так и не дал определения активному и пассивному


Absinthe
$this->url('home') для статичных адресов, $item->permalink() для объектов.
Что есть $this в данном контексте? view?

А вот про линк для объектов, разви передовать сам объект и уже во вью писать
PHP:
<a href="<?=$user->permalink()?>">Vasya Pupkin's Profile</a>
будет неправильно?

Унаследовать другой шаблон, в котором есть хедер и футер.
Ты подразумеваешь template engine? ибо как наследовать шаблоны в php я не знаю.
 

Absinthe

жожо
Кроме меня ни кто так и не дал определения активному и пассивному
Тут мне дали другое определение чем то, которое я читал в книгах.

В книге активным шаблоном назвали шаблон с логикой отображения, а не просто нарезку непонятных кусков, которые потом сшиваются в контроллере(который вовсе не контроллер, а каша из контроллера и вида)

Тут же сказали, что активный шаблон сам дергает данные в обход контроллера.

Я считаю, что по первому определению шаблон должен быть однозначно активным, а по второму - преимущественно пассивным(возможны небольшие активные элементы в виде виджетов)
 

itprog

Cruftsman
. Кроме меня ни кто так и не дал определения активному и пассивному
В вебе MVC кончается на разделении на templates, models, controllers. На десктопных оконных приложениях вид может менять свой отображение, что по сути делает его активным. В пассивных же вид не делает вообще ничего, если произошло событие click, то новый скрин отрисуется только когда выполнится контроллер . И делают это для облегчения тестирования. (это то, что написано у Фаулера). Иначе сложно протестировать появилось ли окно, после нажатия на кнопку "Открыть файл" или нет.

В вебе же многие фреймворки называют активным тот вид, который решает что отобразить клиенту (например, с помощью вызовов других контроллеров из шаблонов). Пассивные это, например, xslt-шаблоны,все данные, которые могут быть отображены, передаются только контроллером.

Хелперы вообще не та степь. В хелперы выносят куски, которые повторно используются в нескольких местах (генератор форм это тоже хелпер, но это не значит что шаблон с формой обязательно активный).

Собственно определений нет, есть концепция...
давайте теперь об активных и пассивных контроллерах %)
 

Absinthe

жожо
Что есть $this в данном контексте? view?
Да. Ну или {% url 'home' %} - смотря что у тебя там с шаблонизацией.

А вот про линк для объектов, разви передовать сам объект и уже во вью писать будет неправильно?
Так и есть.
Вот пример:
PHP:
{% for user in users %}
    <a href="{{ user.permalink }}">{{ user.name }}</a><br />
{% endfor %}
Ты подразумеваешь template engine? ибо как наследовать шаблоны в php я не знаю.
Как хочешь. Можешь pure php использовать - в ZF подсмотри, как блоки определяются.
 
Сверху