# Conventions Chill en cours de rédaction ## Translations Par bundle, toutes les traductions des pages twig se trouvent dans un seul fichier `translations/messages.fr.yaml`. ## Emplacement des fichiers Les controllers, form type & templates twig sont placés à la racine des dossiers `Controller`, `Form` & `Ressources/views`, respectivement. Pour les pages Admin, on ne les mets plus dans des sous-dossiers Admin. ## Assets: nommage des entrypoints Trois types d'entrypoint: * application vue (souvent spécifique à une page) -> préfixé par `vue_`; * code js/css qui est réutilisé à plusieurs endroits: * ckeditor * async_upload (utilisé pour un formulaire) * bootstrap * chill.js * ... => on préfixe `mod_` * code css ou js pour une seule page * ré-utilise parfois des "foncitionnalités": ShowHide, ... => on préfixe `page_` Arborescence: ``` # Sous Resources/public - chill/ => theme (chill) - chillmain.scss -> push dans l'entrypoint chill - lib/ => ne vont jamais dans un entrypoint, mais sont ré-utilisés par d'autres - ShowHide - Collection - Select2 - module/ => termine dans des entrypoints ré-utilisables (mod_) - bootstrap - custom.scss - custom/ - variables.scss - .. - forkawesome - AsyncUpload - vue/ => uniquement application vue (vue_) - _components - app - page/ => uniquement pour une seule page (page_) - login - person - personvendee - household_edit_metadata - index.js ``` ## Organisation des feuilles de styles Comment s'échaffaudent les styles dans Chill ? 1. l'entrypoint **mod_bootstrap** (module bootstrap) est le premier niveau. Toutes les parties(modules) de bootstrap sont convoquées dans le fichier ```bootstrap.js``` situé dans ```ChillMainBundle/Resources/public/module/bootstrap```. * Au début, ce fichier importe le fichier ```variables.scss``` qui détermine la plupart des réglages bootstrap tels qu'on les a personnalisés. Ce fichier surcharge l'original, et de nombreuses variables y sont adaptées pour Chill. * On veillera à ce qu'on puisse toujours comparer ce fichier à l'original de bootstrap. En cas de mise à jour de bootstrap, il faudra générer un diff, et adapter ce diff sur le fichier variable de la nouvelle version. * A la fin on importe le fichier ```custom.scss```, qui comprends des adaptations de bootstrap pour le préparer à notre thème Chill. * ce ```custom.scss``` peut être splitté en plus petits fichiers avec des ```@import 'custom/...'``` * L'idée est que cette première couche bootstrap règle un partie importante des styles de l'application, en particulier ce qui touche aux position du layout, aux points de bascules responsive, aux marges et écarts appliqués par défauts aux éléments qu'on manipule. 2. l'entrypoint **chill** est le second niveau. Il contient le thème Chill qui est reconnaissable à l'application. * Chaque bundle a un dossier ```Resources/public/chill``` dans lequel on peut trouver une feuille sass principale, qui est éventuellement splittée avec des ```@imports```. Toutes ces feuilles sont compilées dans un unique entrypoint Chill, c'est le thème de l'application. Celui-ci surcharge bootstrap. * La feuille chillmain.scss devrait contenir les cascades de styles les plus générales, celles qui sont appliquées à de nombreux endroits de l'application. * La feuille chillperson.scss va aussi retrouver des styles propres aux différents contextes des personnes: person, household et accompanyingcourse. * Certains bundles plus secondaires ne contiennent que des styles spécifiques à leur fonctionnement. 3. les entrypoints **vue_** sont utilisés pour des composants vue. Les fichiers vue peuvent contenir un bloc de styles scss. Ce sont des styles qui ne concernent que le composant et son héritage, le tag ```scoped``` précise justement sa portée (voir la doc). 4. les entrypoints **page_** sont utilisés pour ajouter des assets spécifiques à certaines pages, le plus souvent des scripts et des styles. ## Taguer du code html et construire la cascade de styles L'exemple suivant montre comment taguer sans excès un élément de code. On remarque que: * il n'est pas nécessaire de taguer toutes les classes intérieures, * il ne faut pas répéter la classe parent dans toutes les classes enfants. La cascade sass va permettre de saisir le html avec souplesse sans alourdir la structure des balises. * souvent la première classe sera déclinée par plusieurs classes qui commencent de la même manière: ```bloc-dark``` ajoute juste la version sombre de ```bloc```, on ne met pas ```bloc dark```, car on ne souhaite pas que la classe ```dark``` de ```bloc``` interagisse avec la même classe ```dark``` de ```table```. On aura donc un élément ```bloc bloc-dark``` et un élément ```table table-dark```. ```html
``` Finalement, il importe ici de définir ce qu'est un bloc, ce qu'est une zone d'actions et ce qu'est un bouton. Ces 3 éléments existent de manière autonome, ce sont les seuls qu'on tagge. Par exemple pour mettre un style au titre on précise juste h3 dans la cascade bloc. ```scss div.bloc { // un bloc générique, utilisé à plusieurs endroits &.bloc-dark { // la version sombre du bloc } h3 {} ul { // une liste standard dans bloc li { // des items de liste standard dans bloc } } } div.mon-bloc { // des exceptions spécifiques à mon-bloc, // qui sont des adaptations de bloc } ul.record_actions { // va uniformiser tous les record_actions de l'application li { //... } } .btn { // les boutons de bootstrap .btn-edit { // chill étends les boutons bootstrap pour ses propres besoins } } ``` ## Render box ## URL ### Nommage des routes :::warning Ces règles n'ont pas toujours été utilisées par le passé. Elles sont souhaitées pour le futur. ::: Les routes sont nommées de cette manière: `chill_(api|crud)_bundle_(api)_entite_action` 1. d'abord chill_ (pour tous les modules chill) 2. ensuite `crud` ou `api`, optionnel, automatiquement ajouté si la route est générée par la configuration 3. ensuite une string qui indique le bundle (`main`, `person`, `activity`, ...) 4. ensuite, `api`, si la route est une route d'api. 5. ensuite une string qui indique sur quelle entité porte la route, voire également les sous-entités 6. ensuite une action (`list`, `view`, `edit`, `new`, ...) Le fait d'indiquer `api` en quatrième position permet de distinguer les routes d'api qui sont générées par la configuration (qui sont toutes préfixées par `chill_api`, de celles générées manuellement. (Exemple: `chill_api_household__index`, et `chill_person_api_household_members_move`) Si les points 4 et 5 sont inexistants, alors ils sont remplacés par d'autres éléments de manière à garantir l'unicité de la route, et sa bonne compréhension. ### Nommage des URL Les URL respectent également une convention: #### Pour les pages html :::warning Ces règles n'ont pas toujours été utilisées par le passé. Elles sont souhaitées pour le futur. ::: Syntaxe: ``` /{_locale}/bundle/entity/{id}/action /{_locale}/bundle/entity/sub-entity/{id}/action ``` Les éléments suivants devraient se trouver dans la liste: 1. la locale; 2. un identifiant du bundle 3. l'entité auquel il se rapporte 4. les éventuelles sous-entités auxquelles l'url se rapport 5. l'action Ces éléments peuvent être entrecoupés de l'identifiant d'une entité. Dans ce cas, cet identifiant se place juste après l'entité auquel il se rapporte. Exemple: ``` # liste des échanges pour une personne /fr/activity/person/25/activity/list # nouvelle activité /fr/activity/activity/new?person_id=25 ``` #### Pour les API :::info Les routes générées automatiquement sont préfixées par chill_api ::: Syntaxe: ``` /api/1.0/bundle/entity/{id}/action /api/1.0/bundle/entity/sub-entity/{id}/action ``` Les éléments suivants devraient se trouver dans la liste: 1. la string `/api/` et puis la version (1.0) 2. un identifiant du bundle 3. l'entité auquel il se rapporte 4. les éventuelles sous-entités auxquelles l'url se rapport 5. l'action Ces éléments peuvent être entrecoupés de l'identifiant d'une entité. Dans ce cas, cet identifiant se place juste après l'entité auquel il se rapporte. #### Pour les URL de l'espace Admin Même conventions que dans les autres pages html de l'application, **mais `admin` est ajouté en deuxième position**. Soit: `/{_locale}/admin/bundle/entity/{id}/action` ### Nommage des tables de base de donnée Lors de la création d'une nouvelle entité et de la table de base de données correspondante, nous suivons la convention d'appellation suivante pour la table de base de données : `chill_{bundle_identifier}_{nom_de_l'entité}`. Par exemple : chill_person_spoken_languages ## Règles UI chill ### Titre des pages #### Chaque page contient un titre Chaque page contient un titre dans la balise head. Ce titre est normalement identique à celui de l'entête de la page. Astuce: il est possible d'utiliser la fonction `block` de twig pour cela: ```htmlmixed= {% block title "Titre de la page" %} {% block content %}