Промяна на начина на извличане на променливите в скрипт за изглед на Zend Framework

Предавам променлива към скрипт за изглед от контролер със Zend Framework. Искам да знам дали все пак мога да филтрирам предварително изгледа, така че да мога да променя начина, по който променливата се извлича в скрипта за изглед.

Например. В контролера имам:

$this->view->name = 'Bob';

И в изгледа имам:

echo $this->name;

Което работи добре без съмнение! Това, което искам, е от време на време да имам възможността да го променя, за да мога просто да използвам:

echo $name;

Така че основно, премахване на оператора $this. Възможно ли е това? Правя шаблон и имам други дизайнери да използват системата за шаблони и искам да ги улесня да въвеждат $this->array->name през цялото време.

Знам, че в скрипта за изглед мога просто да добавя:

$name = $this->name;

Но бих искал да направя това някъде в контролера.

Благодаря за съвета!


person Solid Pink    schedule 11.12.2011    source източник
comment
Ако искате да подписвате съобщения с вашето име, променете потребителското си име, не включвайте ред в действителните публикации. :)   -  person mac    schedule 11.12.2011


Отговори (2)


Ще кажа веднага, че мисля, че не е добра идея да се занимавате с обхвата на изходните променливи на вашия изглед. Това работи срещу MVC шаблона на рамката, като разкрива вътрешните елементи на изгледа в целия глобален обхват. Но ако наистина настоявате да направите това, в контролера, вероятно можете да ги присвоите глобално по следния начин:

$GLOBALS['name'] = $this->view->name;

И достъп до тях по-късно като $name или $GLOBALS['name'].

Забележка: в зависимост от това кога променливите на изгледа се попълват в сравнение с това, когато ги присвоите в контролера, може да се наложи да присвоите препратки.

$GLOBALS['name'] = &$this->view->name;
person Michael Berkowski    schedule 11.12.2011
comment
плашещо! Технически погледнато, това, което пишете, може да има смисъл. И ми се струва, че ще работи на практика. Но в този момент бих започнал да се питам... защо да си правя труда да използвам MVC рамка, след като я прецаквам напълно ... и създавам някакъв не толкова добър спагети код? ;-) - person maraspin; 12.12.2011
comment
@maraspin Смятам, че това е един от тези достатъчно въжета, с които да се обеси отговорите... Надяваме се, че моят отказ от отговорност към OP беше достатъчно ясен. - person Michael Berkowski; 12.12.2011
comment
Разбрах те. ;-) Коментарът ми всъщност беше повече, за да плаши новаците срещу странни практики, повече от всичко друго. - person maraspin; 12.12.2011
comment
Хм, да, всъщност изобщо не исках да използвам глобални. Надявах се на някаква функция за предварително изобразяване, която мога да използвам в контролера, за да предам правилната променлива към изгледа. Ако трябва да модифицирам ядрото по някакъв начин или структурата, вероятно не си струва да го правя. - person Solid Pink; 12.12.2011

Идеята ви е разумна и изглежда доста лесна за постигане. Просто добавете този ред в началото на вашия шаблон:

<?php extract(get_object_vars($this)) ?>

Предаването на състояние за преглед посредством глобални променливи може да не се счита за добра идея от някои, но този начин е безопасен, тъй като extract създава локални променливи, а не глобални.

Ако искате да използвате повторно този метод и предпочитате да не копирате и поставяте, можете лесно да наследите от Zend_View, да въведете този ред към метода (ако си спомням правилно) _run и след това във вашия bootstrap:

  • създайте екземпляр на контролера,
  • вземете помощника за действие ViewRenderer (използвайки статичен метод на Zend_Controller_Action_HelperBroker)
  • инжектирайте екземпляра си на изглед във ViewRenderer

По този начин всички ваши изгледи ще представят публичните си свойства като променливи.

person fdreger    schedule 11.12.2011