Symfony generators. contexte Répétition de limplémentation des méthodes CRUD pour ls objets métier Commande symfony permettant dinitialiser un module.

Slides:



Advertisements
Présentations similaires
Click to edit Master title style Soccuper de notre personnel Investir dans leur développement professionnel Leur donner confiance en lavenir Look after.
Advertisements

Support.ebsco.com Guide dUtilisation Création dune collection locale.
L’optimiseur ORACLE L’optimiseur ORACLE suit une approche classique: Génération de plusieurs plans d’exécution. Estimation du coût de chaque plan généré.
Département fédéral de lintérieur DFI Office fédéral de la statistique OFS Implementing the economic classification revision (NACE / ISIC) in the Business.
Présentation du Stage en Entreprise
Logiciels Libres Pour Le Web Concept express… En installer en 3mn …En personnaliser certains.
Langage de manipulation de données Ensemble de commandes permettant : – modifier la base : ajout, modification et suppression – interroger la base ex :
« Les Mercredis du développement » Nouveau format de fichier Template Solution Présenté par Pierre Lagarde Relation Développeurs.
Cours de NETSILON Réalisé par: Hitcho introduction Netsilon est un logiciel qui permet de concevoir une application web avec PHP.
INTRODUCTION INTRODUCTION ERGONOMIE Tri par cartes Formulaires Interface Installation Lanceur Documentation TECHNOLOGIES XML + XSL CSS Formulaires génériques.
Vocabulaire pour la passage du modèle conceptuel des données au modèle relationnel des données. MCDMRD EntitéTable PropriétésChamps, attribut IdentifiantClé
Toolkit Web Framework Java pour les IHMs Cédric Dumas mars 2008 contrat Creative Commons Paternité-Pas d'Utilisation Commerciale- Partage.
TP2 ... MVC ? JList JLabel JSlider ImageLibrary Contrôleur Vue Modèle
Symfony i18n. terminologie internationalization = i18n –Un même contenu traduit en plusieurs langue, éventuellement converti en différents formats localization.
Symfony configuration.
Symfony en action I M V Controleur.
Symfony Un projet français 1 ère version octobre 2005 Fabien Potencier PDG de sensio Lab développeur François Zanonitto écrit.
Symfony Liens & routing.
Symfony Formulaires.
Design Pattern MVC En PHP5.
PHP5 its a kind of magic. Chargement automatique function __autoload( $nom_classe ) { require_once('obj/'.$nom_classe.'.class.php'); } si on exécute le.
Symfony
Georges Gardarin 1 LE LANGAGE DE REQUETES SQL l Origines et Evolutions l SQL1 86: la base l SQL1 89: l'intégrité l SQL2 92: la nouvelle norme l SQL3 98:
Integration serveur Data Access Layer Web Service Service1.asmx BankAccess FinanceAccess CLIENTS Business Logic Layer Finance Portfolio SOURCE DE DONNEES.
LOGO Profile Enterprise Java Beans Réaliser par: HAMROUNI Aymen HOUIJI Manel WESLATI Yassine.
Système de gestion des demandes Création et consultation des billets
Enesys RS Data Extension
Bonnes pratiques ez publish
Connexion base de données
Injection de dépendances
Développement d’applications web
EndNote X1 : Gestion bibliographique et publication
TM.
– Search Marketing et Marketing Interactif 1 ère Position – David Degrelle Tel : ou
Struts 1 & 2 Tlohi ibtissam Tabit boutaina Ilias bouras
Faculté I&C, Claude Petitpierre, André Maurer 1 Java.
AFNOR NF Z – "Online Consumer Reviews
Langages du Web Sémantique
La programmation objet Illustration de la POO en Pascal
Magnets fiche projet / project sheet IAFACTORY THE MAGNETIC FACTORY magnets. IAFACTORY | conseil en architecture de linformation | |
TortoiseSVN N°. Subversion : pour quoi faire ? Avoir un espace de stockage commun – Tous les étudiants du SIGLIS ont un espace svn commun Partager vos.
Historique de SystemC Regroupe 4 courants didées: SCENIC Project : Synopsys+UC Irvine Philips System-Level Data Types, VSIA SLD DWG IMEC, Hardware-Software.
Cours N°2 Base de Données & Langage SQL
1 LE LANGAGE DE REQUETES SQL Origines et Evolutions SQL1 86: la base SQL1 89: l'intégrité.
ADOBE FLEX 4. © Logica All rights reservedNo. 2 Introduction Flex en action Autour de Flex Logica Le programme.
Introduction au WebMapping
Mise en œuvre du langage MDX
BBoard Fonctionne pas. BBoard Copier le répertoire dézippé dans le répertoire modules de post nuke Renommer ce répertoire en yabbse. Entrer le chemin.
CERN IT Department CH-1211 Genève 23 Switzerland t Get the most of Office 2007! Bruno Lenski, IT/OIS.
Multi-Thread Jian-Yun Nie
OpenCV: Introduction au Traitement d’Images et Vidéo
Fabienne Boyer Laboratoire LIG (INRIA-UJF-INPG) Projet SARDES, INRIA Rhône-Alpes APACHE/VELOCITY.
Première CTP le 4 décembre Nouvelle CTP depuis le 1 er février RTM milieu de cette année.
27/02/2006L3 MIAGE - GLO ADA1 Les Paquetages Permettent d’encapsuler un groupe d’entités logiquement reliées. Comme toute unité de programme, le paquetage.
SQL partie 3. SQL est un langage de définition de données SQL est un langage de définition de données (LDD), c'est-à-dire qu'il permet de créer des tables.
TYPO 3 Site uved 14 avril 2006.
EPID-CPI-ISAIP Philippe Bancquart - mise à jour 24/02/ page 1 Transac SQL Intégrité des données.
OCSInventory Formation CISCAM 2008.
Initiation à Access: Interfaces
420-B63 Programmation Web Avancée Auteur : Frédéric Thériault 1.
RETRO v2 « Analyse Fonctionnelle » Octobre 2007 JYR.
05/02/98WEB ESNIG Création module Filtre/Liste/Edition Oracle Designer/2000 & Oracle Web Server.
Pour mieux vieillir ensemble EndNote 102 Gérer et bonifier une bibliothèque Par Marie-Marthe Gagnon Bibliothécaire Mars 2015.
1 Initiation aux bases de données et à la programmation événementielle Cours N°8 : Gestion de la cohérence avec des zones de liste déroulantes. Souheib.
Générateur d’applications WEB de gestion de données Module List.
Cours n°2 Implémentation et exploitation
APP-TSWD Apprentissage Par Problèmes Techniques des Sites Web Dynamiques Licence Professionnelle FNEPI Valérie Bellynck, Benjamin Brichet-Billet, Mazen.
1 Les bases de données Séance 5 -- Le Langage de Définition de Données ou la manœuvre de la structure de la base -- Le Langage de Manœuvre de Données.
Les ORMs ● Faire coexister le monde relationnel et objet.
Transcription de la présentation:

symfony generators

contexte Répétition de limplémentation des méthodes CRUD pour ls objets métier Commande symfony permettant dinitialiser un module symfony – propel-init-crud propel-generate-crud propel-init-admin.

Scaffolding un scaffolding est une structure basique (actions et templates) utilisée pour implémenter les méthodes CRUD sur une table Le code est minimal car il est censé servir de guide pour une développement future Cest une base qui doit être adaptée pour correspondre aux besoin logiques et de présentation du développeur. Les scaffoldings sont utilisés essentiellement pendant la phase de développement, pour avoir un accès web a une base de données, pour construire un prototype, ou comme base pour un module basé lui-même sur une table

Administration Une administration est une interface sophistiquée de manipulation de données, typiquement dédiée à la partie back office –Les Administrations se distinguent des scaffolding en cela que leur code nest pas modifiable. –Elles peuvent être paramétrées, étendue, ou assemblées par héritage ou configuration. –Leur présentation est importante, et elles offrent des possibilités de tri, pagination, et filtrage. –Une administration peut être créée et distribuée au client comme une partie finie de lapplication

Terminologie symfony –Scaffolding (crud) inheritance (init) –Classes vides (squelettes) –Nest pas fait pour être modifié ( phpMyAdmin) code generation (generate) –Classes avec Code –En vue dune adpatation du code généré –Administration (admin) Modifiable via la configuration

Initialiser un scaffolding symfony propel-init-crud myapp article Article – –Aucune action dans actions.class.php –Aucun template dans le répertoire templates/ –Tout est hérité dune classe auto-générée myproject/cache/myapp/prod/module/autoArticle/ –en cache

Générer un scaffolding symfony propel-generate-crud myapp article Article – –Contrôleur et templates générés à partir du schema.yml dans myapp/modules/article/ –Code pour CRUD

Détails de la génération dun scaffolding Dans actions/actions.class.php –index : redirection sur laction list –list : affiche la liste de tous les enregistrements de la table –show : affiche toutes les colonnes dun enregistrement –edit : affiche un formulaire de modification dun enregistrement –update : action appelée par le formulaire dédition –delete : supprimer un enregistrment –create : ajouter un nouvel enregistrement Dans le répertoire templates/ –editSuccess.php : formulaire dédition dun enregistrement –listSuccess.php : liste de tous les enregistrements –showSuccess.php : détails dun enregistrement

actions.class.php généré class articleActions extends sfActions { public function executeIndex() { return $this->forward('article', 'list'); } public function executeList() { $this->articles = ArticlePeer::doSelect(new Criteria()); } public function executeShow() { $this->article = ArticlePeer::retrieveByPk($this->getRequestParameter('id')); $this->forward404Unless($this->article); }...

administration Typiquement adapté au back office –symfony init-app backend symfony propel-init-admin backend article Article Fichier de conf cutomisable generator.yml –Omposants logiques –Look & feel Possibilité de refédinir les action ste les templates

administration – code généré Tout est en cache dans actions/actions.class.php –create : redirection vers laction edit –delete : supprime un enregistrement –edit : affiche le formulaire dédition dun module, et assure le traitement de la soumission de ce formulaire –index : redirige vers laction list –list : affiche la liste de tous les enregistrements –save : redirige vers laction edit Dans le répertoire templates/ –editSuccess.php : _edit_actions.php, _edit_footer.php, _edit_form.php, _edit_header.php, _edit_messages.php – _filters.php –listSuccess.php : _list.php, _list_actions.php, _list_footer.php, _list_header.php, _list_messages.php, _list_td_actions.php, _list_td_stacked.php, _list_td_tabular.php, _list_th_stacked.php, _list_th_tabular.php

generator.yml backend/modules/article/config/generator.yml par défaut N.B. toute customisation se fait à la suite du thème et doit par conséquent commencer par 4 espaces generator: class: sfPropelAdminGenerator param: model_class: Article theme: default

generator.yml - action list - typique generator: class: sfPropelAdminGenerator param: model_class: Article theme: default fields: author_id: { name: Article author } list: title: List of all articles display: [title, author_id, category_id] fields: published_on: { params: date_format='dd/MM/yy' } layout: stacked params: | %is_published% %=title% by %author% in %category% (%published_on%) %content_summary% filters: [title, category_id, author_id, is_published] max_per_page: 2

generator.yml - action edit - typique generator: class: sfPropelAdminGenerator param: model_class: Article theme: default fields: author_id: { name: Article author } edit: title: Editing article "%title%" display: "Post": [title, category_id, content] "Workflow": [author_id, is_published, created_on] fields: category_id: { params: disabled=true } is_published: { type: plain} created_on: { type: plain, params: date_format='dd/MM/yy' } author_id: { params: size=5 include_custom=>> Choose an author << } published_on: { credentials: } content: { params: rich=true tinymce_options=height:150 }

generator.yml - fields Par défaut la liste des champs est déduite du schema.yml –Il est possible de paramétrer quels champs seront affichés, cachés, et même dafficher des champs customiser nayant pas une correspondance direct avec lobjet Fields peut agir au niveau général et peut être redéfini au niveau de laction edit ou list (cest un principe général)

generator.yml – fields configuration name: nom de lobjet type: type de balise dédition (de formulaire) à utiliser params: paramètres supplémentaires: classes CSS, taille de la balise dédition, etc … help: texte daide afficher lors de lédition

generator.yml - display Permet de spécifier quels champs sont affichés dans une action ainsi que lordre daffichage (edit & list) Permet également de regrouper les champs par rubrique (edit) generator: class: sfPropelAdminGenerator param: model_class: Comment theme: default list: display: [id, article_id, content] edit: display: NONE: [article_id] Editable: [author, content, created_at]

generator.yml – display II Par défaut les clés primaires sont toujours cachées

generator.yml – customized fields Les champs du generator.yml ne doivent pas forcément correspondre à des champs de base de données –Un getter du modèle peut être utilisé dans laction list –Un getter et / ou un setter peut être utilisé dans laction list et edit

generator.yml – customized fields II lib/model/Article.php public function getNbComments() { return $this->countComments(); } generator: class: sfPropelAdminGenerator param: model_class: Article theme: default list: display: [id, title, nb_comments, created_at]

generator.yml – customized fields III lib/model/Comment.class.php public function getArticleLink() { return link_to($this->getArticle()->getTitle(), 'article/edit?id='.$this->getArticleId()); } generator: class: sfPropelAdminGenerator param: model_class: Comment theme: default list: display: [id, article_link, content]

generator.yml - partial MVC compliance!! modules/comment/templates/_article_link.php getArticle()->getTitle(), 'article/edit?id='.$comment->getArticleId()) ?> Accès à lobjet courant –currentObject -> $current_object list: display: [id, _article_link, created_at] fields: article_link: { name: Article }

generator.yml partial + logic = component Appel à la méthode articleLink de actions/components.class.php Peut être utilisée dans le contexte list, edit, filter –Le contexte est accessible via $type list: display: [id, ~article_link, created_at] fields: article_link: { name: Article }

Paramétrage de laffichage le titre list: title: List of Articles... edit: title: Body of article %title% display: [content] % … % Permet daccéder à un champs de lobjet

generator.yml - note daide edit: fields:... article_id: { help: The current comment relates to this article } modules/comment/config/generator.yml

generator.yml – format de date N.B. le administrations sont i18n - ready list: fields: created_at: { name: Published, params: date_format='dd/MM' }

generator.yml – affichage de laction list Par défaut léction edit est lié (au sens hypertexte) à la clé primaire = devant le nom du champs cliquable list: display: [article_link, =content]

generator.yml tabular (default)/ stacked list: layout: stacked params: | %=content% (sent by %author% on %created_at% about %article_link%) display: [created_at, author, content]

generator.yml - filtres list: filters: [article_id, author, created_at] layout: stacked params: | %=content% (sent by %author% on %created_at% about %article_link%) display: [created_at, author, content]

generator.yml – filtres II Pour les colonnes textes le filtre est une entrée texte possédant (*) en caractère joker Pour les clé étrangères le filtre est une liste déroulante contenant les enregistrements de la table liée (comme pour object_select_tag(), le texte des options est celui retourné par la méthode __toString() de la classe liée) Pour les colonnes dates le filtre est composé de deux calendrier (rich) permettant la sélection dun intervalle de temps Pour les colonnes booléennes, le filtre est une liste déroulante possédant les valeurs: « true », « false », et « true or false » - la dernière valeur réinitialise le filtre

generator.yml – filtres partial Imaginons un champs status pouvant prendre deux valeurs (open ou closed), sans table étrangère templates/_state.php <?php echo select_tag('filters[state]', options_for_select(array( '' => '', 'open' => 'open', 'closed' => 'closed', ), isset($filters['state']) ? $filters['state'] : ' )) ?> config/generator.yml list: filters: [date, _state] N.B. le contenu des champs est accessible via $filter

generator.yml – filtrage par valeur vide Afficher tous les commentaires sans auteur list: fields: author: { filter_is_empty: true } filters: [article_id, author, created_at]

generator.yml – trier les listes En liste toutes les colonnes sont cliquables pour lordonnancement Lien direct vers une liste ordonnée selon une colonne Les champs partial ne peuvent pas être un critère de tri list: sort: created_at # Alternative syntax, to specify a sort order sort: [created_at, desc]

generator.yml - pagination list: max_per_page: 5

generator.yml – utiliser un jointure pour accélerer les temps de réponse Par défaut doSelect est utilisé Affichage du nom de lauteur dun commentaire –requête supplémentaire à chaque commentaire list: peer_method: doSelectJoinArticle

generator.yml – changer le type dun champs en édition Une colonne définie comme integer, float, char, varchar(size) sera représentée en édition par object_input_tag(). Une colonne définie comme longvarchar sera représentée en édition object_textarea_tag(). Une clé étrangère sera reprsentée par object_select_tag(). Une colonne définie comme boolean sera représentée par object_checkbox_tag(). Une colonne définie comme timestamp ou date sera représentée object_input_date_tag().

generator.yml – changer le type dun champs en édition II edit: fields: ## Drop the input, just display plain text id: { type: plain } ## The input is not editable author: { params: disabled=true } ## The input is a textarea (object_textarea_tag) content: type: textarea_tag params: rich=true css=user.css tinymce_options=width:330 ## The input is a select (object_select_tag) article_id: { params: include_custom=Choose an article }

generator.yml – gérer les champs partial templates/_newpassword.php edit: display: [id, nickname, _newpassword] fields: newpassword: name: Password help: Enter a password to change it

generator.yml – gérer les champs partial II class userActions extends autouserActions { protected function updateUserFromRequest() { $password = $this->getRequestParameter('newpassword'); if ($password) { $this->user->setPassword($password); } parent::updateUserFromRequest(); }

generator.yml – gérer les champs partial III Imaginons que newpassword soit un champs de la table templates/_newpassword.php Rien à redéfinit dans le contôleur Pour accéder à la valeur dans le contrôleur $user = $this->getRequestParameter(user'); $password = $user['newpassword];

generator.yml – relation 1-n Génération automatique de liste déroulante –La valeur est toujours lid –Le texte est le résultat de la méthode __toString() de lobjet lié ou lid si cette méthode nexiste pas relation n-1 : nombre de commentaires liés à un article –Gestion via un partial

generator.yml – relation n-n edit: fields: article_author: { type: admin_double_list, params: through_class=ArticleAuthor }

generator.yml – actions de base list: title: List of Articles object_actions: _edit: ~ _delete: ~ actions: _create: ~ edit: title: Body of article %title% actions: _list: ~ _save: ~ _save_and_add: ~ _delete: ~

generator.yml – ajouter une action Article/actions.actions.class.php public function executeAddComment() { $comment = new Comment(); $comment->setArticleId($this->getRequestParameter('id')); $comment->save(); $this->redirect('comment/edit?id='.$comment->getId()); } list: title: List of Articles object_actions: _edit: - _delete: - addcomment: { name: Add comment, action: addComment, icon: addcomment.png }

generator.yml – ajouter une action II

generator.yml – supprimer les actions Pour supprimer toutes les actions dune section list: title: List of Articles actions: {}

generator.yml - nommage Convention de nommage dans les administrations –champs de formulaire pour $article->title –name=article[title] –id=article_title // generator.yml edit: display: [title] // Resulting _edit_form.php template 'article[title]')) ?> // Resulting HTML

generator.yml – conséquence sur les validateurs ## Replace square brackets by curly brackets in the fields list fields: article{title}: required: msg: You must provide a title ## For validator parameters, use the original field name between quotes sfCompareValidator: check: "user[newpassword]" compare_error: The passwords dont

generator.yml - credentials ## The id column is displayed only for users with the admin credential list: title: List of Articles layout: tabular display: [id, =title, content, nb_comments] fields: id: { credentials: [admin] } ## The addcomment interaction is restricted to the users with the admin credential list: title: List of Articles object_actions: _edit: - _delete: - addcomment: credentials: [admin] name: Add a comment action: addComment icon: backend/addcomment.png

generator.yml – feuille de style generator: class: sfPropelAdminGenerator param: model_class: Comment theme: default css: mystylesheet

generator.yml – personnalisé len-tête et le pied de page Il suffit de créer dans le répertoire templates –_list_header.php –_list_footer.php –_edit_header.php –_edit_footer.php Ces templates seront automatiquement redéfinis –_edit_header.php getNbComments() > 0): ?> getNbComments() ?> comments. Dans un partial edit : lobjet est toujours accessible via une variable portant le nom de la classe ($article) Dans un partial list : le pager est toujours accessible via la variable $pager

generator.yml – appel dactions avec paramètres This article has getNbComments().' comments', 'comment/list', array( 'query_string' => 'filter=filter&filters%5Barticle_id%5D='.$article->getId() )) ?> comments. La valeur de query_string est une version encodée de 'filter=filter&filters[article_id]='.$article->getId() Il est possible de spécifier un filtre ou un ordre

generator.yml - thèmes Tous les partials hériéts du framework peuvent être redéfinis dans le répertoire template Possibilité de redéfinir ces partials pour plusieurs modules: écrire un nouveau thème Thème par défaut : $sf_symfony_data_dir/generator/sfPropelAd min/default/ Thème personnalisé : data/generator/sfPropelAdmin/[theme_name]/ template/ (partir du thème par défaut)

generator.yml – thèmes II // [theme_name]/template/templates/ _edit_actions.php _edit_footer.php _edit_form.php _edit_header.php _edit_messages.php _filters.php _list.php _list_actions.php _list_footer.php _list_header.php _list_messages.php _list_td_actions.php _list_td_stacked.php _list_td_tabular.php _list_th_stacked.php _list_th_tabular.php // [theme_name]/template/actions/actions.class.php // Process the request filters processFilters() // Adds a filter to the Criteria object addFiltersCriteria() processSort() addSortCriteria()

generator.yml – themes III Ces templates sont des templates de templates –Ces fichiers seront parsés pour générer les templates finaux (phase de compilation) Syntaxe alternative getPrimaryKey() as $pk): ?> [?php echo object_input_hidden_tag( $ getSingularName() ?>, 'get getPhpName() ?> ) ?] code produit

generator.yml – themes IV Mieux vaut partir des originaux Un thème peut être packagé dans un plugins pour une plus grande réutilisabilité et déploiement plus rapide Il est possible de construire des générateurs personnalisés $generator_manager = new sfGeneratorManager(); $data = $generator_manager->generate('sfPropelAdminGenerator', $parameters); API documentation de sfGeneratorManager Exemple: sfAdminGenerator et sfCRUDGenerator