Использование FlashMessenger с PartialLoop в сценариях представления ZF

У меня есть два вопроса, связанных с помощником представления FlashMessenger. Оба вопроса должны сделать этот код:

Мой метод действия:

private $_messages; // set to $this->_helper->FlashMessenger; in init()

public function loginAction() {
    // > login validation <

    // Switch based on the result code
    switch ($result->getCode()) {
        // > snip several cases <

        case Zend_Auth_Result::FAILURE_CREDENTIAL_INVALID:
            $this->_messages->addMessage("That wasn't the right password."); 
        break;

        case Zend_Auth_Result::SUCCESS:
            $this->_messages->addMessage('Logged you in successfully. Welcome back!');
            $this->_helper->Redirector('index', 'home');
        break;
    }

    // >snip<

    $this->view->messages = $this->_messages->getMessages();
    $this->render();
}

Сценарий просмотра моего макета (Zend_Layout):

<?php if (isset($this->messages) && count($this->messages) > 0) {
    print_r($this->messages);
    //$this->partialLoop('partials/messages.phtml', $this->messages);
} ?>

Почему сообщение не выводится при первой установке?

У меня есть ощущение, что это связано с тем, что мессенджер хранится в сеансах, но я уверен, что это связано с моей реализацией.

Когда я отправляю неверное значение в свою форму, я не получаю сообщения, пока не отправлю форму снова или не обновлю ее.

Как отправить это помощнику PartialLoop?

Вывод мессенджера примерно такой:

Array(
    [0] => 'Message',
    [1] => 'Second message' //etc.
)

Но это не годится для PartialLoop, так как мне нужно получить сообщение (которое требует, чтобы каждое сообщение было массивом, содержащим пару ключ/значение 'message' => 'Message string').

Есть ли лучший метод вместо перезаписи массива перед его отправкой в ​​представление?


person Ross    schedule 04.02.2009    source источник


Ответы (2)


Ссылаясь на OIS, я хотел бы добавьте, что вы можете получить флэш-сообщения в том же запросе, в котором они были добавлены в FlashMessenger. В этом случае вам придется использовать Zend_Controller_Action_Helper_FlashMessenger::getCurrentMessages().

В вашем случае вам придется изменить строку

$this->view->messages = $this->_messages->getMessages();

to

$this->view->messages = $this->_messages->getCurrentMessages();

Надеюсь, это поможет.

person Stefan Gehrig    schedule 05.02.2009

Я процитирую документацию.

10.8.4.4.1. Введение

Помощник FlashMessenger позволяет передавать сообщения, которые могут потребоваться пользователю при следующем запросе. Для этого FlashMessenger использует Zend_Session_Namespace для хранения сообщений для будущего или следующего запроса.

По сути, это означает, что да, вам нужно обновить страницу, чтобы увидеть сообщения.

Изменить для PartialLoop:

Вы можете попробовать это:

foreach ($array as $message) {
  $newArray[]['message'] = $message;
}

Но вам не обязательно использовать PartialLoop. Вы можете отправить его в Partial и зациклить там. Или даже зациклить его прямо там, в вашем представлении.

person OIS    schedule 04.02.2009