# Programmation PHP/Exemples/MiniCMS/Implémentation

* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
* Introduction
* Installer PHP
* Composer
* IDE
** PhpStorm
** NetBeans
** Eclipse
** Visual Studio Code
* Bases du langage
** Commentaires
** Premier programme
** Variables
** Variables superglobales
** Constantes
** Opérateurs
** Fonctions
** Tableaux
** Structures de contrôle
** Boucles
* Programmation avancée
** Dates
** Sessions
** Cookies
** Cache
*** Memcached
*** Redis
** Formulaire
** Fichiers
*** Objets COM
*** Images
** Mails
** Sécurité
** Programmation orientée objet
** Bases de données
*** Microsoft SQL Server
*** MySQL
*** PDO
*** SQLite
** Expressions rationnelles
** Code de haute qualité
*** Analyse statique de programmes
** Exceptions
** Xdebug
** Mots réservés
* Apprendre par l'exemple
** Utilisation de variables
** Un sommaire simple
** Interaction avec un formulaire
** Afficher le résultat d'une requête BDD
** Modifier une table
** Faire un livre d'or
** Faire un mini forum de discussion
** Parser avec DomXml
** Coder en MVC
** Faire un webservice
** Vérification RIO
** AJAX
** Sommaire en Ajax
** Mise à jour périodique d'un cadre
** Mini CMS
** Introduction
** Développement
*** Les couches choisies
*** Code de service
*** Modélisation
*** Implémentation
*** La vue
*** Ajaxification
*** Premier noyau
*** Fournir les données
*** IHM
** Rétrospective
** Conclusion
* Extensions PHP
** cURL
** DOMDocument
** JSON
** MING
** SPL
* Bibliothèques externes
** ADODB
** DOMPDF
** FPDF
** PHPExcel
** PHPMailer
** PHPWord
** RabbitMQ
* Cadriciels
** CakePHP
** PEAR
** Symfony
** Frameworks de tests
*** PHPUnit
*** SimpleTest
*** Behat
* Logiciels métier
* Problèmes connus
[ Modifier le sommaire ]
Nous avons besoin des fonctionnalités :
TODO
    [1] Complétion des données
       (none) Create
       (done) Read
       (done) Update
       (done) Delete
    [2] Gestion des users
    [3] Complétion du frameset via templates
       (done) injection point replacer
    [4] Un webService pour les inputs&query distants
       (none) common web services
    [5] Parser de snippet
       (do ) php snippet acter
          (none) class writer & executer
          (do ) single actions executer
    [6] Vue xhtml fonctionnelle ajaxifiée
       (done) xhtml template "nested"
NICE TO HAVE
    [1.1] Versionning sur données
       (todo) new crop creating passing current to old
Le but étant de fournir un maximum de code de service pour les héritages futur le métier n'est approché qu'en vue de personnaliser le CMS client.
Concernant l'approche modulaire :
La segmentation en composantes (classes ou scriptlets) permets un découpage net et précis des différentes parties du projets développable séparément les unes des autres. L'association au sein d'un IHM ou couche de présentation via contrôleur, venant :
* avant (pour orienter le développement)
* pendant (pour stabiliser le développement)
* après (pour finaliser le développement)
L'interface utilisatrice devant tirer parti des composantes et non l'inverse. La richesse des fonctionnalités est dégagée par le service et enclavé par un code orienté solution client. Il va donc de soi de privilégier proprement, pour enrichir ses propres librairies, de chercher le plus possible à développer ses classes et composantes plutôt que de perdre son temps en métier.
Concevoir du code de haute qualité signifie souvent d'optimiser le code vers une solution à logique 'customer' càd spécialisée, ce qui n'est pas recherché lorsque l'on doit se développer de l'expérience sur le terrain. Au possible, il faut adapté sa modularité et péricliter le service en business pour le client.
Concevoir du code modulaire permets de développer concrètement sans trop d'efforts d'analyse pour les développement XP et sur un grand délais. Il est utile d'avoir conscience de ces deux approches sur le terrain ou lorsque l'on décide d'ouvrir son code au monde. La majorité des développeur ne faisant trop souvent qu'intégrer pour l'argent ou la renommée chez le client le fruit du travail des autres.
'Classes & Fermes de fonctions' contre 'scriptlets'
Les premières sont :
* plus simple à coder,
* plus simple à utiliser,
* plus simple à entretenir,
* plus simple à spécialiser,
* plus facilement réutilisable,
* plus orienté objet,
* plus susceptible d'être récupéré.
Les secondes sont :
* plus cryptiques,
* plus optimisée pour le client,
* aisément traductible en classes et fermes,
* plus fonctionnelle,
* plus procédurales,
* plus chaotiques.

#### [1] Complétion des données

Pour disposer des fonctionnalités de gestion de données.
* On a besoin de Getter/Setter de données :
    - depuis la vue
    - depuis le webservice
    - depuis l'URL
* Pour les fichiers xml
Les fonctionnalités d'appels sont regroupées ci-dessous
On implémente ces fonctions utilitaires à utilities.class.php
On implémente la méthode getContentByData du dataManager
Un test du getContentByData nous rend nominal pour cette phase dans cette modélisation métier. Le refactoring du business en services serait apprécié...
    -> Sur l'input crop1.xml
    -> On a pour résultat :
Le deuxième test de get par l'id est également concluant
Son résultat étant :
On implémente à utilities.class.php les méthodes :
et à la classe dataManager.class.php
Le test suivant permet de valider la phase d'écriture :
avec le resultat

##### Liste des défauts

* searchContents / getContentByData est du code métier
    -> le transcrire en code de service
* pour la suppression, delete reste à implémenter correctement
    -> à dataManager

#### [2] Gestion des utilisateurs

La gestion des utilisateurs suivant le modèle ne demande que l'extraction de la ligne utilisateur pour recueillir ses infos.
Dans la classe utilities.class.php on rajoute ces deux méthodes :
Un test concluant de ces méthodes nous rend opérationnel pour cette phase
Résultat :

##### Liste des défauts

Cette gestion des utilisateurs ne prend actuellement que les attributs de nœuds...
    -> il serait utile de pourvoir des données supplémentaires dans le nœud user.

#### [3] Complétion du frameset

* Pour commencer nous déclarons une classe utilities.class.php qui reprendra toutes les fonctionnalités utiles pour notre solution
* La classe templateControler regroupe les fonctions sur les templates. Le contenu à publier est segmenté en flux.
* Son objectif est de :
    - reformater,
    - assembler,
    - publier.
Le test suivant permet de voir si on prend bien les ancres d'injection, par exemple, pour le nœud frameset/content
On implémente ces deux nouvelles fonctions à templateControler
Le test suivant permet de voir si on remplace bien l'ancre par son contenu :
Le contenu est bien localisé dans le template, par conséquent l'objectif de cette phase est atteint. On est opérationnel pour l'injection.
* La classe snippetActer regroupe les fonctions de computation des snippets.

##### Liste des défauts

* Les snippets actifs à la volée peuvent ralentir l'output
    -> l'ajaxification peut fournir le contenu en deux temps (données avant/après traitements)
* Cette classe reste à faire...

#### [4] Un webservice

Le webService propose par défaut une synergie avec d'autres solutions, sites, applications. Des fonctionnalités distantes permettent l'interfaçage logicielle avec le serveur de données, option qui deviendra basique pour les systèmes orientés données.