Сообщение флэш-мессенджера Zend Framework и перенаправление

Итак, я создаю проект с использованием zend-framework и пытаюсь реализовать помощник flash messenger, но не могу найти никакой хорошей практики для его реализации. Что мне нужно, так это использовать флеш-мессенджер для отправки сообщения и перенаправления, при этом сообщение появится прямо в определенном месте в layout.phtml. Я знаю, что для редиректора я могу сделать это:

$redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('redirector');
$redirector->gotoUrl('/my-controller/my-action/param1/test/param2/test2')
               ->redirectAndExit();'

Что я могу сделать с флеш-мессенджером, чтобы он заработал? и какова наилучшая практика для этого?


person dori naji    schedule 07.05.2012    source источник


Ответы (3)


В вашем контроллере

public function init()
{
$messages = $this->_helper->flashMessenger->getMessages();
if(!empty($messages))
$this->_helper->layout->getView()->message = $messages[0];
}

в вашем layout.phtml

    <!-- Global notification handling to use call flashMessenger action helper -->
    <?php if(isset($this->message)) :?>
    <div class="notification">

    <?php echo $this->message ;?>

    </div>    
 <?php endif;?>

Затем, когда вы хотите использовать его

public function loginAction()
{
$this->_helper->flashMessenger('Login is success');
$this->_helper->redirector('home');
}

Почти каждый раз, когда вы будете перенаправляться после использования flashMessenger.

person Mr Coder    schedule 07.05.2012
comment
Это будет получать только одно флэш-сообщение за раз. Вы не можете повторять - person coolguy; 07.05.2012
comment
Я никогда не сталкивался с потребностью в более чем одном сообщении. - person Mr Coder; 07.05.2012
comment
на данный момент это работает нормально, но у меня есть один вопрос, почему автозаполнение в net beans не показывает автозаполнение, когда я использую _helper, и как я могу это сделать ?? - person dori naji; 08.05.2012
comment
@dorinaji Поскольку помощник использует магическую функцию php __call, следовательно, невозможно определить имя помощника. Но Zend Studio (IDE) показывает автозаполнение для помощников, поскольку знает о структуре ZF. Это одна из важных функций, для которой я сам использую Zend Studio. - person Mr Coder; 08.05.2012

Как использовать флеш-мессенджер в Zend, предположим, у вас есть действие под названием «foo».

public function fooAction(){

 $flashMessenger = $this->_helper->getHelper('FlashMessenger');
 //some codes
 $flashMessenger->addMessage(array('error' => 'This is an error message'));
$this->_redirect('/someothercontroller/bar');

}
//someothercontroller/barAction
public function barAction(){

$flashMessenger = $this->_helper->getHelper('FlashMessenger');
 $this->view->flashmsgs = $flashMessenger->getMessages();  //pass it to view 

}

В вашей части просмотра

<?php if(isset($this->flashmsgs)) { ?>
                 <?php foreach($this->flashmsgs as $msg){ 
                       foreach ($msg as $key=>$diserrors) {
                        if($key=="error"){?>
      //do wat you want with your message
<?php } } }?>
person coolguy    schedule 07.05.2012

Это должно работать внутри контроллера

/**
 * @var Zend_Controller_Action_Helper_FlashMessenger
 */
protected $flashMessenger = null;


/**
 * initalize flash messenger
 *
 * @return void
 */
public function init() 
{
    $this->flashMessenger = $this->_helper->FlashMessenger;
}

/**
 * Action wich is redirectin.. and sets message
 *
 * @return void
 */
public function actiononeAction()
{
    $this->flashMessenger->addMessage('FLY HiGH BiRD!');
    $this->_redirect('/whatever/url/in/your/project');
}

/**
 * display messages from messenger
 * 
 * @return void
 */
public function displayAction()
{
    $myMessages = $this->flashMessenger->getMessages();
    $this->view->messages = $myMessages;
}
person opHASnoNAME    schedule 07.05.2012
comment
Контроллеры не должны сохранять состояние; поэтому создание переменных для них не является хорошей практикой. Вместо этого просто используйте $this->_helper->flashMessenger или, если вам скучно печатать от руки, назначьте его для каждого действия как $flashMessenger = $this->_helper->flashMessenger. Используйте объект запроса для состояния в запросе, если вы не используете модель. - person shrikeh; 07.05.2012