First created: 24 décembre 2011. Ihari. Last modified: 17 janvier 2012. Ihari Last modified: 03 février 2012. Ihari. Last modified: 27 août 2013. Ihari. Last modified: 27 mai 2015. Ihari. Last modified: 6 janvier 2016. Ihari. Last modified: 28 juin 2017. Ihari. Last modified: 28 août 2018. Ihari. Last modified: 17 octobre 2019. Ihari. Last modified: 20 octobre 2019. Ihari. Last modified: 19 septembre 2020. Ihari. Pour commencer: =============== En ligne de commande, se positionner au dessus du chemin web où on désire créer un répertoire *temporaire* pour le projet: $ cd /var/www/html/temppath/ Récupérer le code source du projet template en ayant obtenu préalablement le mot-de-passe pour l'utilisateur ibdev, ou en ayant mis en place un login sans mot-de-passe entre votre poste et le serveur hébergeant le dépôt central Git: $ git clone ssh://ibdev@51.255.32.138:22/opt/git/ci226.git %temppath% Entrer dans le dossier nouvellement créé et passer dans la branche develop: $ cd %temppath% $ git checkout develop Supprimer le sous-répertoire .git afin de couper le lien avec le dépôt de départ, car il s'agit de commencer un nouveau projet. Sans la suppression du dosier .git le code est toujours lié au dépôt du template en ligne, ci226.git. Or nous voulons créer un nouveau projet, et non pas modifier notre projet template. $ rm -rf .git Pour continuer, aller dans le navigateur, ouvrir le site en local et suivre les instructions: http://localhost/temppath/ ======= ATTENTION: N'est plus compatible avec PHP 5.3 depuis l'utilisation de la fonction debug_backtrace() dans application\libraries\BusinessCollection.php. Affichera une erreur concernant un crochet "[". ATTENTION: N'est plus compatible avec PHP 5.4 depuis l'utilisation de password_hash() et password_verify(). ATTENTION: Est compatible avec PHP 7.x depuis l'adaptation de la classe SmartDate. Les tests unitaires exécutés sur le package sont au vert pour 7.0, 7.1, 7.2 et 7.3. On peut donc utiliser ce package en production pour PHP 5.5 à 7.3. ATTENTION: 2019/11/17. L'utilisation de random_bytes() dans AuthenticationManager:GenerateOneTimeToken() rend ce package incompatible avec PHP 5. Si on veut redescendre la compatibilité (à 5.5+ d'après ci-dessus), on doit modifier cette méthode pour utiliser plutôt openssl_random_pseudo_bytes(), qui fait partie de l'extension OpenSSL, laquelle doit donc être présente sur les postes de développement et sur l'hébergement. ======= 2019/10/20 Composer keep local changes: on a adapté un composant tiers, et on désire conserver les modifications lorsqu'on fait un composer intall sur un nouveau poste: NEW & GOOD: Dans composer.json, faire pointer vers le référentiel Git où est le package ; c'est tout. OLD: https://stackoverflow.com/questions/17426192/composer-using-a-local-repository https://markshust.com/2019/01/01/locally-overriding-or-extending-third-party-composer-modules/ https://www.sitepoint.com/local-composer-for-everyone-a-conference-friendly-satis-setup/ https://getcomposer.org/doc/articles/handling-private-packages-with-satis.md https://johannespichler.com/developing-composer-packages-locally/ 2018/08/28 Les additifis intéressants dans les mois passés - Gestionnaire de A&A complet en UI: il ne resterait plus qu'à 1) exposer une grille rapide 2) two-way affectatino dans les features (instead of privileges only) - Gestionnaire de settings (key, value, desc) - TODO: Gestionnaire de logs (view, download, delete ; inspiration: https://github.com/laravel-backpack/logmanager) - TODO: Database backup manager comme sur https://github.com/laravel-backpack/backupmanager (with date, download, delete) - TODO: Integrate a file/media manager (bud elFinder is visually not good) Inspired partially by https://backpackforlaravel.com/ and https://laravelvoyager.com/features/ but started well befor encoutering them Integrate https://rollbar.com/ logging in order to have alerts and online analysis Améliorer sinon notre logging actuel dans la localisation de l'erreur (fichier...) Inclusions XML: https://stackoverflow.com/questions/5121052/can-we-import-xml-file-into-another-xml-file http://www.xml.com/pub/a/98/08/xmlqna2.html http://xmlwriter.net/xml_guide/entity_declaration.shtml Données exemples https://github.com/fzaninotto/Faker https://github.com/bit3/faker-cli => https://github.com/bit3/faker-cli/releases "Whether you need to bootstrap your database, create good-looking XML documents, fill-in your persistence to stress test it, or anonymize data taken from a production service, Faker is for you. "For a quick generation of fake data, you can also use Faker as a command line tool thanks to faker-cli." Différents autoloads à l'oeuvre: Preemptive autoload CodeIgniter {DFB61561-1A08-4023-8FD7-9D4934CF0EF2} Ajout chemins alternatifs {8A8257F1-2C24-4283-9A58-6F99D6267247} Lazy autoload [queue] order Composer {9513F2B7} application/third_party/vendor/composer/ClassLoader.php Custom SPL autoload {186159DC-B820-41f9-9EE2-0EFE1AFF4106} application/config/autoload_namespaced_models.php Codeception pour les tests fonctionnels et d'acceptance http://codeception.com/quickstart http://codeception.com/10-03-2012/5-reasons.html http://codeception.com/05-06-2013/specification-testing-coparison.html https://www.quora.com/Whats-your-experience-with-moving-from-Behat-to-Codeception Pour la comparaison automatisée de deux db MySQL (mai pas deux scripts) https://github.com/dlevsha/compalex (avec l'inconvénient de vouloir habiller le résultat, rendant l'utilisation en CLI plus délicate) REST API authentication 2017/11/21 https://stackoverflow.com/questions/7999295/rest-api-authentication https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf https://dev.twitter.com/oauth http://blog.restcase.com/restful-api-authentication-basics/ [Optionnel, peser l'utilité] La gestion de la config dans une page oblige en principe à utiliser une table de base de données, au lieu et en place des fichiers et entrées de config de CodeIgniter. Si nous voulons cette gestion de config, i.e. sans aller dans les fichiers et en étant faisable par un utilisateur (non dév), nous avons le choix entre: 1) Modifier les appels dans le code pour être plus générique: a) Créer un service avec une méthode appelable en ApplicationConfig->Item(); b) Permettre l'injection d'une bibilothèque à l'instanciation du service: soit avec $this->config->item() en sous-jacent (et on peut remettre la problématique de la gestion de config à plus tard, voir deuxième option ci-après), soit avec une table de base de données et son CRUD. 2) Laisser les appels en $this->config->item() mais a) développer un parser de fichier de config, b) dédier un fichier de config spécifique qui puisse être modifié par ce parser sans déranger les autres fichiers. Au final, les deux sont complémentaires: si on n'a pas le temps, la solution 1 prépare le futur, si on le temps la solution 2 apporte la souplesse complète. Permettre le basculement entre plusieurs façons de gérer la config: soit dans un fichier config de php, soit dans une table de base de données Pour tester le web (pas le CLI) à partir de PHPUnit: Pour les fonctionnalités peut-être, mais même avant pour tester des configs qui sont différentes de celles du CLI: des valeurs dans PHP.INI, la façon de tourner de PHP: en monde "apache2handler" ou "CGIxxx" ? etc. Piste 1: Question: Is there a headless browser library for PHP? https://stackoverflow.com/questions/6578132/php-headless-browser Réponse: PhantomJS - http://phantomjs.org/ PhantomJS is a headless WebKit with JavaScript API. It has fast and native support for various web standards: DOM handling, CSS selector, JSON, Canvas, and SVG. You can couple it with something like php-PhantomjsRunner (now deprecated, https://github.com/diggin/php-PhantomjsRunner) or bake your own (https://stackoverflow.com/questions/10651320/starting-phantomjs-server-from-php-and-waiting-for-its-response). When setup and ready to start testing with PhantomJS, pick out one of the various Testing Frameworks at your disposal (http://phantomjs.org/headless-testing.html). I recently also came across this tutorial from tutsplus should it help anyone (http://net.tutsplus.com/tutorials/javascript-ajax/testing-javascript-with-phantomjs). Piste 2: Cette fois-ci pour les tests fonctionnels eux-mêmes https://blog.moove-it.com/running-selenium-on-a-headless-server-and-running-tests-with-phpunit/ "The aim of this article is to show you how to set up a Selenium server, with or without Xserver, and run PHP unit tests on a web page." Désactiver les réglages PHP dans .htaccess Le fait que ces réglages ne sont pas effectifs en mode CGI, nos hébergements, fait qu'il sont trompeurs pour le développeur inexpérimenté. Exemple: il règle les max uplods & co. dans le .htaccess, sans savoir/se souvenir que cela n'aura aucun effet une fois enligne, et qu'il aurait fallu régler directement dans le .ini. Une fois que nous serons passés en CI3: . https://medium.com/@smile2gether/https-medium-com-smile2gether-getting-start-with-ciphpunittest-implement-unit-testing-in-php-codeigniter-cb85f2147ebd . http://blog.a-way-out.net/blog/2015/06/12/codeigniter3-phpunit/ . http://www.spidersoft.com.au/2015/phpunit-and-codeigniter-3-0/ . "Remember Me" feature best practice: https://stackoverflow.com/questions/549/the-definitive-guide-to-form-based-website-authentication#477579 https://stackoverflow.com/questions/244882/what-is-the-best-way-to-implement-remember-me-for-a-website https://stackoverflow.com/questions/7214458/remember-me-cookie-best-practice DONE. Installation de Composer d'après https://philsturgeon.uk/php/2012/05/07/composer-with-codeigniter/ . Création de application/third_party/composer.json avec un premier composant ("moneyphp/money" par exemple) et exécution. => Cela crée le fichier composer.lock qu'il ne faut pas supprimer, et surtout le dossier vendors/ sous lequel s'installe des éléments de Composer et le ou les composants spécifiés. . Exploitation de Composer à la fois pour le versant web et les tests unitaires pour les chargement des composants désirés. Cette ligne est à mettre *avant* la ligne qui charge core/CodeIgniter.php: ./index.php: include_once APPPATH . 'third_party/vendor/autoload.php'; ./application\third_party\CIUnit\bootstrap_phpunit.php: include_once APPPATH . 'third_party/vendor/autoload.php'; . NE PAS oublier de modifier l'index.php sur sur la préproduction et la production. . NE PAS oublier de modifier bootstrap_phpunit.php sur l'intégration continue. . On peut alors utiliser directement les composants autoloadés dans le code: models, controllers, etc.: DONE. Installation du composant Money, http://moneyphp.org/, https://github.com/moneyphp/money via Composer . La documentation officielle préconisait "$ composer require moneyphp/money" Nous avons préféré écrire le suivant dans le fichier composer.jso: { "require": { "moneyphp/money": "*" } } Puis nous avons pu faire dans le code, exemple dans un tests\libraries\MoneyTest.php (testé OK) : use Money\Currency; use Money\Money; class MoneyTest extends CIUnit_TestCase { var $MyReader; public function testMoneyUsagePatterns() { $value1 = Money::EUR(800); // €8.00 $value2 = Money::EUR(500); // €5.00 $result = $value1->add($value2); // €13.00 $this->assertEquals("1300", $result->getAmount()); } } A INTEGRER avec exemples: . DONE. 2017-11-24 Namespaces: . Tentative de mise en oeuvre: https://stackoverflow.com/questions/3700626/namespace-in-php-codeigniter-framework . Poor man's: https://stackoverflow.com/questions/22410710/codeigniter-custom-libraries-and-namespaces . Explore: "CodeIgniter 2 and namespaces" . DONE. Enum . DONE. BusinessCollection . DONE. AnomaliesManager et AnomaliesManagerCollection (dont dans Solidis 13-I, ci_boawf) Attention au 2017-10-23 AnomaliesManagerCollection est inutilisée au profit d'un simple tableau associatif (Agetipa 17-I). . phpmailer.php, class.phpmailer.php, class.pop3.php et class.smtp.php de BOAVS 2011 : Utiles ? ne serait-ce que parce que le mail() basique utilisé par CI n'existe pas sur Windows... https://github.com/PHPMailer/PHPMailer continue à être actif en tout cas en 2016-2017 A du sens puisque le composant Email.php de CI utilise mail() ou sendmail() ou smtp() et que tous les trois ne sont pas polyvalents pous nos usecases Windows en développement. . Utilisation de Postman pour les specs et les tests d'API ? https://www.getpostman.com . Porter SmartDate en DateTime (sans limites) et PHPUnit. S'insprirer aussi de Moment.php (https://github.com/fightbulc/moment.php) et de Carbon (http://carbon.nesbot.com/) . Géolocalisation avec https://ipinfo.io ou https://freegeoip.net . Météo avec https://openweathermap.org/ (y compris avec l'aide de la géolocalisation) . Facebook Connect . Auth0 Design . AdminLTE comme UI, https://adminlte.io/ comme admin UI and control panel pour nos backoffices. Open source et basé sur Bootstrap 3 . http://www.initializr.com/ Générateur enligne pour générer un template basé sur HTML 5 Boilerplate(*) en mobile-first responsive, avec Modernizr, Bootstrap et jQuery. Egalement inclut Google Analytics, Favicon, Apple and Windows icons (?), Robots.txt, Humans.txt, .htaccess, 404 page, Adobe Cross Domain (?), plugin.js (?) => Idée: comme arrivera en fin de vie en décembre 2017, prendre une version pour nous que l'on personnalisera et conservera. Sinon, devrons nous rabattre sur HTML5 Boilerplate (ci-après) et assembler les éléments qui nous intéressent nous-mêmes. HTML5 Boilerplate est un template HTML5 puissant et fiable créé et maintenu par Paul Irish, de Google, et Divya Manian. Boilerplate est constitué d'un ensemble de fichiers HTML, CSS et JavaScript, qui servent à bien démarrer un projet HTML5. Il inclut également des outils très utiles tels que Modernizr, jQuery, et un reset de CSS. http://html5boilerplate.com/ Modernizr est un détecteur de support des fonctionnalités HTML5 et CSS3 qui inclut HTML5shiv. Il s'agit d'un fichier JavaScript qui va créer un objet Modernizr contenant des propriétés indiquant pour chaque fonctionnalité si elle fonctionne ou non dans votre navigateur. Lire aussi analyse du mélange H5BP et Bootstrap ici: https://www.upwork.com/hiring/development/bootstrap-vs-boilerplate/ Lecture de fichiers Excel/CSV . MICTSL clients et factures . Baobab 13-I . Extranet Datagrafix . BOA virement salaires Baobab 13-I . Backup de base de données dans . MUHistoriqueColonne . Spreadsheet_Excel_Writer . crons BOAWorkflow ci_boawf . Photo instantanée (clonage?, IClonable interface ?) . 2015\ci_boawf\application\controllers\cli pour des actions en ligne de commande . D:\DataFiles\www\2015\ci_boawf\aissa_gateway.php Agetipa 17-I . Large scale use of model namespacing AccesBanqueSimulateur . Exposure of REST API MictslPaiement 17-I . $_SetupRanOnce for unit tests . Application settings NordsoftNC 19-I . 404 handling (route, custom controller, custom view) D:\DataFiles\www\jorani: . OAuth2 (et Auth0 alors ?) . libraries\MY_Email.php and third_party PHPMailer: CodeIgniter compatible email-library powered by PHPMailer. . PHPExel integration de meme in libraries and in third_party (Jorani, 2014) moved from CodePlex in around 2012 => https://github.com/PHPOffice/PHPExcel => moved to PHPOffice/PhpSpreadsheet : https://github.com/PHPOffice/PhpSpreadsheet => Mars 2017: "PhpSpreadsheet is still unstable and not yet released. So if you need stability stick to PHPExcel until this project is released." . phpseclib : très riche en cryptage, protocoles, encodage et même "bigint" . The VObject library for PHP allows you to easily parse and manipulate iCalendar and vCard objects D:\DataFiles\www\2014\datagrafixmg\ highcharts calendar mpdf en remplacement de html2pdf tabber D:\DataFiles\www\2008\IboniaLEC08I\ system\application\libraries\ibpagination.php D:\DataFiles\www\2008\IboniaLEC08I\system\application\libraries\amcharts\ (ou voir celui utilisé dans 2014\datagrafixmg) D:\DataFiles\www\2012\Oublipa12I\ application\libraries\rb.php RedBean (OLD!) integration application\third_party\rb D:\DataFiles\www\2012\SMBUpdate12I\ system\application\libraries\highlight_search.php NEW à documenter: 1. Exemple d'exécution d'un controleur dédié au CLI (command-line) avec application\controllers\cli\cliexample.php 2. REST server intégré et exemple avec application\controllers\apiexample.php (a descendre dans son sous-reprtoire api/) [!] Attention: la base de données minimale requise pour ce package est fournie sous forme de scripts SQL dans application\third_party\currentuser\database\test\, soit table par table, soit en deux scripts globaux de structure et de données exemples. Lire d'ailleurs le fichier readme-ibonia.txt qui y figure. [!] Sur les hébergements où la précédence est à index.html par rapport à index.php (la majorité), comprendre qu'une page "403 Forbidden" peut être juste le chargement de l'index.html par défaut que fournit le package. Il faut le renommer par exemple en index.html.DISABLED (Ou bien faire le renommage en index.html.default dans le package source !) pour que le semblant d'erreur disparaisse. Une alternative est d'inverser dans Apache ou dans les réglages du site la précédence des deux pages QU'EST-CE QUE C'EST ? ===================== Ceci est une intégration prête à l'emploi de: --------------------------------------------- . CodeIgniter 2.2.3: le framework de développement d'applications PHP http://codeigniter.com ou http://ellislab.com/codeigniter. (Note: la version précédemment packagée était la 2.1.4). . my-ciunit 0.16: la couche d'intégration donnant accès au PHPUnit pré-installé. https://bitbucket.org/kenjis/my-ciunit Les tests sont organisés dans un répertoire "\tests" et s'exécutent en lançant simplement $ phpunit . Behat 2.3.2: l'outil de spécification fonctionnelle de référence sur PHP http://www.behat.org Les features sont organisés dans un répertoire "\features" et s'exécutent en tapant simplement $ beh Sont de plus apportées les améliorations principales suivantes: --------------------------------------------------------------- Améliorations du framework: - Support du français pour le framework et choix du français comme langue par défaut. - Support du multillingue pour l'application (%lang%\application_lang.php). - Fichier de configuration de l'application (config_application.php) différencié de celui du framework. Fonctionnalités: - Excel972003Reader: bibliothèque de lecture de fichiers Excel. - HTML2PDF: bibliothèque pour produire du PDF à partir d'une mise en forme HTML. - SmartDate: value object de type date avec des fonctionnalités avancées. - AnomaliesManager: classe facilitant le support des business rules dans les entités. Sécurité: - Un gestionnaire d'authentification et d'autorisations (CurrentUser). - Interdiction optionnelle de mise en cache des pages, base de la sécurité après fermeture/perte de session. Il suffit d'un $this->output->nocache() avant de charger une vue. Support de développement: - Cinq (05) environnements distincts pour supporter un processus de développement professionnel: * "development" et "testing" pour le local; * "testing_online", "preprod" et "production" pour l'enligne. - Production et chargement de jeux de données de test pour PHPUnit et Behat. Les jeux de données sont au format YAML et deux scripts PHP sont fournis pour leur génération. - Script de build Phing pour aider à l'intégration continue. - Script Rsync pour aider à la mise enligne sur un serveur distant. - Différents scripts de contrôle qualité, de métriques et de documentation automatique (nécessitent la présence préalable des outils correspondants via PEAR): * PHPCPD (PHP Copy/Paste Detector) // Détection des copiers-collers de code (sources de bugs) * PHP_CodeSniffer // Validation du respect des normes de codage * PHPDoc // Génération de documentation d'API (sur les modèles et libraries notamment) * PHPMD (PHP Mess Detector) // Mesure de saleté de code: taille excessifs, fouillis, nommages, codes morts * PHPUnit code coverage // Mesure du taux de couverture des tests unitaires Améliorations additionnelles: ----------------------------- Améliorations du framework: - Stockage des sessions dans une table pour plus de sécurité (ci_sessions) sans les problèmes de surchage de données. - Default de utf8_unicode_ci pour la collation mysql (au lieu de utf8_general_ci). Sécurité: - Un .htaccess préparé à la fois * pour Windows et Linux (Debian), * pour l'url rewriting, * la suppression d'index.php, * les paramètres d'upload de fichiers et de tailles méoires pour PHP, * et la bonne gestion des caractères étendus. - Un php.ini.forcgi qui reprend les paramètres PHP mis normalement dans .htaccess mais qui deviennent inacessibles si PHP tourne sur le serveur web en mode CGI (cas de la quasi-totalité des hébergements). - index.html affichant un "403 Forbidden" dans tous les répertoires. - Erreur 404 avec le message d'erreur caché par défaut (montré par défaut dans le CI de base). Support de développement: - Détection de l'environnement PHP avec un phpinfo() déguisé dans test_environment_01.php. - Détection rapide du bon fonctionnement de PHP+MySQL avec le script test_environment_02.php. - Templates de tests unitaires dans les différents répertoires: models, controlers, libraries, helpers, system, etc. - Tests unitaires basiques pour tester l'environnement Apache de l'application. - Tests unitaires basiques pour tester l'environnement PHP de l'application. - Test unitaire basique pour amorcer un test de l'UI avec Selenium (appelé à être remplacé par Behat\Mink) - application_unittests_helper.php: Fonctions pour faciliter les tests unitaires comportant des uploads. Fonctionnalités diverses: - ChiffreEnLettre: librairie sommaire pour transformer un nombre en lettres en français. - application_helper.php: Différentes fonctions de validations et de utilitaires maison. Voir : Pour plus d'informations, voir le document "YYYY-MM-DD Les améliorations de notre package CI.docx" HISTORIQUE ========== Cette version remplace le package basé sur la version 2.1.0 de CodeIgniter. Elle n'intègre plus DatamapperORM qui a commencé à vieillir et que nous pourrions vouloir remplacer par ReadBeanPHP ou autre. DatamapperORM attend une version 2 hypothétique et nous avons fait le choix de cet ORM à l'époque après s'être heurté à la lourdeur d'exécution de Doctrine dans les applications de la vie réelle. Cette version ne tente plus également de supporter SQLite. Le présent package a été testé avec PHPUnit 3.6.7 et 3.7.24 et devrait être compatible avec les versions ultérieures. Noter que PHPUnit doit être installé préalablement, habituellement via PEAR. my-ciunit ne semble plus évoluer depuis quelque temps, mais c'est la seule intégration valable entre CI et PHPUnit que nous ayons trouvé et elle est très satisfaisante, surtout avec l'ajout des fonctionnalités de chargement de jeu de données. C'est un projet qui est passé de main en main et le nom générique pour leurs différentes version au fil du temps est "CIUnit". my-ciunit est la dernière version développée par Kenji Suzuki et c'est celle qui a fait à ce jour l'effort d'être compatible avec CodeIgniter 2.1.0. Ce package prouve qu'elle est aussi compatible avec les versions ultérieurs jusqu'à la 2.1.4. INSTALLATION ============ L'installation a été documentée dans le fichier: "Kbase package CodeIgniter Ibonia - Install Checklist vXXX.doc" Lire cette documentation formattée plutôt que de trouver les instructions ici. TODOs ===== 1. Enlever la dépendance de CurrentUser à DatamapperORM avec tests unitaires à l'appui (les tests existent déjà ; le détachement est à faire). Si possible rendre le code indépendant de la couche d'accès aux données utilsée (en vue RedBeanPHP et autres). 2. Adaptation de SmartDate pour utiliser le DateTime de PHP 5.1/3+. Portage optionnel des tests de SmartDate vers PHPUnit. 3. Développement et intégration SmartPeriod, classes soeur de SmartDate pour la gestion périodes. Portage optionnel des tests également vers PHPUnit. 4. Ajouter le support en lecture d'Excel 2007-2010. 5. Développer le support en lecture des fichiers Texte/CSV. ROADMAP ======= Ce package devrait servir de base à un package intégrant RedBeanPHP et peut-être d'autres ORMs.