Portál AbcLinuxu, 4. června 2024 01:15

Zend framework V

18.4.2008 22:51 | Přečteno: 3099×

Zend framework - formuláře

Podstatná část dat, která uživatel předává serveru je předávána přes formulář, který uživatel vyplní a odešle na server. Tam je ověřeno, zda jsou data validní a případně zpracovány. Zend obsahuje třídu Zend_Form, která krom toho, že umožňuje vytvořit formulář a získat z něj data navíc umožňuje další věci, jako navěšení validátorů pro validaci obsahu, přidání filtrů a nebo obalení jednotlivých elementů formuláře HTML tagy. Toto vše ani nemusíme provádět v php kódu, celý formulář totiž můžeme definovat v konfiguračním souboru. Osobně ale nejvíce oceňuji právě možnost přidání validátorů, případně filtrů, na jednotlivé elementy, přičemž většina běžně používaných validátorů i filtrů je již v Zendu implementovaná.

Po vytvoření formuláře obvykle jako první nastavíme akci, která se provede při odeslání formuláře a metodu, jakou se budou předávat data:

  $form = new Zend_Form();
  $form->setAction('/zendTest/login/auth')
       ->setMethod('post');
Pomocí metody setAttrib('attribName','attribValue') můžeme formuláři nastavit jakýkoli další atribut. Elementy formuláře vytvoříme zavoláním metody createElement('elementType', 'elementName'). Na elementy formuláře pak můžeme navěsit validátory (a filtry):
  $login = $form->createElement('text', 'username');
  $login->addValidator('alnum')
        ->addValidator('stringLength', false, array(5))
	->setRequired(true)
		
  $passwd = $form->createElement('password', 'passwd');
  $passwd->addValidator('StringLength', false, array(5))
	 ->setRequired(true)
V tomto příkladě jsme vytvořili dva elementy formuláře, pole pro zadání uživatelského jména a pole pro zadání hesla. Obě políčka musí být vyplněná (setRequired(true)) a obsahovat minimálně pět znaků (addValidator('StringLength', false, array(5))). První parametr metody addValidator je jméno validátoru, druhý říká, zda má pokracovat vyhodnocování dalších validátorů, pokud podmínka aktuálního validátoru není splněná a poslední předává další parametry potřebné pro vyhodnocení. První validátor (alphanum) vyžaduje, jak již název napovídá, aby login uživatele obsahoval jen alfanumerické znaky. Filtry by se přidávaly obdobně:
  $login->addFilter('StringtoLower');
Seznam všech již naprogramovaných filtrů a validátorů naleznete v manuálu a pokud vám nebudou vyhovovat, můžete si napsat vlastní.

Na závěr oba prvky přidáme do formuláře (zatím jsme je jen vytvořili, ale nikoli přidali do formuláře) a přidáme ještě poslední element - tlačítko pro odeslání:

  $form->addElement($login)
       ->addElement($passwd)
       ->addElement('submit', 'login', array('label' => 'Login'));
Formulář pak předáme do view:
  $this->view->form = $form;
  $this->render('showform');
a ve view (showform.phtml) zobrazíme:
<?= $this->form ?>

Zda jsou data odeslaná přes formulář validní zjistíme zavoláním metody isValid():

$form->isValid($_POST)
Pokud ano, data z formuláře můžeme získat několika způsoby, např:
  $values = $form->getValues();
(a nebo třeba přímo z requestu: this->_request->getPost('username'))

Na závěr se ještě letmo zmíním o dekoratérech - prvcích, které elementy formuláře obalují HTML tagy. Opět platí, že si můžeme definovat vlastní. Pokud neučíme jinak, jsou k formuláři připojeny tyto čtyři dekoratéry:

Dekoratéry můžeme odstranit zavoláním metody removeDecorator('name') na daném elementu:
  $login->removeDecorator('Errors');

Celý kontroler pro přihlášení uživatele (zatím bez autentizace uživatele, jen odelání formuláře) by mohl vypadat takto (příklad je až na drobné úpravy celý převzatý z manuálu Zendu):

<?php
class LoginController extends Zend_Controller_Action
{
	public function getLoginForm(){
		$form = new Zend_Form();
		$form->setAction('/zendTest/login/auth')
		->setMethod('post');
		
		$login = $form->createElement('text', 'username');
		$login->addValidator('alnum')
		->addValidator('stringLength', false, array(5))
		->setRequired(true)
		->removeDecorator('Errors');

		$passwd = $form->createElement('password', 'passwd');
		$passwd->addValidator('StringLength', false, array(5))
		->setRequired(true)
		->removeDecorator('Errors');
		
		$form->addElement($login)
		->addElement($passwd)
		->addElement('submit', 'login', array('label' => 'Login'));
		return $form;
	}

	public function indexAction(){
		$this->view->form = $this->getLoginForm();
		$this->render('showform');
	}

	public function authAction(){
		if (!$this->getRequest()->isPost()) {
			return $this->_forward('index');
		}
		$form = $this->getLoginForm();
		if (!$form->isValid($_POST)) {
			$this->view->form = $form;
			return $this->render('showform');
		}
		// authentization 
		// ...
	}
}

       

Hodnocení: 75 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

Daniel Kvasnička ml. avatar 18.4.2008 23:42 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: Zend framework V
Odpovědět | Sbalit | Link | Blokovat | Admin
No vida, pred chvili jsem se prave rozhodl v jedne aplikaci pouzit Zend_Form misto formularoveho/validacniho reseni dodavaneho s Kohanou. Kazdopadne ale jen na tu validacni cast, markup si pisu rucne.
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
19.4.2008 09:50 changeit | Bratislava
Rozbalit Rozbalit vše Re: Zend framework V
ja som si napisal skript ktory parsuje html formular, a podla neho vytvori Zend_Form, takze v podstate pisem len markup a metodu na spracovanie hodnot z formu.
Daniel Kvasnička ml. avatar 19.4.2008 17:54 Daniel Kvasnička ml. | skóre: 52 | blog: The Joys and Sorrows of Being an IT Freak | Ostrava
Rozbalit Rozbalit vše Re: Zend framework V
A jak do toho markupu zaclenis veskere informace o validatorech a omezenich na jednotlivych polich tak, aby ten vygenerovany Zend_Form byl plnohodnotny? A jak resis znovunaplneni formu (texty, selecty, checkboxy) a vypisy validacnich chyb, kdyz mas ten formular jen v HTML? ...ja pouzivam pro templaty PHPTAL, takze me napada, ze by podobna vec sla docela zajimave resit pres XSLT. Ale uz jsem si integraci vyresil jinak.
FSF: “screw you for not wanting the stuff we produce”, People: “screw you for not producing the stuff we want."
20.4.2008 17:02 changeit | Bratislava
Rozbalit Rozbalit vše Re: Zend framework V
formular je v html ale ten nevykreslujem, vykreslujem len zend_form ktory som podla neho vytvoril. zatial som nejak validatory neriesil ale napr. aby to bola povinna hodnota staci elemntu pridat atribut required="true" a je to. Robene je to ako smarty block plugin.
19.4.2008 20:00 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
Rozbalit Rozbalit vše Re: Zend framework V
Odpovědět | Sbalit | Link | Blokovat | Admin
Ajťáci obvykle decorator do češtiny převádějí jako dekorátor, ovšem jednoduchý "test Googlem" dává dekoratérovi řádově větší váhu. Byl by někdo schopný argumentovat pro a proti dekorátoru a dekoratérovi ve smyslu návrhového vzoru Decorator?
Ještě na tom nejsem tak špatně, abych četl Viewegha.
19.4.2008 20:37 dementni.lojzik | skóre: 19 | blog: ze zivota na vsi
Rozbalit Rozbalit vše Re: Zend framework V
Heh, taky jsem psal dekorator, pak jsem to ale projel kontrolou pravopisu a ta mi dekorator opravovala na dekorater. Moc jsem to neresil a nechal dekorater. Ted jsem se na to zkousel podivat a vypada to, ze v cestine existuje pouze slovo dekorater, dekorator patrne bude anglicismus zatazeny sem ajtaky:-) Aspon podle www.pravidla.cz slovo dekoratér neexistuje. Stejne tak slovnik.cz dekorator neprelozi, ale dekorater prelozi mimo jine i jako decorator.
23.12.2008 11:23 noname sry
Rozbalit Rozbalit vše Re: Zend framework V
Odpovědět | Sbalit | Link | Blokovat | Admin

muzu se optat jakej je  rozdil, ve volani metody? diky

$this -> getLoginForm();

a

self::getLoginForm();

 

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.