Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [symfony] Przesłanie danych metodą POST z Action do Aciton
Forum PHP.pl > Forum > PHP > Frameworki
kaniagandzowski
Witam

Mam Symfony 1.1 i problem z przesłaniem danych pochodzących z formularza do następnej Akcji.
Mianowicie, gdy formularz jest submitowany to wywołuje stronę www.sss.pl/submit na której dane przechodzą walidacje i gdy przejdą chce przekazać na inną strone te dane z formularza poprzez POST

Ale nie wiem jak w symfony zrobić aby mógł przekazać dalej dane pochodzące z formularza z jednej akcji do następnej akcji (z strony www.sss.pl/submit do www.sss.pl/finish).



Kod ten
  1. <?php
  2. $this->objForm->getValues()
  3. ?>
zwraca dane z formularza w postaci array i te dane bym chciał przekazać na inna stronę (inna akcje) przez POST.

Symfony posiada możliwość pojedyncze dodawanie wartości
  1. <?php
  2. $this->getRequest()->setParameter($name, $value);
  3. ?>

ale ja posiadam tablice z wartościami i nie chce sie bawic w reczne dodawanie tylko chce cała tablice przekazać i naj lepiej przez metody symfony ale szukałem i nie znalazłem jakoś sad.gif

Kod poniższy prześle dane przez GET a ja chce przez POST

  1. <?php
  2. public function executeIndex($request)
  3. {
  4. $this->objForm = new GeneratorForm( );
  5. $this->objForm->setUslugiOpcje( $this->getDane_Lokal() );
  6.  
  7. if ( $this->getRequest()->isMethod('post') )
  8. {
  9. $this->objForm->bind( $this->getRequest()->getParameter('contact'), $request->getFiles('contact') );
  10. if ( $this->objForm->isValid() )
  11. { 
  12. $this->dispatcher =  $this->objForm->getValues();
  13.  $this->redirect('test/finish?'.http_build_query( $this->objForm->getValues() ),'post=true');
  14. }
  15. }
  16. echo '<pre>';
  17.  // print_r ($this->objForm->getErrorSchema()->getErrors() );
  18. foreach ($this->objForm->getErrorSchema() as $sError) { 
  19. echo '<li>'.($sError).'</li>';}
  20.  
  21. echo '</pre>';
  22. }
  23. ?>


Ten kod poprostu przekazuje dane z formularza poprzez GET


http://localhost/sss/web/frontend_dev.php/...odstawoe//opis/
yankes
zamiast $this->redirect uzyj $this->forward('nazwa_modulu', 'nazwa_akcji');
kaniagandzowski
Cytat(yankes @ 1.08.2008, 02:41:06 ) *
zamiast $this->redirect uzyj $this->forward('nazwa_modulu', 'nazwa_akcji');


Te polecenie ma podobne działanie do
  1. <?php
  2. $this->redirect('nazwa_modulu', 'nazwa_akcji');
  3. ?>

tylko że tamto polecenie przenosi do inne akcji nie zmieniając adresu strony. A z przekazanie parametrów do innej akcji to już nie bardzo wiem jak to zrobić abym przekazał tą tablice danych z formularza, z której później w innej akcji mógł sobie normalnie pobrać te dane z formularza w ten oto sposób
  1. <?php
  2. $this->getRequest()->getParameter('imie');
  3. ?>
mike
Cytat(kaniagandzowski @ 1.08.2008, 09:15:48 ) *
Te polecenie ma podobne działanie do
  1. <?php
  2. $this->redirect('nazwa_modulu', 'nazwa_akcji');
  3. ?>

tylko że tamto polecenie przenosi do inne akcji nie zmieniając adresu strony.
No właśnie nie chodzi to o zmianę adresu strony bo nie to jest istotą działania forward().
forward() powoduje przekazanie tego samego żądania do innej akcji, dzięki czemu nadal masz dostęp do parametrów żądania i możesz je sobie wydobyć.
redirect() powoduje przekierowanie do innej akcji tworząc kolejne żądanie do aplikacji, dlatego po redirect() nie masz dostępu do żądania, które Cie interesuje.

Poza tym pamiętaj że symfony posiada coś takiego jak pamięć Flash, w której możesz umieścić parametry widoczne w jednym żądaniu po redirect() Taka pamięć tymczasowa na potrzeby kolejnego żądania.
kaniagandzowski
No tego nie wiedziałem.

Ale jest problem tego typu gdy użytkownik odświeży stronę to znowu pojawi się formularz a nie strona wyświetlana po przesłaniu danych z formularza (strona wyświetlająca dane z formularza). Takie zachowanie z kilku względów jest nie pożądane dla mnie.

Wiem że w symfony jest zmienne (flash), która służy do jednego razowego użycia ale nie podoba mi się to szczerze.

Kurna szukałem w symfony dokumentacji API ale nic nie znalazłem. Bardzo bym chciał żeby jednak była możliwość przeniesienie tych danych z formularza na inna stronę (inna akcje), której póżniej bym mógł te dane wydobywać tak jak na poprzedniej stronie tzn.
  1. <?php
  2. $this->getRequest()->getParameter('imie');
  3. ?>


W sumie symfony ma możliwość pojedyczo przesyłania danych
  1. <?php
  2. $this->getRequest()->setParameter($name, $value);
  3. ?>

Ale nie znalazłem metody której bym mógł przekazać tablice z wartościami abym sie nie musiał bawić w jakieś ręczne dodawanie.
mike
Cytat(kaniagandzowski @ 1.08.2008, 11:58:04 ) *
Wiem że w symfony jest zmienne (flash), która służy do jednego razowego użycia ale nie podoba mi się to szczerze.
No to już Twój problem. Mechanizm flash został stworzony do tego czego własnie potrzebujesz.
Podobne rzeczy są również w innych framwerokach. Jesli Ci się nie podoba to kombinuj dalej, nie rozumie tylko dlaczego odrzucasz dedykowane do tego rozwiązanie.
destroyerr
Obiekt request jest tworzony tylko i wyłącznie na jedno żądanie. Jeśli w akcji submit ustawisz sobie jakiekolwiek parametry dla requestu i następnie zrobisz przekierowanie, to jest to całkiem nowe żądanie i nowy obiekt request, więc dane w żaden sposób się nie przeniosą. Nie jest to brak sf, bo nie da się tego zrobić (chyba, że o czymś nie wiem).
Sposób, który podał mike jest rozwiązaniem Twojego problemu.

Jeśli chodzi o wpisanie wszystkich wartości z formularza do requestu to:
  1. <?php
  2. $request->getParameterHolder()->add($form->getValues());
  3. ?>
kaniagandzowski
Dziękuję za pomoc.

Co do Mechanizmu flash to może jest stosowany ale dlaczego nie zastosowali to w przykładzie podanej na stronie symfony (http://www.symfony-project.org/snippets/snippet/305 ) jeśli lepsze jest flash zastosować.

W każdym razie nie mam doświadczenia w pisaniu programów na tyle żeby wiedzieć o takich sprawach. Ale to już nie ważne i zrobię to jak podał mike
destroyerr
Nie zastosowali ponieważ oni nie przesyłają tam danych z formularza do innej strony.
kaniagandzowski
Pokręciłem z przykładem. Chodziło o ten przykład Kurs tworzenia formularza w Symfony 1.1 w punkcie 2.3 (Listing 2-3 - Implementing Validation in the contact Module)
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.