Michal Buczek Wersja beta dokumentacji do mechanizmu walidacji formularza w vframe Od czego zacząć... najlepiej na początek zastanowić sie jaki filtr i/lub walidator chcemy nałożyć na nasze pole. Aby to zrobić musimy znać jakiś jego identyfikator. Obecnie mozemy walidować pola typu: $validators = array ( 'Digits' => 'digits', 'Int' => 'number', 'DateTime' => 'datetime',//tego jeszcze nie ma ale nidlugo bedzie 'Date' => 'date', 'EmailAddress' => 'email', 'NotEmpty' => 'required', 'AlfaNumSpace' => 'alfanumspace' Są to tylko walidatory, które oprócz wartości pola nie potrzebują żadnych dodatkowych parametrów do ich wywołania. Może ono nastąpić poprzez użycie ich nazwy. Pełną listę dostępnych filtrów i walidatorów można znaleźć w bibliotece Zend w katalogach Validate i Filter oraz bibliotece Veneo w analogicznych katalogach. Ale o tym pozniej. Talica pokazana powyżej obrazuje mapowanie nazw walidatorów od strony php na te używane w jquery.validator. Mechanizm mapowania znajduje sie w funckji smarty fieldvalidator, która ustawia odpowiednią klasę na podstawie konfiguracji zapisanej w modelu. Wygląda to następująco: <form class="form" id="formbasic" action="{zfurl id=$item->id" method="post"> <fieldset> <dl> <dt>id</dt> <dd>6<input type="hidden" id="wpr_id" name="wpr_id" value="{$item->id" />
<dt><label for="cnt_title">tytuł</label></dt> <dd><input class="field {fieldvalidator fields=$validators.wpr_title" type="text" id="wpr_title" name="wpr_title" value="{$item->title" /> <dt> </dt> <dd class="submit"> <input class="logout" id="formbasicsubmit" type="submit" value="zapisz" /> </dl> </fieldset> </form> {validateform id="formbasic" Funkcja validateform uruchamia jquery.validator, która na podstawie dołączonych klas waliduje pola w formularzu. id = id formularza. Użycie funkcji fieldvalidator: {fieldvalidator fields=$validators.wpr_title Parametrem jest tutaj tablica zdefiniowanych w modelu walidatorów dla danego pola (w tym przypadku wpr_title. Aby ją przekazać do tpl, w odpowiednim kontrolerze wywołujemy abstrakcyjna metode preparevalidation zdefiniowaną w każdym modelu: $this->view->validators = $modelvm->preparevalidation( w której znajduje sie konfiguracja naszych validatorów. Przykladowa metoda preparevalidation: public function preparevalidation(&$data = array( $vobject = null { $validators = array ( 'AlfaNumSpace', new Veneo_Validate_Unique( $this, 'nick', 'usr_email' => array (
'EmailAddress', new Veneo_Validate_Unique( $this, 'email', 'remember' => array ( 'allowempty' => true 'old_password' => array ( array( 'identical', (isset($vobject->password? $vobject->password : null 'usr_birthdate' => array ( 'allowempty' => true, 'Birthdate' return $validators; W taki oto sposób uzyskujemy dołączenie zdefiniowanych przez nas walidatorów do jquery.validator dla pól formularza... ale tylko tych przekazanych przez nazwe (wyjątkiem jest tutaj 'allowempty' => true jesli pole nie jest wymagane przypisujemy mu ten walidator aby podczas walidacji zostalo ono dołączone do pól, które poprawnie ją przeszly - getescaped( o tym pozniej Inne niestety są bardziej problematyczne i aby je poprawnie skonfigurować nie wystarczy tylko wpisać je do konfiguracji w modelu. I tak przykładowo dwa sposoby na zbadanie unikalności i identyczności pola po stronie jquery.validator: 1. Sprawdzenie unikalności danego pola: <dt><label for="cnt_date">email</label></dt> <dd> <input class="field {fieldvalidator fields=$validators.wpr_email" type="text" id="wpr_email" name="wpr_email" value="{$item->email" /> <a class="remote" name="wpr_email" rel="/whitepaper/index/checkemail/id/{$item->id" title="{#wpaper_uniq_email_alert#"></a>
Aby sprawdzać unikalność danego pola dopisujemy za tym polem link w którym ustawiamy class="remote" oznacza że tutaj będzie definicja skryptu który będzie sprawdzał unikalność danego pola w stylach ustawiamy tej klasie display: none name="wpr_email" oznacza nazwe pola które będziemy sprawdzać rel="/.." tutaj wpisujemy link do skryptu który będzie sprawdzał unikalność musi zwracać 1 lub 0 title="email jest już używany w systemie" tutaj wpisujemy komunikat błędu 2. Sprawdzenie identyczności pól: <dt><label for="cnt_date">email</label></dt> <dd> <input class="field {fieldvalidator fields=$validators.wpr_email" type="text" id="wpr_email" name="wpr_email" value="{$item->email" /> <dt><label for="cnt_date">reemail</label></dt> <dd> <input class="field required" type="text" id="re_email" name="re_email" value="" /> <a class="equalto" name="re_email" rel="wpr_email" title="{#wpaper_equalto_email_alert#"></a> Aby sprawdzić identyczność 2 pól dopisujemy za polem sprawdzającym link w którym ustawiamy: class="equalto" oznacza że tutaj będziemy porównywać pola name="re_email" oznacza nazwę pola sprawdzającego rel="wpr_email" oznacza nazwę pola sprawdzanego title="pola nie są identyczne " tutaj wpisujemy komunikat błędu Tutaj mała uwaga ponieważ zakładamy że walidujemy w JS w php nie trzeba sprawdzać czy te pola są identyczne po prostu bierzemy jako wartość do zapisu pierwszą z nich.
Dla przypomnienia: formularze w vframe w większości przypadków walidujemy i w JS i w PHP nie mniej jednak komunikaty o poprawności Pol wyświetlamy tylko za pomocą JQuery.validator natomiast w razie błędu walidacji w PHP wyświetlamy komunikat o błędnych danych. Zakładamy że jeżeli do PHP przychodzą błędne dane to po prostu ktoś coś kombinuje więc takiemu komuś nie należy się ładny komuniat co źle wrowadził; Do tej pory walidowalismy po stronie jquery... teraz php: Tak jak pisałem wczesniej - mamy sobie abstrakcyjna metode preparevalidation zdefiowaną w modelu z konfiguracją validatorów np: public function preparevalidation(&$data = array( $vobject = null { $validators = array ( 'AlfaNumSpace', new Veneo_Validate_Unique( $this, 'nick', 'usr_email' => array ( 'EmailAddress', new Veneo_Validate_Unique( $this, 'email', 'remember' => array ( 'allowempty' => true 'old_password' => array ( array( 'identical', (isset($vobject->password? $vobject->password : null 'usr_birthdate' => array ( 'allowempty' => true, 'Birthdate' return $validators; W niektórych przypadkach nie możemy ustawić walidatora tylko poprzez jego nazwę, musi on czasami dostac jakieś dodatkowe parametry (np. Sprawdzenie unikalnosci nicka czy maila wtedy inicjumeny bezposrednio dany walidator i dołączamy niezbedne parametry
Przyklad: new Veneo_Validate_Unique( $this, 'nick', $this wiadomo nick nazwa pola tożsama z nazwa metody w modelu ktora bedzie walidowac $vobject->id patrz nizej objasnienie $vobject Istnieje takze analogiczna metoda do definicji filtrów: public function getfilters( { $filters = array ( 'ReplaceMultipleWhitespaces' return $filters; z tym ze w jej przypadku zdefiniowane przez nas filtry sa mergowane z tymi, ktore zostały okreslone dla wszystkich defaultowo w Veneo_Model w metodzie validatedata(. W niektorych przypadkach moze istniec potrzeba wyłączenia tych ogólnych - w takim wypadku oprócz zdefiniowanych naszych wlasnych dopisujemy: '*' => array ( Pryklad zdefiniowania wlasnego filtra dla pola usr_nick i usunięcia dafaultowych: public function getfilters( { $filters = array ( '*' => array ( 'ReplaceMultipleWhitespaces' return $filters; Po wysłaniu formularza w odpowiednim kontrolerze dokonujemy walidacji np: $uservm = UserVM::get(
if($this->getrequest(->ispost( { $input = $uservm->validatedata( $this->getrequest(->getpost( if(!$input->isvalid( { $this->view->invalidfields = $input->getinvalid( else { $status = $uservm->save($input->getescaped( $this->_redirect(_domain.'/profile/auth/confirmregister/status/'. ((($status? self::action_added : self::action_negation.'_'.self::action_added Objasnienie mozliwie niejasnych pkt: Metoda validatedata( ustawia wszystkie zdefiniowane filtry i walidatory oraz inicjuje obiekt do walidacji. Parametry: validatedata($data, $vobject = null, $modified_validators = array( $data post lub get $vobject czasami zachodzi potrzeba przekazania dodatkowo obiektu, wzgledem ktorego ma nastapic dana walidacja np. aktualne haslo usera przy sprawdzeniu identycznosci teraz wpisanego lub gdy walidujemy unikalnosc maila przy jego edycji, a chcemy pominąc sprawdzanie naszego aktualnego itp $modified_validators czasami chcemy zmodyfikowac w konkretnym kontrolerze zdefiniowane przez nas walidatory w modelu i po to jest wlasnie ten parametr ; $input->isvalid( walidacja metoda zwraca true/false $input->getinvalid( zwraca pola ktore nie przeszly walidacji (ich walidatory zostaly zdefiniowane $input->getescaped( - zwraca pola ktore przeszly poprawnie walidacje Hmm, chyba wszystko ; Mam nadzieje ze w miare po polsku to napisalem W razie jakichkolwiek niejasnosci mozna spokojnie podejsc i sie zapytac... przyjmuje takze czeki ; pozdrawiam Michal Buczek