2013-12-04 2 views
3

У меня есть страница с несколькими разделами с формами, которые отправляются с той же страницы. Формы сворачиваются, чтобы сэкономить место, но я хочу условно держать их открытыми, если есть ошибка при представлении.CakePHP: Проверьте, установлено ли сообщение SPECIFIC flash

В мой контроллер, я установил своеобразный «ключ» (см location_key ниже) для каждой формы, что позволяет мне повторить их в соответствующих местах:

В контроллере:

$this->Session->setFlash('You missed something...', 'element_name', array('class'=>'error'), 'location_key'); 

В вид:

$this->Session->flash('location_key') 

Я пытаюсь понять, как проверить, если $this->Session->flash('location_key') существует. Если я делаю это работает, но сбрасывает вспышки сообщение:

if ($this->Session->flash('location_key')) // = TRUE 
    //Do something 
$this->Session->flash('location_key') // = FALSE (because it just got called) 

Как я могу проверить на наличие этого флэш-сообщения, не заставляя его уйти?

+0

Вы пробовали использовать http://book.cakephp.org/2.0/en/core-libraries/components/sessions.html#SessionComponent::check? –

+0

@MartinBean Я пытаюсь сделать это с помощью 'SessionComponent :: check()' и 'SessionComponent :: read()', но так падают, что все они возвращают false, потому что я не уверен, каким должен быть параметр. – emersonthis

ответ

6

Фигурные его ! Это работает:

$this->Session->check('Message.location_key') 

Он возвращает true/false в зависимости от наличия таких флэш-сообщений. ->read() делает то же самое, но возвращает данные флэш-памяти, если есть (любой и, самое главное, он покидает сессию var, чтобы ее можно было повторить позже).

2

Быстрые сообщения (сюрприз) stored in the session:

public function setFlash($message, $element = 'default', $params = array(), $key = 'flash') { 
    CakeSession::write('Message.' . $key, compact('message', 'element', 'params')); 
} 

Чтобы проверить наличие сообщения вспышки, тест для эквивалентного ключа в сессии, например:

if (CakeSession::check('Message.location_key')) { 
    ... 
} 
+0

Woops! Я написал в то же время ... Спасибо! – emersonthis

+0

Cool - вы нашли решение =). – AD7six

1

Ну, согласно the api, SessionHelper возвращает строку (со вспышкой и элементом), когда вы делаете $this->Session->flash('location_key'), так почему бы не сохранить эту строку в переменной?

$myFlash = $this->Session->flash('location_key'); 
if ($myFlash) 
    /*etc*/ 

echo $myFlash; 
+0

Это будет работать, но может быть неуместным и означает, что _checking_ для установленного флэш-сообщения постоянно изменяет сеанс. – AD7six

+1

Правда. Я просто разместил другое решение от тех, которые уже были отправлены для тех, кому может не нравиться статическая строка ('' Message. "'), Поступающая непосредственно из cake lib (которая может или не может измениться в будущем). Но я согласен с вами, ваше решение «проверяет» и мои «магазины», и в этом случае проверка лучше. – Nunser

Смежные вопросы