У меня довольно странная проблема с флэш-мессенджером в ZF2. Я использую его в довольно простом сценарии, сохраняя сообщение «завершение регистрации» после регистрации и перенаправления на страницу входа и отображения сообщения, однако сообщения никогда не возвращаются флэш-мессенджером.
В случае действия контроллера:
$this->flashMessenger()->addMessage('Registration complete'); return $this->redirect()->toRoute('default', array('controller' => 'user', 'action' => 'login'));
В действии входа в контроллер:
$flashMessenger = $this->flashMessenger(); $mes = $flashMessenger->hasMessages(); $cur = $flashMessenger->hasCurrentMessages();
Оба $ mes и $ cur ложны (я попробовал как просто убедиться). Может ли кто-нибудь пролить свет на это?
Я использую ZF 2.2.2 и PHP 5.3.14. Обработчик сохранения сеанса использует адаптер dbtable, и я попытался отключить его, а также установить диспетчер сеанса flashmessenger для использования одного и того же обработчика сохранения dbtable без результата.
Чтобы использовать FlashMessenger
контроллера FlashMessenger
, вам необходимо добавить в контроллер:
<?php class IndexController extends AbstractActionController { public function indexAction() { $this->flashMessenger()->addMessage('Your message'); return $this->redirect()->toRoute('admin/default', array('controller'=>'index', 'action'=>'thankyou')); } public function thankyouAction() { return new ViewModel(); } }
Добавьте следующий шаблон шаблона thankyou.phtml
:
<?php if ($this->flashMessenger()->hasMessages()) { echo '<div class="alert alert-info">'; $messages = $this->flashMessenger()->getMessages(); foreach($messages as $message) { echo $message; } echo '</div>'; } ?>
Кажется, что ваш код так и должен быть, в рабочем процессе должно быть что-то сложное.
В этом случае вы можете отлаживать старый путь: попробуйте var_dump($_SESSION)
чтобы узнать, заполнен ли он вашим FlashMessenger.
использование
echo $this->flashMessenger()->renderCurrent(...
вместо
echo $this->flashMessenger()->render(...
Я также столкнулся с такой же проблемой для (login flashmessage после регистрации), я решил это следующим образом
Примените проверку на странице макета, например
<?php if($this->zfcUserIdentity()) { ?> <div id="flashMessageDiv" class="hide"> <?php echo isset($flashMessages) && isset($flashMessages['0']) ? $flashMessages['0'] : ''; ?> </div> <?php } ?>
Это означает, что макет flashMessageDiv доступен только для зарегистрированного пользователя. теперь в вашем файле входа в систему (login.phtml) примените следующий код
<?php $pathArray = $_SERVER['HTTP_REFERER']; $pathArray = explode("/",$pathArray); ?> <?php if ($pathArray[4] === 'register') { ?> <div id="flashMessageDiv" class="hide"> <?php echo "User details saved successfully"; ?> </div> <?php } ?>
В приведенном выше коде я использовал HTTP_REFERER, который просто даст нам референтные данные url, проверьте, зарегистрирован ли референтный url, а затем show falshmessage.
Надеюсь, это поможет вам.
FlashMessenger теперь является официальным помощником в ZF2 и может быть легко интегрирован во все виды / макеты: FlashMessenger Helper – Zend Framework 2 Документация 2.3.1 – Zend Framework
Он также работает с TwitterBootstrap3, и есть альтернативная конфигурация для вашего module.config.php.