La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

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

Présentations similaires


Présentation au sujet: "Symfony generators. contexte Répétition de limplémentation des méthodes CRUD pour ls objets métier Commande symfony permettant dinitialiser un module."— Transcription de la présentation:

1 symfony generators

2 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.

3 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

4 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

5 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

6 Initialiser un scaffolding symfony propel-init-crud myapp article Article –http://localhost/myapp_dev.php/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

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

8 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

9 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); }...

10 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

11 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

12 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

13 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

14 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 }

15 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)

16 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

17 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]

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

19 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

20 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]

21 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]

22 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 }

23 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 }

24 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

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

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

27 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]

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

29 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]

30 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

31 generator.yml – filtres partial Imaginons un champs status pouvant prendre deux valeurs (open ou closed), sans table étrangère templates/_state.php '', '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

32 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]

33 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]

34 generator.yml - pagination list: max_per_page: 5

35 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

36 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().

37 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 }

38 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

39 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(); }

40 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];

41 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

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

43 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: ~

44 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 }

45 generator.yml – ajouter une action II

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

47 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

48 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

49 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

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

51 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

52 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

53 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)

54 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()

55 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

56 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


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

Présentations similaires


Annonces Google