Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [ZendFramework]Uzupełnenie Zend_Form po nieudanej walidacji
Forum PHP.pl > Forum > PHP > Frameworki
szparag33
Witam

Chciałbym zrobić w formularzu Zend_Form tak, żeby po nieudanej walidacji formularza, jego pola uzupełniały się podanymi danymi...

Aktualnie po nieudanej walidacji wyskakuje błąd odnośnie walidacji oraz otwiera się formularz - ale nie wypełniony danymi tylko z pustymi polami.


  1. <?php
  2. class Admin_KontaUzytkownikowController extends BaseController {
  3.  
  4.     public function indexAction() {
  5.        $this->render('konta-uzytkownikow', null, true);
  6.    }
  7.  
  8.  
  9.    public function formAction() {
  10.              
  11.        $form = $this->getForm();
  12.  
  13.        $this->view->form = $form;
  14.  
  15.        $this->render('konta-uzytkownikow-form', null, true);
  16.    }
  17.  
  18.  
  19.    public function zapiszAction() {
  20.  
  21.        if(!$this->_request->isPost()) {
  22.            return $this->redirectToController('konta-uzytkownikow/form');
  23.        }
  24.  
  25.        if(!$this->validateForm($this->getForm(), $_POST)) {    
  26.            return $this->redirectToController('konta-uzytkownikow/form');
  27.        }
  28.        
  29.        // Walidacja poprawna - wykonywanie poniżej operacji na danych...
  30.    
  31.    }
  32.  
  33.  
  34.   private function getForm() {
  35.        
  36.        $form = new Zend_Form();
  37.    
  38.        $form->setAction($this->_request->getBaseUrl() . '/'
  39.                        . $this->_request->getControllerName() . '/zapisz')->setMethod('post');
  40.  
  41.        $element_email = $form->createElement('text', 'email', array('class' => 'text'));
  42.        $element_email->addValidator('EmailAddress')
  43.              ->setRequired(true)
  44.                ->addFilter('StringToLower')
  45.              ->addFilter('StringTrim')
  46.              ->setLabel('E-mail');
  47.              
  48.        
  49.        $element_opis = $form->createElement('text', 'opis', array('class' => 'text'));
  50.        $element_opis->setRequired(true)
  51.              ->addFilter('StringTrim')
  52.              ->setLabel('Opis konta użytkownika');
  53.        
  54.    
  55.        $element_submit = $form->createElement('button', 'ZAPISZ', array('type' => 'submit', 'class' => 'button'));
  56.        $form->addElement( $element_email )->addElement( $element_opis )->addElement( $element_submit );
  57.        return $form;
  58.   }
  59.  
  60.  
  61. }
  62. ?>

Jaki jest najlepszy sposób na uzupełnienie pól formularza po nieudanej walidacji ?

Szkoda, że przekierowaniu do kontrolera/akcji, które występuje w zapiszAction w otworzonej akcji budującej formularz nie mogę już dostać się do danych z tablicy _POST, czyli tych, które wypełniono w formularzu...

Napewno jest jakieś proste i sprawdzone rozwiązanie, proszę o pomoc.
batman
W telegraficznym skrócie wygląda to tak:
  1. <?php
  2. $formData = $this->_request->getPost();
  3. $form->populate($formData);
  4. ?>

Jeśli nie do końca to rozumiesz, to w dokumentacji znajdziesz więcej informacji.
szparag33
A w którym miejcu (akcji) tego użyć ?
batman
Nie wiem, w którym miejscu u Ciebie to wstawić, jakoś dziwnie to podzieliłeś. U mnie wygląda to tak:
  1. <?php
  2. public function akcjaAction() {
  3.    $form = $this->getForm();
  4.    $formData = array();
  5.    if($this->_request->isPost()) {
  6.        $formData = $this->_request->getPost();
  7.        if($form->isValid($formData)) {
  8.            $filteredData = $form->getValues();
  9.            // zapisanie danych
  10.            // przekierowanie
  11.        }
  12.    }
  13.    else {
  14.        // domyslne dane w przypadku edycji
  15.        $formData = $tab;
  16.    }
  17.    $form->populate($formData);
  18. }
  19. ?>
szparag33
Faktycznie, przy moim układzie akcji nie za bardzo wiem gdzie tego użyć.

@batman, a możesz mi wkleić taką przykładową klasę kontrolera, która generuje taki formularz itp...

Jakiś prosty przykład całego kontrolera...

Niestety już się sporo naszukał nad rozwiązaniem tego problemu a te dziwne ułożenie w moim kontrolerze to dostosowany przerobiony przykład z jednej z tutoriali...
batman
Tak to mniej więcej wygląda.
  1. <?php
  2. class ExampleController extends Zend_Controller_Action {
  3.    public function indexAction() {
  4.        // kod
  5.    }
  6.    
  7.    public function listAction() {
  8.        // kod
  9.    }
  10.    
  11.    public function editAction() {
  12.        $form = $this->getForm();
  13.        $formData = array();
  14.        if($this->_request->isPost()) {
  15.            $formData = $this->_request->getPost();
  16.            if($form->isValid($formData)) {
  17.                $filteredData = $form->getValues();
  18.                // zapisanie danych
  19.                // przekierowanie
  20.            }
  21.        }
  22.        else {
  23.            // domyslne dane w przypadku edycji
  24.            $formData = $tab;
  25.        }
  26.        $form->populate($formData);
  27.    }
  28. }
  29. ?>


A tutaj masz fajny przykład jak robić formularze, by nie trzymać kodu w kontrolerze.
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.