Création de nouveau formulaire facilement avec Zend Form Maker

La création de formulaire avec zend framework peut être facilitée grâce à un petit développement : Zend Form Maker. Projet disponible sur github. À la base créer pour des besoins scolaires, sarlak a eu la bonne idée de rendre le dev open source sous licence GPL 3.0.

Le but du logiciel est de permettre via une interface très simple d’accès, de créer des formulaires et ensuite de forger une classe PHP, basé sur zend framework afin d’obtenir un formulaire tout frais moulu. Ultra pratique, et ultra simple, et surtout cela fait gagner un temps de dingue!

Pour l’installer, il vous faut de quoi faire fonctionner zend framework (celui-ci doit être installé). Sous Unix cela donnera ceci :

git clone https://github.com/sarlak/Zend-Form-Maker.git
ln -s pathToYourZFLibrary
chmod 0777 Zend-Form-Maker/public/resources/xml
chmod 0777 Zend-Form-Maker/public/resources/form_made

Bien entendu, à peu de choses près ceci est adaptable sous MS-Windows

Pour créer votre premier formulaire, il vous suffit de vous rendre sur l’URL adéquate, aller sur « form list » et « Bazinga! ». Une démo existe en ligne!

Une petite capture d’écran :

À noter que j’ai corrigé un ou deux petits trucs qui me dérangeaient, il y a un bout de temps.

ZF : ACL et ressources multiple

Lorsque l’on utilise des ACL dans Zend Framework, une chose assez embêtante est de devoir tout mettre en place1. Pour ma part, j’ai par facilité voulu ajouté le support de ressource multiple.

Avant de commencer, il convient de contextualisé les choses, les ACL de ZF pouvant être utilisé de bien des manière.

Dans le cas qui nous intéresse, j’ai simplement défini ceci :

  • les ressources2 = module.controller
  • les privilèges3 = action

Ce que je voulait c’est pouvoir définir une ressource pour tous les contrôleurs. La syntaxe évidente qu’il m’est venu est la suivante : module.*

Dans ma classe qui étend Zend_ACL j’ai simplement fait ceci :

    public function isAllowed($role = null, $resource = null, $privilege = null)
    {
    	if (null === $resource)
    		return parent::isAllowed($role, $resource, $privilege);
 
    	$resources = $this->getResourcesPossibility($resource);
    	foreach($resources as $resource)
    	{
    		if ($this->has($resource) && parent::isAllowed($role, $resource, $privilege))
    		{
    			return true;
    		}
    	}
    	return false;
    }
 
    public function getResourcesPossibility($resource = null)
    {
    	$ret = array($resource);
    	if (null !== $resource)
    	{
    		$resources = explode('.', $resource);
    		$cptRessources = count($resources);
    		if ($cptRessources >= 2)
    		{
    			$resources[ $cptRessources - 1 ] = '*';
    		}
    		$ret[] = implode('.', $resources);
    	}
    	return $ret;
    }

Ceci peut bien entendu être enrichi mais permet au moins de profiter de l’utilisation des ACL dans le menu et sur des aides de vue qui serait éventuellement définie comme expliqué dans la plupart des tutoriaux.

Pour en savoir plus sur les ACL et Zend Framework, je vous renvoi a un très bon article.

  1. surtout si on utilise l’aide de vue pour généré un menu (Zend_navigation)
  2. resource
  3. privilege

ZF : module et autoloader

Avec Zend Framework, lorsque l’on travail un projet conséquent il devient vite utile de travailler avec le mécanisme des modules. Celui-ci permet d’étendre pas mal de chose et surtout une séparation poussée en … module.

Le problème de ce mécanisme1 est qu’il faut définir le chemin pour le chargement automatique à l’aide de ceci :

$autoloader = new Zend_Application_Module_Autoloader(array(
	'namespace' => 'SuperModule',
	'basePath'  => 'path to super module',
));

Je vous propose donc de faire une petite amélioration afin que ce chargement soit fait automatiquement.

Avant tout, dans votre configuration (ici en .ini) vous devez au moins avoir ceci de présent :

resources.frontController.moduleDirectory = APPLICATION_PATH "/modules"
resources.modules =

Ensuite, à la base de chaque dossier module créer un fichier Bootstrap.php2 :

<?php
class SuperModule_Bootstrap extends Grummfy_Bootstrap{}
# EOF

Et pour finir créer le fichier3 library/Grummfy/Bootstrap.php

<?php
 
abstract class Grummfy_Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
	protected function _initAutoload()
	{
		$className = get_class($this);
		$zf_namespace = explode('_', $className);
		$reflector = new ReflectionClass($className);
		$autoloader = new Zend_Application_Module_Autoloader(array(
			'namespace' => $zf_namespace[0],
			'basePath'  => dirname($reflector->getFileName()),
		));
		return $autoloader;
	}
}
 
# EOF
  1. sauf si j’ai loupé un truc…
  2. ne pas oublier de changer le nom du module …
  3. n’oubliez pas de déclarer le « namespace » Grummfy ou bien d’inclure le fichier

ZF : génération automatique du fichier de navigation et ACL

Lors de l’utilisation du mécanisme d’ACL et de génération de menu dans Zend Framework, il est intéressant de limiter l’affichage de ce menu en utilisant les ressources et privilèges associer.

Pour ma part, j’utilise un fichier XML pour construire mon menu, mon sitemap, … 1. Et comme beaucoup je génère mon projet ZF à l’aide de Zend_Tool. Je trouvais donc dommage de devoir réécrire pratiquement la même chose que ce que j’avais déclaré dans Zend_Tool pour reconstruire mon menu. J’ai donc décidé de rapidement écrire un petit script qui reprendrait le fichier XML du projet et le transformerait en menu …

À noter que le script devrait certainement être amélioré, mais que cela permet un gain de temps considérable …

Téléchargement

  1. Comme expliquer dans le manuel http://framework.zend.com/manual/fr/zend.navigation.html

Planet Zend Framework

Un planet sur Zend Framework, pour les francophones est née!

Tout d’abord qu’est-ce qu’un planet?
Un planet est un agrégateur de flux rss concernant un même sujet. Le but est de promouvoir mais surtout de concentrer les articles publié sur le sujet.

Pour ceux qui désirerait y goûter, je vous renvoi vers le site : zf planet

N’hésitez pas à demander a en faire partie.