====== 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 : _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 ===== 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; } }