2011-02-05 3 views
3

В мой контроллер, у меня есть postDispatch консолидировать свои FlashMessenger сообщения:Получение Просмотр объекта внутри плагина Zend Controller

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; 
} 

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

UPDATE: Я понял, зачем мне это нужно - я хочу передать свои флеш-сообщения в 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; 
    } 
} 

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

ответ

1

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

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

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

+0

FlashMessenger отображает предупреждения на следующей странице. Поэтому, если вы хотите отправлять страницы на эту страницу, вам нужно сделать некоторую логику (получить предыдущие сообщения, получить текущие сообщения, объединить их). Поэтому я должен просто поместить логику в свой макет/представление? Это, конечно, намного проще, но я думал, что в сценариях представления есть плохая практика. – Corey

+0

@Corey, Noumenal Flash Messenger View. Помощник Helper упоминает, что уже обрабатывает логику getMessages()/getCurrentMessages() для вас. –

0

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

+0

Спасибо. Получение функциональности во всех контроллерах - именно то, что я хочу. Я создал свою собственную библиотеку, но она кажется неуклюжей. Я бы предпочел добавить/удалить плагин и получить функциональность. – Corey

12

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

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; 
Смежные вопросы