Получение объекта View из плагина Zend Controller - PullRequest
3 голосов
/ 05 февраля 2011

В моем контроллере у меня есть postDispatch для объединения моих сообщений FlashMessenger:

public function postDispatch()
{       
    $messages = $this->_helper->getHelper ( 'FlashMessenger' )
        ->getMessages ();

    if ( $this->_helper->getHelper ( 'FlashMessenger' )
        ->hasCurrentMessages () )
    {
        $messages = array_merge ( $messages, $this->_helper->getHelper ( 'FlashMessenger' )
            ->getCurrentMessages () );
        $this->_helper->getHelper ( 'FlashMessenger' )
            ->clearCurrentMessages ();
    }

    $this->view->alert = $messages;
}

Я хочу превратить это в плагин Controller.

ОБНОВЛЕНИЕ: я понял, зачем мне это нужно - я хочу передать свои флеш-сообщения в JSON при вызове контекстом JSON. Если сообщения не добавляются в объект View, я не получаю сообщения.

Мне удалось получить сообщения в массив, но я не знаю, как передать их в представление:

class Plugin_FlashMessenger extends Zend_Controller_Plugin_Abstract
{
    public function postDispatch($request)
    {
        $flashmessenger = Zend_Controller_Action_HelperBroker::getStaticHelper ( 'FlashMessenger' );

        $messages = $flashmessenger->getMessages ();
        if ( $flashmessenger->hasCurrentMessages () )
        {
            $messages = array_merge ( $messages, $flashmessenger->getCurrentMessages () );
            $flashmessenger->clearCurrentMessages ();
        }

        // THIS LINE IS WRONG. HOW DO I SEND $messages TO THE VIEW?
        $this->view->alert = $messages;
    }
}

Бонусный вопрос - это правильный путь для достижения этой цели? Спасибо!

Ответы [ 3 ]

12 голосов
/ 25 мая 2011

Я нашел ваше сообщение при поиске того же самого. Основываясь на этой теме , есть два простых способа сделать это.

One: Если ваше представление инициализируется во время начальной загрузки (resources.view[] = в вашем application.ini), вы можете просто вызвать это:

$view = Zend_Controller_Front::getInstance()
        ->getParam('bootstrap')
        ->getResource('view');

Два: Если ваше представление не инициализируется во время начальной загрузки:

$viewRenderer = Zend_Controller_Action_HelperBroker::getStaticHelper('viewRenderer');
if (null === $viewRenderer->view) {
    $viewRenderer->initView();
}
$view = $viewRenderer->view;
1 голос
/ 05 февраля 2011

Я считаю, что это неправильный способ сделать это. FlashMessenger должен иметь мало уведомлений от одного запроса к другому; доступно в представлении .

Таким образом, flashmessenger уже является помощником действий контроллера (для вышеуказанной цели). Почему вы хотите создать еще один помощник? :)

Итак, ваша проблема на самом деле получить сообщения в представлении. Для этого уже есть помощник вида. От нуменал . Это круто.

0 голосов
/ 07 февраля 2011

Если вы просто хотите получить эту функциональность во всех ваших контроллерах, вы можете просто расширить Zend_Controller_Action и создать новый класс, содержащий ваш код отправки после отправки.

...