Ci-dessous, les différences entre deux révisions de la page.
technique:guide:dev-appli-gestion [2017/10/04 21:44] admin créée |
technique:guide:dev-appli-gestion [2017/10/04 21:56] (Version actuelle) admin |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
====== Développement de l'appli de gestion ====== | ====== Développement de l'appli de gestion ====== | ||
+ | ===== Généralités ===== | ||
+ | L'application est écrite en PHP, avec le FrameWork [[https://cakephp.org/|CakePHP]] version 3. Il a pas mal de documentation et une communauté française [[http://www.cakephp-fr.org/|ici]]. | ||
+ | Ce framework n'est pas aussi répandu que Symphony ou d'autres, en revanche il est très efficace pur faire les 80% premier pourcent d'une application. Il sait générer une appli web qui permet de modifier le contenu d'une base de données simplement à partir du schéma de la base et de conventions de nommage. | ||
+ | |||
+ | ===== Les conventions de Cake pour la BDD ===== | ||
+ | |||
+ | * nom de table : pluriel lowercase, exemple : ''adherents'' | ||
+ | * clé primaire : ''id'' | ||
+ | * clé étrangère : <nom_table_singulier>_id, exemple : ''adherent_id'' | ||
+ | |||
+ | Cake c'est déployable avec un outil qui s'appelle Composer (un package manager PHP). | ||
+ | |||
+ | L'outil de génération de CRUD s'appelle Bake (//to bake a cake//, logique) | ||
+ | |||
+ | ===== Liens utiles ===== | ||
+ | |||
+ | * Faire un thème pour bake (en français) | ||
+ | * [[http://book.cakephp.org/3.0/en/bake/development.html#creating-a-bake-theme]] | ||
+ | * Rendre bake moins con avec les ENUM MySql | ||
+ | * [[http://www.dereuromark.de/2010/06/24/static-enums-or-semihardcoded-attributes/]] (indices tout en bas de page) | ||
+ | * [[http://www.slideshare.net/josezap1/advanced-querying-with-cakephp-3]] ( diapo 9 ) | ||
+ | * Validation de formulaire, tous les types de validation supporté par défaut dans Cake | ||
+ | * [[http://api.cakephp.org/3.0/class-Cake.Validation.Validation.html]] | ||
+ | * et pour en créer : [[http://book.cakephp.org/3.0/en/core-libraries/validation.html#creating-validators]] | ||
+ | * Cheat sheet (Feuille mémo / de triche) | ||
+ | * [[http://cake3.codaxis.com/]] | ||
+ | |||
+ | |||
+ | ===== Liens de choses qui pourraient être intégrés ===== | ||
+ | |||
+ | * ''addBehavior('Timestamp')'' et ''addBehavior('Logging')'' | ||
+ | * [[http://book.cakephp.org/3.0/en/orm/table-objects.html#basic-usage]] | ||
+ | * Format de dates | ||
+ | * ''$article->created->format(DATE_RFC850)'' | ||
+ | * Champ de recherche | ||
+ | * [[http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#finding-key-value-pairs]] | ||
+ | * [[http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#dynamic-finders]] | ||
+ | * soft deletion pour par mal d'objets | ||
+ | * [[http://book.cakephp.org/3.0/en/orm/query-builder.html#passing-conditions-to-contain]] | ||
+ | * debug requêtes | ||
+ | * [[http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#debugging-queries-and-resultsets]] | ||
+ | * Bonne doc pour faire des requêtes avec l'ORM de Cake | ||
+ | * [[https://github.com/lorenzo/cakephp3-examples/raw/master/slides.pdf]] | ||
+ | |||
+ | |||
+ | ===== Liste de plugins à envisager ===== | ||
+ | |||
+ | [[https://github.com/FriendsOfCake/awesome-cakephp]] | ||
+ | |||
+ | * Geolocation | ||
+ | * [[http://stackoverflow.com/questions/32307780/getting-gps-mobile-location-data-in-cakephp-3]] | ||
+ | * [[https://github.com/dereuromark/cakephp-geo/blob/master/tests/TestCase/Model/Behavior/GeocoderBehaviorTest.php]] | ||
+ | * Images (photos des fiches d'adhesions) | ||
+ | * [[https://github.com/josbeir/image]] | ||
+ | * [[https://github.com/davidyell/CakePHP3-Proffer/blob/master/docs/configuration.md]] | ||
+ | * Search | ||
+ | * [[https://github.com/FriendsOfCake/search]] | ||
+ | * [[https://github.com/CakeDC/search/blob/master/Docs/Documentation/Examples.md]] | ||
+ | |||
+ | |||
+ | ===== Quelques exemples glanés dans la doc pour les validations ===== | ||
+ | <code php> | ||
+ | namespace App\Model\Table; | ||
+ | |||
+ | use Cake\ORM\Table; | ||
+ | use Cake\ORM\RulesChecker; | ||
+ | use Cake\ORM\Rule\IsUnique; | ||
+ | |||
+ | class ArticlesTable extends Table | ||
+ | { | ||
+ | public function initialize(array $config) | ||
+ | { | ||
+ | $this->primaryKey('my_id'); | ||
+ | $this->addBehavior('Timestamp', [ | ||
+ | 'events' => [ | ||
+ | 'Model.beforeSave' => [ | ||
+ | 'created_at' => 'new', | ||
+ | 'modified_at' => 'always' | ||
+ | ] | ||
+ | ] | ||
+ | ]); | ||
+ | } | ||
+ | |||
+ | public function validationDefault(Validator $validator) | ||
+ | { | ||
+ | $validator | ||
+ | ->requirePresence('title', 'create') | ||
+ | ->notEmpty('title'); | ||
+ | |||
+ | $validator | ||
+ | ->allowEmpty('link') | ||
+ | ->add('link', 'valid-url', ['rule' => 'url']); | ||
+ | |||
+ | $validator | ||
+ | ->add('title', 'notEmpty', [ | ||
+ | 'rule' => 'notEmpty', | ||
+ | 'message' => __('You need to provide a title'), | ||
+ | ]) | ||
+ | ->add('body', 'notEmpty', [ | ||
+ | 'rule' => 'notEmpty', | ||
+ | 'message' => __('A body is required') | ||
+ | ]); | ||
+ | |||
+ | $validator->add('email', 'valid', [ | ||
+ | 'rule' => 'email', | ||
+ | 'message' => 'Invalid email' | ||
+ | ]); | ||
+ | |||
+ | $validator | ||
+ | ->add('role', 'validRole', [ | ||
+ | 'rule' => 'isValidRole', | ||
+ | 'message' => __('You need to provide a valid role'), | ||
+ | 'provider' => 'table', | ||
+ | ]); | ||
+ | return $validator; | ||
+ | } | ||
+ | |||
+ | public function isValidRole($value, array $context) | ||
+ | { | ||
+ | return in_array($value, ['admin', 'editor', 'author'], true); | ||
+ | } | ||
+ | |||
+ | public function buildRules(RulesChecker $rules) | ||
+ | { | ||
+ | // Add a rule that is applied for create and update operations | ||
+ | $rules->add($rules->isUnique(['email'])); | ||
+ | |||
+ | |||
+ | $rules->add(function ($entity, $options) { | ||
+ | // Return a boolean to indicate pass/failure | ||
+ | }, 'ruleName'); | ||
+ | | ||
+ | // Add a rule for create. | ||
+ | $rules->addCreate(function ($entity, $options) { | ||
+ | // Return a boolean to indicate pass/failure | ||
+ | }, 'ruleName'); | ||
+ | | ||
+ | // Add a rule for update | ||
+ | $rules->addUpdate(function ($entity, $options) { | ||
+ | // Return a boolean to indicate pass/failure | ||
+ | }, 'ruleName'); | ||
+ | | ||
+ | // Add a rule for the deleting. | ||
+ | $rules->addDelete(function ($entity, $options) { | ||
+ | // Return a boolean to indicate pass/failure | ||
+ | }, 'ruleName'); | ||
+ | | ||
+ | return $rules; | ||
+ | } | ||
+ | } | ||
+ | </code> |