====== CRUD avec zones ======
Ce tutoriel provient de la discussion d'un des forums de Jelix concernant la pertinence de l'emploi d'une zone ou d'un simple template. Il n'y a pas qu'une seule réponse puisque trop de variables modèlisent la réponse:
* La performance (temps de réponse)
* Réutilisation du code (besoin ou pas besoin)
* Maintenance (évolution du logiciel est élevé ou pas)
* Expérience du développeur (débutant ou expert)
* Respect de normes de développement (individu ou en entreprise)
Cet article tiendra compte, au moins en partie je l'espère, de toutes ces variables. Aussi, une grande part des choix effectués est subjective. C'est le choix d'un programmeur qui tend vers la perfection mais ne l'attend jamais.
Vous pouvez télécharger le code de ce tutorial directement de la forge à l'adresse suivante: [[http://download.jelix.org/forge/tutors/crud/crudtuto3.zip|pour le format zip]] et [[http://download.jelix.org/forge/tutors/crud/crudtuto3.tar.gz|pour le format tar.gz]].
Le fichier contient une application nommée myapp. Attention pour ne pas écraser une autre application qui aurait le même nom.
===== Pré-requis =====
**ATTENTION, mise à jour : ce tutoriel est assez vieux, et n'utilise pas le controlleur jControllerDaoCrud fourni depuis jelix 1.0Beta3.1 qui simplifie beaucoup la tâche** (Voir [[:tutoriels:crud-jform-dao|l'autre tutoriel]]).
Il est donc à l'origine prévu pour fonctionner avec les versions de dévelopement de jelix 1.0 beta3. Il vous faudra faire certainement quelques adaptations pour qu'il fonctionne avec jelix 1.0.
Vous devez avoir fait le [[fr:tutoriels:minitutoriel|Mini tutoriel]] et le [[fr:tutoriels:jelixnews|Tutoriel principal]] ou être à l'aise avec Jelix. Puisque c'est le 3ième tutoriel sur un CRUD, nous vous conseillons fortement la lecture des articles les concernant. Voyez le [[fr:tutoriels:crud-jform-dao|Tutoriel du jForms et jDao]] et le [[fr:tutoriels:crud-generic|CRUD générique de base]] du manuel de Jelix.
===== Création de l'application =====
Veillez suivre la démarche décrite dans l'article [[fr:tutoriels:first-steps|Étapes lors de la création d'une application Jelix]] en tenant compte des informations suivantes:
Nom de l'application : myapp\\
Nom du module : crudtuto3\\
basePath = //"/jelix/myapp/www"// ou selon votre configuration préférée.
Il se peut que cette table existe déjà dans votre base de données, sinon créez là.
CREATE TABLE `news` (
`id_news` int(11) NOT NULL auto_increment,
`sujet` varchar(255) NOT NULL,
`texte` text NOT NULL,
`news_date` date NOT NULL,
PRIMARY KEY (`id_news`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
Ressource jDao : crudtuto3~news\\
Fichier DAO : news\\
Table : news
Créez dans le répertoire //jelix/myapp/modules/crudtuto3/forms///, le fichier //news.form.xml//.
===== Notes sur l'application à réaliser =====
**Dans un premier temps nous allons créer une réponse personnalisée**
**Nous allons créer une classe de services pour le CRUD**
* ainsi on maximize la réutilisation du code
* elle peut contenir des services rendus à l'aide des classes jDao ou ou jDb
* elle n'est pas générique mais est utilisée par plusieurs ressources de Jelix
**Nous allons créer 4 zones avec paramètres**
* ainsi on peut maximizer la réutilisation du code
* elles traiteront en partie de la logique du CRUD
* elles peuvent récupèrer un service selon selon une action du CRUD.
* elles traitent les données, si nécessaire
* elles gèrent 3 templates spécifiques au DAO utilisé (view, browse et edit)
* ces zones ne sont pas génériques.
**Nous allons créer une classe générique du CRUD**
* elle créera une réponse html ou une redirection,
* elle traitera en partie de la logique du CRUD
* elle récupèrera des services
* elle insèrera des zones avec paramètres dans le template principal
* elle gère 1 template générique (//cruderror.tpl//) qui sert à certaines erreurs.
**Il faut une classe d'utilisation**
* elle termine la préparation de l'action du CRUD
* elle retourne la réponse
* elle initialisera le classe générique du CRUD
* elle gère le template principal (//main.tpl//) et un sous template pour l'action index (//index,tpl//)
===== La réponse HTML =====
Le but de créer une réponse HTML personnalisée est de généraliser dans l'application :
*l'utilisation du même thème dans toutes les pages de notre petite application
*de garantir l'initialisation par défaut de certaines variables
*et l'utilisation d'un template principal par défaut indépendant du CRUD
Voyez le contenu du fichier //jelix/myapp/responses/myHtmlResponse.class.php//.
Consultez le manuel pour obtenir plus de détail sur la classe [[http://docs.jelix.org/fr/manuel-1.0/creer_response|jReponseHTML]].
Pour indiquer à Jelix que vous avez créé une réponse personnalisée, vous devez ouvrir le fichier //jelix/myapp/var/config/index/config.ini.php// et ajouter **dans la section [responses]** la ligne suivante:
html = myhtmlResponse
===== Création d'une classe de services pour le CRUD =====
Dans ce tutoriel, cette classe métiers ou de services contient peu de fonctions. Mais dans d'autres applications, elle pourrait être très utile en réduisant la duplication du code. Et même cette classe pourrait être appelée par d'autres types de __reponses__.
Par exemple, personnellement je préfère utiliser un jDb pour __browser__ les news. Parce que je peux faire un select avec 2 champs. C'est mon choix subjectif. Je pourrais rajouter cette fonction dans ma classe de services tout en gardant le __browse__ qui appel le DAO.
Voir le fichier //myapp/modules/crudtuto3/classes/crudserviceDAO.class.php//.
Consulter le manuel et son article sur les [[http://docs.jelix.org/fr/manuel-1.0/classes-metiers|classes métiers]].
===== Création de quatre zones avec paramètres =====
Les zones ne sont pas génériques mais peuvent être utilisées dans plusieurs actions ou même plusieurs templates directememt.
Ces zones sont accompagnées de leur template.
Puisqu'elles utilisent un dao spécifique, il est recommendé de donner un nom qui représente le dao et l'action. Ainsi si vous utilisez plusieurs fichiers dao dans votre application, vous pourrez les retrouver plus facilement.
Voir les fichiers du répertoire //myapp/modules/crudtuto3/zones/// et //myapp/modules/crudtuto3/templates///
* //newsview.zone.php//, //newsview.tpl//
* //newsupdate.zone.php//, //newsedit.tpl//
* //newscreate.zone.php//, //newsedit.tpl//
* //newsbrowse.zone.php//, //newsbrowse.tpl//
Consultez le manuel et l'article sur les [[http://docs.jelix.org/fr/manuel-1.0/zones|zones]]
===== Création d'une classe générique du CRUD =====
Cette classe de base et les zones se partagent la logique du CRUD. En fait dans cette classe on retrourve que la logique du __save__ et du __delete__ (__destroy__). Les autres actions appellent leur zone correspondante pour traiter la logique du CRUD.
Remarquez dans cette classe la façon d'appeler une zone avec paramètres et d'appeler une classe de service. Aussi remarquez l'utilisation du constructeur. La signature doit être la même que sa classe parent __jController__.
Cette classe est complètement générique grâce à son initialisation dans la classe d'utilisation. Également un template nommé //cruderror.tpl// est générique.
Voir le fichier //myapp/modules/crudtuto3/controllers/baseCrudController.php//
===== Création d'une classe d'utilisation =====
La classe d'utilisation est notre controleur par défaut et son template principal. Elle hérite du CRUD et ne voie que 3 choses:
- la configuration du CRUD
- la réponse html ou la redirection créées par le CRUD
- une fonction qui permet de faire la distinction entre ces deux réponses.
Le reste est comme une boîte noir. Le développeur peut ne pas s'en occuper.
Voir le fichier //myapp/modules/crudtuto3/controllers/default.classic.php//
Voir le fichier //myapp/modules/crudtuto3/templates/main.tpl//
Consultez le manuel et l'article sur les [[http://docs.jelix.org/fr/manuel-1.0/controleurs|contrôleurs]].
----
* [[fr:tutoriels:|Retour au sommaire des tutoriels]]