Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZF] Przesyłanie zmiennej między akcjami.
Forum PHP.pl > Forum > PHP > Frameworki
kodereq
Na początku zaznaczam, że będę stosował konwencję controller/model w celu uzyskania spójności wątku.

Problem wygląda następująco.

Jestem w index/index - user submituje formularz, który przenosi go do index/process jednocześnie wysyłając dane metodą POST. Teraz w index/process odbywa się validacja (Zend_Form + Zend_Validate). W wypadku udanej walidacji nie ma problemu, wyświetlam komunikat (za pomocą zmiennej widoku 'message'): "Dane zostały zapisane". Natomiast w wypadku niepowodzenia chciałbym przekierować na index/index - jednocześnie przekazując parametry post oraz zawartość zmiennej widoku 'message'. Co prawda, mógłbym to zrobić 'na pałę' - podpinając ten sam formularz pod index/process i po prostu wyświetlając go w widoku dla tej akcji, co jednak wydaje się lekko 'nie po Bożemu'. I tu właśnie rodzi się moje pytanie:

Jak płynnie przesyłać zmienne między akcjami jednego kontrolera ?


Moim celem jest ładna obługa formularzy, czyli formularz z index/index submituje na index/process, natomiast w wypadku nie przejścia walidacji wracamy do index/index i wyświetlamy komunikat + formularz do poprawy. Index/process odpowiada tylko za przetworzenie danych oraz wyświetlenie komunikatu powodzenia.

Może da się to zrobić bez przekierowań i ręcznego przesyłu zmiennych, może wystarczy pomajstrować przy Zend_Form + Zend_Validate?

Bardzo proszę o sugestie.
LBO
Zend_Controller_Action::_forward($action, $controller = null, $module = null, array $params = null)
viking
A nie możesz tego wszystkiego trzymać po prostu w index/index + własny routing + odpowiednie warunki dla widoku?
LBO
Jeżeli trzymasz w tym samym kontrolerze, to nie możesz wywołać czegoś w stylu:
  1. if (!$form->valid()) {
  2. return $this->indexAction();
  3. }


dr_bonzo
Cytat
Co prawda, mógłbym to zrobić 'na pałę' - podpinając ten sam formularz pod index/process i po prostu wyświetlając go w widoku dla tej akcji, co jednak wydaje się lekko 'nie po Bożemu'. I tu właśnie rodzi się moje pytanie:


Ja sie z tym nie zgodze, ja (i np. Rails'y) robia tak jak piszesz, po wyslaniu blednego formularza, podpinasz ten sam tpl i wypelniasz go przeslanymi danymi.
To tylko (zapewne) jedna linijka, wiec o duplikacji kodu nie ma raczej mowy smile.gif
kodereq
Dzięki, @dr_bonzo. Powiedzcie jeszcze jak ustawić, aby akcja process korzystała domyślnie z index.phtml, a nie z process.phtml
pgrzelka
Cytat(kodereq @ 27.09.2009, 18:13:52 ) *
Dzięki, @dr_bonzo. Powiedzcie jeszcze jak ustawić, aby akcja process korzystała domyślnie z index.phtml, a nie z process.phtml


http://framework.zend.com/manual/en/zend.c...rs.viewrenderer

choć uważam że trochę źle to robisz winksmiley.jpg
moja przykładowa akcja dodawania jakiegoś rekordu
  1. public function addAction()
  2. {
  3. $this->_helper->viewRenderer->setNoRender();
  4.  
  5. // tu mamy formularz
  6. $form = new Admin_Form_Menu();
  7.  
  8. if ($this->_request->isPost() && $form->isValid($_POST))
  9. {
  10. $model = new Admin_Model_Navigation();
  11. $model -> savemenu($form->getValues());
  12. $this->_redirect (
  13. $this->view->url ( array( 'action'=>'index' ) ),
  14. $this->__('Menu dodane'),
  15. 'infomsg'
  16. );
  17. }
  18. else
  19. {
  20. echo $form;
  21. }
  22.  
  23. }
kodereq
Zrobiłem coś takiego:

  1. protected $_flashMessenger = NULL;
  2. function indexAction()
  3. {
  4. (...)
  5.  
  6. if($messages = $this->_flashMessenger->getMessages()) {
  7. $this->view->message = $messages[0]['messageContent'];
  8. }
  9. }


  1. function processAction()
  2. {
  3. (...)
  4. $this->_helper->viewRenderer->setNoRender();
  5. $this->_flashMessenger->addMessage(array('messageContent' => "Message content."));
  6. $this->_redirect('index/index');
  7. }
  8.  


Trochę pisania, ale jak ładnie? Nieprawdaż?

P.S.
Zaraz poklikam "POMÓGŁ".
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.