Accueil > Zend Framework > Formulaires, fichiers de configuration et traitement sous Zend Framework

Formulaires, fichiers de configuration et traitement sous Zend Framework

Le chapitre de la documentation du Zend Framework traitant du composant Zend_Form est intéressant, mais reste incomplet quant à l’utilisation des fichiers de configuration (.ini) pour l’initialisation des formulaires.
Nous allons donc dans un premier temps approfondir ce premier point (initialisation d’un formulaire avec un fichier de configuration), puis nous chercherons à aller plus loin dans l’utilisation et la configuration des formulaires.

Rappels

Zend_Form

Le composant Zend_Form permet de créer et de valider un formulaire, en maîtrisant de bout en bout la chaîne de traitement.
La syntaxe de base est on ne peut plus simple :

$form = new Zend_Form() ;

Ajouter un élément au formulaire est tout aussi rapide :

$form->addElement(new Zend_Form_Element_Text('login'));

Mais configurer de part en part un formulaire peut vite s’avérer long et fastidieux, selon le nombre de champs à insérer, les validateurs et filtres mis en place, et selon le nombre de formulaires que comporte votre application.
Il est cependant possible de simplifier la mise en place de formulaires et de rendre cette opération sinon ludique, tout au moins moins fastidieuse, en faisant appel au composant Zend_Config_Ini.
Cette méthode vous permettra également de modifier vos formulaires plus rapidement, et oblige à une réflexion et à une rationalisation du processus de création des formulaires.

Zend_Config_Ini

Le composant Zend_Config_Ini permet de stocker des informations sous forme de fichier texte et d’y accéder en tant qu’objet. Pour apprendre à manipuler ce composant, vous vous réfèrerez au guide de référence du framework, à la page dédiée au composant Zend_Config_Ini.

Le fichier de configuration

Nous commencerons par configurer le formulaire :

action = "module/controller/action/"
method = "post"
; Si besoin est (téléchargement de fichiers par exemple)
enctype = "multipart/form-data"

Pour chaque élément, nous créerons une entrée elements :

elements.

Où nous indiquerons le nom (balises name) :

elements.nom

Puis le type d’élément :

elements.nom.type = text

Nous retrouvons ici les types classiques d’un champ de formulaire : input, select, textarea, radio, checkbox…
Une fois ces informations données, nous pourrons enrichir notre élément en lui ajoutant des options : filtres, validateurs, classe, attributs… :

elements.nom.options.

Voici une liste (non exhaustive) des options possibles :

; required
[...].validators.required.validator = "NotEmpty"
[...].validators.required.breakChainOnFailure = true
; strlen
[...].options.validators.strlen.validator = "StringLength"
[...].options.validators.strlen.options.min = 3
[...].options.validators.strlen.options.max = 9
; alnum
[...].options.validators.alnum.validator = "Alnum"
;select / multiselect / radio  elements
[...].options.multioptions.val1 = "valeur 1"
[...].options.multioptions.val2 = "valeur 2"
; en vrac
[...].options.class = class_name
[...].options.id = id_name
[...].options.label = "Code Postal :"
[...].options.onclick = "javascript:alert('click!');"
[...].options.filters.lower.filter = "StringToLower"

Pour finir, en fin de formulaire, nous ajouterons nos boutons submit et reset :

elements.envoyer.type = submit
elements.effacer.type = reset

Vous noterez que pour ces deux éléments il n’est pas besoin de préciser l’option value, le nom de l’élément sert de value dans le formulaire.

Cas particulier : la balise input type="image"...

Le type image est une variante du type submit. Pour en spécifier les attributs src et éventuellement alt, nous procèderons comme suit :

; déclaration du type
elements.envoyer.type = image
; l'attribut src
elements.envoyer.options.image = "images/envoyer.png"
; l'attribut alt
elements.envoyer.options.label = "soumettre le formulaire"

Les options

L’option la plus connue et la plus utilisée est certainement required, qui rend obligatoire la saisie du champ.

elements.nom.options.required = true

Initialisation du formulaire

Deux lignes suffisent à initialiser un formulaire :

$formConfig = new Zend_Config_Ini('configs/forms/form.ini');
$form = new Zend_Form($formConfig);

Votre formulaire est prêt à être utilisé, pour l’affichage ou pour traitement…

Aller plus loin

Utiliser une architecture modulaire

Quand le formulaire est un des composants majeurs de votre application, il peut s’avérer intéressant en terme de productivité de gérer vos fichiers de configuration en suivant l’architecture générale des modules. Dans le répertoire application/configs/, créez un répertoire forms, dans lequel vous reproduirez le schéma de vos modules.

.application
	.configs
		.forms
			.admin
				.utilisateurs
				 ajouter.ini
				 modifier.ini
			.default
				.index
				.login
				 login.ini

Si vous souhaitez en apprendre plus ou comprendre les modules sous Zend Framework, reportez-vous à l’article Créer une application Zend Framework avec modules.

Créer une méthode statique d’initialisation

Utiliser une architecture modulaire pour vos fichiers de configuration vous permet de mettre en œuvre très facilement une méthode statique d’initialisation :

class My_Setters {
	public static function setForm($request) {
		$filename = APPLICATION_PATH . '/configs/forms/'
					. $request->getModuleName() . '/'
					. $request->getControllerName() . '/'
					. $request->getActionName() . '.ini';
			$formConfig = new Zend_Config_Ini($filename);
			$form = new Zend_Form($formConfig);
			return $form;
		}
}

Que vous appellerez via :

My_Settters::setForm($this->_request);

Bien sûr, il est possible d’aller plus loin encore, en internationalisant ses formulaires, ou de suivre d’autres pistes, en créant par exemple un helper d’action pour initialiser ses formulaires…
Il est également possible comme pour tout fichier de configuration de créer des sections, pour des formulaires ayant un tronc commun et des différences minimes selon éventuellement les droits, le pays, l’âge ou le sexe. Mais vous êtes armés, vous saurez aller plus loin…

  1. Pas encore de commentaire
  1. Pas encore de trackbacks