Изменение способа получения переменных в скрипте представления 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, а затем в свой загрузочный файл:

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

Таким образом, все ваши представления будут представлять свои общедоступные свойства как переменные.

person fdreger    schedule 11.12.2011