Title: symfony
1symfony
2contexte
- Répétition de limplémentation des méthodes CRUD
pour ls objets métier - Commande symfony permettant dinitialiser un
module - symfony ltTASK_NAMEgt ltAPP_NAMEgt ltMODULE_NAMEgt
ltCLASS_NAMEgt - ltTASK_NAMEgt
- propel-init-crud
- propel-generate-crud
- propel-init-admin.
3Scaffolding
- 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
4Administration
- 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
5Terminologie 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
6Initialiser 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
7Gé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
8Dé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
9actions.class.php généré
- class articleActions extends sfActions
-
- public function executeIndex()
-
- return this-gtforward('article', 'list')
-
- public function executeList()
-
- this-gtarticles ArticlePeerdoSelect(new
Criteria()) -
- public function executeShow()
-
- this-gtarticle ArticlePeerretrieveByPk(this
-gtgetRequestParameter('id')) - this-gtforward404Unless(this-gtarticle)
-
- ...
10administration
- Typiquement adapté au back office
- symfony init-app backend
- symfony propel-init-admin backend article Article
- http//localhost/backend.php/article
- Fichier de conf cutomisable generator.yml
- Omposants logiques
- Look feel
- Possibilité de refédinir les action ste les
templates
11administration 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
12generator.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 - http//www.symfony-project.org/uploads/assets/sfAd
minGeneratorRefCard.pdf
generator class sfPropelAdminGenerator
param model_class Article theme
default
13generator.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_publishedltstronggttitlelt/stronggtltbr
/gt ltemgtby author in category
(published_on)lt/emgt
ltpgtcontent_summarylt/pgt filters
title, category_id, author_id, is_published
max_per_page 2
14generator.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
disabledtrue is_published type
plain created_on type plain,
params date_format'dd/MM/yy'
author_id params size5 include_customgtgt
Choose an author ltlt published_on
credentials content params
richtrue tinymce_optionsheight150
15generator.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)
16generator.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
17generator.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
18generator.yml display II
- Par défaut les clés primaires sont toujours
cachées
19generator.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
20generator.yml customized fields II
- lib/model/Article.php
- public function getNbComments()
-
- return this-gtcountComments()
-
generator class sfPropelAdminGenerator
param model_class Article theme
default list display id, title,
nb_comments, created_at
21generator.yml customized fields III
- lib/model/Comment.class.php
- public function getArticleLink()
-
- return link_to(this-gtgetArticle()-gtgetTitle(),
'article/edit?id'.this-gtgetArticleId()) -
generator class sfPropelAdminGenerator
param model_class Comment theme
default list display id,
article_link, content
22generator.yml - partial
- MVC compliance!!
- modules/comment/templates/_article_link.php
- lt?php echo link_to(comment-gtgetArticle()-gtgetTitl
e(), - 'article/edit?id'.comment-gtgetArticleId()) ?gt
- Accès à lobjet courant
- currentObject -gt current_object
list display id, _article_link,
created_at fields article_link name
Article
23generator.yml partial logic component
list display id, article_link,
created_at fields article_link name
Article
- 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
24Paramétrage de laffichagele titre
list title List of Articles ... edit
title Body of article title display
content
Permet daccéder à un champs de lobjet
25generator.yml - note daide
modules/comment/config/generator.yml
edit fields ... article_id
help The current comment relates to this article
26generator.yml format de date
list fields created_at name
Published, params date_format'dd/MM'
- N.B. le administrations sont i18n - ready
27generator.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
28generator.ymltabular (default)/ stacked
list layout stacked params
content ltbr /gt (sent by author on
created_at about article_link)
display created_at, author, content
29generator.yml - filtres
list filters article_id, author,
created_at layout stacked params
content ltbr /gt (sent by author on
created_at about article_link)
display created_at, author, content
30generator.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
31generator.yml filtres partial
- Imaginons un champs status pouvant prendre deux
valeurs (open ou closed), sans table étrangère - templates/_state.php
- lt?php echo select_tag('filtersstate',
- options_for_select(array(
- '' gt '',
- 'open' gt 'open',
- 'closed' gt 'closed',
- ), isset(filters'state') ? filters'state'
' - )) ?gt
- config/generator.yml
- list
- filters date, _state
- N.B. le contenu des champs est accessible via
filter
32generator.yml filtrage par valeur vide
- Afficher tous les commentaires sans auteur
list fields author filter_is_empty
true filters article_id, author,
created_at
33generator.yml trier les listes
- En liste toutes les colonnes sont cliquables pour
lordonnancement - Lien direct vers une liste ordonnée selon une
colonne - lt?php echo link_to('Comment list by date',
'comment/list?sortcreated_attypedesc' ) ?gt - 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
34generator.yml - pagination
list max_per_page 5
35generator.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
36generator.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().
37generator.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 disabledtrue The input is a
textarea (object_textarea_tag) content
type textarea_tag params richtrue
cssuser.css tinymce_optionswidth330
The input is a select (object_select_tag)
article_id params include_customChoose an
article
- lt?php echo object_select_tag(comment,
'getArticleId', 'related_classArticle',
'include_customChoose an article') ?gt
38generator.yml gérer les champs partial
edit display id, nickname, _newpassword
fields newpassword name Password
help Enter a password to change it
- templates/_newpassword.php
- lt?php echo input_password_tag('newpassword', '')
?gt
39generator.yml gérer les champs partial II
- class userActions extends autouserActions
-
- protected function updateUserFromRequest()
-
- password this-gtgetRequestParameter('newpas
sword') - if (password)
-
- this-gtuser-gtsetPassword(password)
-
- parentupdateUserFromRequest()
-
-
40generator.yml gérer les champs partial III
- Imaginons que newpassword soit un champs de la
table - templates/_newpassword.php
- lt?php echo input_password_tag(usernewpassword',
'') ?gt - Rien à redéfinit dans le contôleur
- Pour accéder à la valeur dans le contrôleur
- user this-gtgetRequestParameter(user')
- password user'newpassword
41generator.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
42generator.yml relation n-n
edit fields article_author type
admin_double_list, params through_classArticleAu
thor
43generator.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
44generator.yml ajouter une action
list title List of Articles
object_actions _edit - _delete -
addcomment name Add comment, action
addComment, icon addcomment.png
- Article/actions.actions.class.php
- public function executeAddComment()
-
- comment new Comment()
- comment-gtsetArticleId(this-gtgetRequestParameter
('id')) - comment-gtsave()
- this-gtredirect('comment/edit?id'.comment-gtgetI
d()) -
45generator.yml ajouter une action II
46generator.yml supprimer les actions
list title List of Articles actions
- Pour supprimer toutes les actions dune section
47generator.yml - nommage
- Convention de nommage dans les administrations
- champs de formulaire pour article-gttitle
- namearticletitle
- idarticle_title
- // generator.yml
- edit
- display title
- // Resulting _edit_form.php template
- lt?php echo object_input_tag(article, 'getTitle',
array('control_name' gt 'articletitle')) ?gt - // Resulting HTML
- ltinput type"text" name"articletitle"
id"article_title" value"My Title" /gt
48generator.yml conséquence sur les validateurs
- Replace square brackets by curly brackets in
the fields - list
- fields
- articletitle
- required
- msg You must provide a title
- For validator parameters, use the original
field name between quotes - sfCompareValidator
- check "usernewpassword"
- compare_error The passwords dont
49generator.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
50generator.yml feuille de style
- generator
- class sfPropelAdminGenerator
- param
- model_class Comment
- theme default
- css mystylesheet
51generator.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
- lt?php if (article-gtgetNbComments() gt 0) ?gt
- lth2gtlt?php echo article-gtgetNbComments() ?gt
comments.lt/h2gt - lt?php endif ?gt
- 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
52generator.yml appel dactions avec paramètres
- This article has
- lt?php echo link_to(article-gtgetNbComments().'
comments', - 'comment/list', array(
- 'query_string' gt 'filterfilterfilters5Barticl
e_id5D'.article-gtgetId() - )) ?gt
- comments.
- La valeur de query_string est une version encodée
de 'filterfilterfiltersarticle_id'.article-gt
getId() - Il est possible de spécifier un filtre ou un ordre
53generator.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/
sfPropelAdmin/default/ - Thème personnalisé data/generator/sfPropelAdmin/
theme_name/template/ (partir du thème par
défaut)
54generator.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()
55generator.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
- lt?php foreach (this-gtgetPrimaryKey() as pk)
?gt - ?php echo object_input_hidden_tag(
- lt?php echo this-gtgetSingularName() ?gt,
- 'getlt?php echo pk-gtgetPhpName() ?gt
- ) ?
- lt?php endforeach ?gt
- code produit
- lt?php echo object_input_hidden_tag(article,
'getId') ?gt
56generator.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-gtgenerate('sfPropelAdm
inGenerator', parameters) - API documentation de sfGeneratorManager
- Exemple sfAdminGenerator et sfCRUDGenerator