Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework] problem z widokiem formularza w layout
Forum PHP.pl > Forum > PHP > Frameworki
csharp
nie mogę tego za bardzo obczaić.. w jaki sposób wyświetlić formularz w layout w innym kontrolerze?

np. tworzę obiekt formularza w init w kontrolerze index:

  1. $this->view->formNewsletter = new Application_Form_Newsletter();


wyświetlam go w najprostszy sposób w index/index:

  1. <form>
  2. <?php echo trim($this->formNewsletter->email)."\n" ?>
  3. <?php echo trim($this->formNewsletter->submit_newsletter)."\n" ?>
  4. </form>


no ale jak wyświetlam inny kontroler np. do rejestracji usera (np. auth/register) to formularz nie jest widoczny. W jaki sposób odwołać się do obiektu z kontrolera kontrolera auth/register skoro jest on stworzony w init kontrolera index?
droslaw
A form in your layout
ShadowD
Przemyśl użycie helpera layoutu i w nim umieść form'a, skoro nie wywołujesz kontrolera index jego metody init, anie żadne inne nie zostaną wykonane, albo kopiujesz kod wszędzie (do każdego kontrolera) lub tworzysz go w layout (helper layout).
csharp
dzięki wielkie,

jeszcze pytanie trochę z innej beczki.
Mam formularz logowania i walidacje, filtry - form action ustawiony jest na index/login - zrzut niżej.
Niestety, podczas sprawdzania danych zawsze przekierowuje usera do widoku index/login, który korzysta z widoku index/index, jak zrobić aby zostawiał usera w tym samym miejscu, w którym jest? sam formularz umieszczony jest w widoku layout.


  1. public function loginAction()
  2. {
  3. Zend_Db_Table_Abstract::setDefaultAdapter('db1');
  4.  
  5. $this->_helper->viewRenderer('index');
  6. $form = new Application_Form_Login();
  7. if ($form->isValid($this->getRequest()->getPost())) {
  8.  
  9. $adapter = new Zend_Auth_Adapter_DbTable(
  10. null,
  11. 'user',
  12. 'username',
  13. 'password',
  14. 'SHA1(CONCAT(?, salt))'
  15. );
  16.  
  17. $adapter->setIdentity($form->getValue('username'));
  18. $adapter->setCredential($form->getValue('password'));
  19.  
  20. $auth = Zend_Auth::getInstance();
  21.  
  22. $result = $auth->authenticate($adapter);
  23.  
  24.  
  25. if ($result->isValid()) {
  26.  
  27. }
  28. $form->password->addError('Błędna próba logowania!');
  29. }
  30. $this->view->formLogin = $form;
  31. }
droslaw
Jeśli tworzysz obiekt formularza w helperze, daj tam $form->setAction('#').
csharp
no właśnie nie za bardzo to działa...

obiekt tworzę w kontrolerze index i funkcji init

  1. $this->view->formLogin = new Application_Form_Login();


w momencie gdy w forms/Login.php ustawie
  1. $this->setAction('#');
wtedy w ogóle nie załawie tek akcji index/login

w taki sposób zaczynam budowę formularza:

  1. $this->setMethod('post');
  2.  
  3. $view = Zend_Layout::getMvcInstance()->getView();
  4. $url = $view->url(array(
  5. 'controller' => 'index', 'action' => 'login'
  6. ), 'default', true
  7. );
  8.  
  9. $this->setAction($url);
droslaw
To znaczy co chcesz zrobić? Wyświetlić formularz logowania w layoucie tak, żeby użytkowinik nie musiał przechodzić przez akcję login?
To znaczy jest np. w akcji /news/read/id/123, formularz jest wyświetlony w layoucie więc go widzi -> loguje się -> dalej pozostaje w akcji /news/read. Tak?
csharp
dokładnie, o to chodzi.

w tej chwili jest tak, że user jest: index/cos/cos loguj się i przechodzi do index/login a chce aby został w index/cos/cos
droslaw
Formularz logowania robisz tak samo jak newslettera. Pamiętaj, żeby sprawdzać, do którego formularza przychodzą dane POST. Tak jak było to opisane w linku, który podałem w moim pierwszym poście.
Inna opcja jest taka, że formularz kieruje użytkownika do index/login, a potem przekierowujesz go do poprzedniej lokacji.
Ja bym wybrał to drugie rozwiązanie.
csharp
i właśnie tu potrzebuje pomocy:) jak przekierować do poprzedniej lokalizacji?
droslaw
Najlepszym wyjściem będzie chyba zapisanie aktualnej lokalizacji w ukrytym polu formularza przed jego wysłaniem.
Nie można skorzystać nagłówka HTTP_REFERER w tym wypadku, bo jeśli nie uda się zalogować za pierwszym razem, po kolejnym wysłaniu danych, będzie tam adres index/login.
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.