Newsgroup: it.comp.www.php
Titolo: Zend_Form e validazione modulo

Sto provando ad usare Zend Framework senza l'MVC, cioè richiamo le 
librerie che mi servono quando mi servono, dove mi servono (in realtà 
uso l'autoloader).
Sono arrivato all'inizio, cioè al modulo di login della mia 
applicazione. Con Zend_Form_Element definisco i campi username, password 
e submit, con i relativi criteri di validazione e il tutto funziona.
Ora dovrei validare non i singoli campi di input ma l'intero modulo 
ovvero verificare che l'utente username esista nel DB con la password 
corretta.
San Google e il sito di Zend Framework fanno esempi usando MVC.
E senza MVC?
Questo è il mio codice:
$view = new Zend_View;
$form = new Zend_Form;
$form
->setAction($_SERVER['PHP_SELF'])
->setMethod('post')
->setElementFilters(array('StringTrim'))
;
$form->addElement('text','username');
$form->username
->addValidator('alnum')
->addValidator('regex', false, array('/^[a-z]+/'))
->addValidator('stringLength', false, array(6, 20))
->setRequired(true)
->addFilter('StringToLower')
->setLabel('Nome utente')
;
$form->addElement('password','pass');
$form->pass
->addValidator('StringLength', false, array(6))
->setRequired(true)
->setLabel('Password')
;
$form->addElement('submit','submit');
$form->submit->setLabel("Entra");
if($form->isValid($_POST)) {
	echo 'form valido!';
} else {
	$form->populate($_POST);
}
echo $form->render($view);
?>

 MVC?
Senza MVC e` la stessa cosa. :)
Quello che fai e` corretto. Nel ramo if(isValid) prendi i valori del form 
e fai la query al DB per verificare che siano corretti.
Non lo fa il form per conto tuo, devi farlo manualmente.
Per prendere i vlaori puoi usare $form->getValues() o prenderli 
direttamente dai campi con $form->username->getValue()
Vado a memoria, quindi controlla se le funzioni sono quelle giuste.
Bye.

 Bye.
Grazie

 esistente". Dove? Come?
Puoi appunto usare addError(s) (anche sul form, non solo sui singoli 
elementi) oppure stampare l'html che vuoi prima o dopo il form
 
Bye.

 Bye.


Mi rispondo da solo:
$form->setDecorators(array(
'Errors',
'FormElements',
array('HtmlTag', array('tag' => 'table')),
'Form'
));
Non ho ancora studiato/capito i decorators. A quanto pare l'ordine è 
importante.
Grazie per il sempre valido e utile aiuto, a me e agli altri.
Gabriele


 soluzioni già suggerite?
come hai gia` visto, dipende dall'ordine in cui li definisci.
Io uso qualcosa del genere:
$form
 ->addDecorator('FormElements')
 ->addDecorator('Fieldset')
 ->addDecorator('FormErrors', array( 'placement' => 
Zend_Form_Decorator_Abstract::PREPEND ) )
 ->addDecorator('Form')
;
 
a cui aggiungo anche, se hai intenzione di creare gruppi:
$form
 ->setDisplayGroupDecorators(array(
  'FormElements',
  'Fieldset',
  new Zend_Form_Decorator_HtmlTag(array('tag' => 'div', 'class' => 
'form_row'))
 )
);
(io li preferisco non tabellari ;)
Attento a impostare i decoratori per gli elementi, perche` alcuni ne 
vogliono di particolari. Per esempio l'elemento File vuole il decoratore 
File, e l'elemento Image vuole il decoratore Image.
Io mi sono praticamente ricreato la struttura degli Element di Zend (in 
buona parte estendendoli, ma in alcuni casi scrivendoli da zero), 
aggiungendone anche di miei, tipo Imagefile che e` un File ma con la 
preview dell'immagine gia` caricata.
Forse l'ho gia` scritto una decina di volte, ma repetita iuvant: trovo un 
po' assurda l'implementazione di Zend_Form. Buona l'idea sotto, ma mi 
pare un po' troppo complesso.
Bye.

 Bye.