Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] FlashMessanger nie przechowuje komunikatów.
Forum PHP.pl > Forum > PHP > Frameworki
droslaw
Chcę wykorzystać w swoim projekcie FlashMessanger. Kierując się ściśle dokumentacją nie ma z tym problemu, wszystko działa. Niestety dokumentacja zakłada że będę w każdym kontrolerze akcji pobierać wiadomości i przypisywać je do zmiennej w widoku. Żeby uniknąć niepotrzebnej roboty utworzyłem helpera widoku, który sam się tym zajmuje i może być wywołany w layoucie.

  1. class Droslaw_View_Helper_Messenger extends Zend_View_Helper_Abstract
  2. {
  3. public function messenger()
  4. {
  5. $messages = Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->getMessages();
  6. $text = '';
  7.  
  8. if(!empty($messages))
  9. {
  10. $text .= '<ul class="messages">';
  11. foreach($messages as $message)
  12. {
  13. $text .= '<li>'.$message.'</li>';
  14. }
  15.  
  16. $text .= '</ul>';
  17. }
  18.  
  19. return $text;
  20. }
  21. }


Problem powoduje ta linijka:
  1. Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->getMessages();

Po wywołaniu Zend_Controller_Action_HelperBroker::getStaticHelper wiadomości są usuwane z sesji. Kiedy pobieram wiadomości w kontrolerze i przypisuję do zmiennej widoku wszystko gra.

Pogrzebałem w źródłach FlashMessangera.
Jeśli dodam w jego kontrolerze linijkę:
  1. $this->addMessage('message');

wtedy wiadomość się wyświetla, w innym wypadku nie.
Byłoby miło gdyby ktoś znał rozwiązanie. Będę wdzięczny za pomoc.
Pozdrawiam.
nid3
Zrób tak:
Utwórz helper Message i dodaj go do listy helperów.:
  1. class Application_Helpers_Message extends Zend_View_Helper_Abstract {
  2.  
  3. public function message() {
  4. $html = '';
  5.  
  6. $flash_message = Zend_Controller_Action_HelperBroker::getStaticHelper('flashMessenger');
  7. if ($flash_message->hasMessages()) {
  8. $html = '<div class="message-box">';
  9. foreach ($flash_message->getMessages() as $message) {
  10.  
  11. $html .= $this->view->escape($message) ;
  12. }
  13. $html .='</div>';
  14. }
  15.  
  16.  
  17. return $html;
  18. }
  19.  
  20. }


Wywołuj go w pliku widoku. Ja np. mam go w layoucie
  1. <?php echo $this->message() ?>


Tworzysz gdzieś w parencie danej klasy, albo w samej klasie:
  1. $this->_redirector = Zend_Controller_Action_HelperBroker::getStaticHelper('Redirector');
  2. $this->_message = Zend_Controller_Action_HelperBroker::getStaticHelper('flashMessenger');


i zaraz przed wywołaniem redirect (helperem redirector):
  1. $this->_message->addMessage('Zapisano zmiany');
  2. $this->_redirector->gotoSimple('gdzies');


Samo redirect też powinno działać.

Pozdrawiam.
droslaw
Chodzi mi o to, że właśnie ten sposób powoduje problemy. Przy podejściu podanym w dokumentacji zenda to znaczy w kontrolerze:
  1. $flashMessenger = $this->_helper->getHelper('FlashMessenger');
  2. $flashMessenger->addMessage('message');
  3. $this->view->messages = $flashMessenger->getMessages();

aplikacja zachowuje się zgodnie z moimi oczekiwaniami i przy odświerzeniu strony zobaczę kominikat 'message'.
Ale kiedy stosuję helpera o którym pisałem w pierwszym poście, nie mam tego komunikatu.
Dodałem Zend_Debug::dump w różne miejsca kodu w tym do Zend_Controller_Action_Helper_FlashMessenger. Okazuje się, że kiedy wywołuję:
  1. Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger');

po odświeżeniu strony (i dopiero po odświeżeniu) w przestrzeni nazw sesji w której FlashMessenger przechowuje komunikaty nie ma żadnych danych.
Tak się dzieje zawsze kiedy dodam
  1. Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger');

poza kontrolerem (np. w Bootstrapie, a w kontrolerze mogę stosować go do woli);
Poza tym kiedy dodam komunikat w konstruktorze FlashMessengera - layout wyświetla mi go tak jak tego chcę:
  1. class Zend_Controller_Action_Helper_FlashMessenger extends Zend_Controller_Action_Helper_Abstract implements IteratorAggregate, Countable
  2. {
  3. // ...
  4. public function __construct()
  5. {
  6. if (!self::$_session instanceof Zend_Session_Namespace) {
  7. self::$_session = new Zend_Session_Namespace($this->getName());
  8. //Wyświetli pustą tablicę jeśli stosuję Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger'); poza kontrolerem.
  9. Zend_Debug::dump(self::$_session->{$this->_namespace});
  10. foreach (self::$_session as $namespace => $messages) {
  11. self::$_messages[$namespace] = $messages;
  12. unset(self::$_session->{$namespace});
  13. }
  14. }
  15. // To się nie tyczy wiadomości dodawanych w tym konstruktorze, poniższy komunikat nie zginie i zostanie wyświetlony zawsze.
  16. $this->addMessage('komunikat ');
  17. }
  18. //...
  19. }

Zend: 1.11.11
PHP: 5.3.3-1ubuntu9.7
melkorm
Controller:
  1. $flashMessenger = $this->_helper->getHelper('FlashMessenger');
  2. $flashMessenger->addMessage('message');


Helper:
  1. return implode(', ', Zend_Controller_Action_HelperBroker::getStaticHelper('FlashMessenger')->getMessages());


I działa bez problemu smile.gif Pamiętaj że dopiero po podwójnym odświeżeniu (dodanie wiadomość + 1 krok) lub odświeżeniu i przekierowaniu getMessages zwróci Tobie wiadomości.
droslaw
Dobra po kłopocie. Problem leżał w nieistniejącym pliku css snitch.gif . Przeglądarka wysyłała żądanie próbując pobrać style, apache nie znajdował pliku i przekierowywał żądanie do pliku index.php. W tym czasie były usuwane wiadomości.
Dzięki koledzy za fatygę.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.