Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
| developpement_de_phpcompta [2013/03/23 15:45] – [Modèle] dany | developpement_de_phpcompta [2025/06/15 17:14] (Version actuelle) – [La documentation] dany | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | ======Développement de PhpCompta====== | + | ======Développement de NOALYSS |
| =====Intro===== | =====Intro===== | ||
| Ligne 21: | Ligne 21: | ||
| Un contrôle est une page php, qui en fonction de l' | Un contrôle est une page php, qui en fonction de l' | ||
| - | Dans phpcompta, cette page est : | + | Dans NOALYSS, cette page est : |
| do.php pour toutes les demandes de pages | do.php pour toutes les demandes de pages | ||
| Ligne 128: | Ligne 128: | ||
| J' | J' | ||
| + | Voir le résultat ici [[https:// | ||
| + | ==== NOALYSS ==== | ||
| - | ====PhpCompta==== | + | NOALYSS |
| - | + | ||
| - | PhpCompta | + | |
| Ligne 158: | Ligne 158: | ||
| =====La partie base de données===== | =====La partie base de données===== | ||
| - | ====Ancienne méthode (non recommandée)==== | + | [[developpement: |
| - | On avait commencé ainsi, on générait | + | ==== Les mises à jour ==== |
| + | Depuis 2005, dans phpcompta, il y a une table VERSION qui contient le numéro du dernier patch appliqué. Quand le fichier | ||
| - | Les colonnes de la table sont dans un tableau et déclaré comme variable privée. Ce point est important. Cela oblige à utiliser les setters/getters. Cela vous permet aussi de faire correspondre des noms parlants à des noms de colonnes parfois hmm... moins parlants. | + | <code php> |
| - | + | /* Ficher do.php */ | |
| - | Cependant, je préfère souvent utiliser les commandes SQL plutôt que de passer par les objets. D' | + | if (DBVERSION < dossier:: |
| - | + | ||
| - | **class** Todo_List | + | |
| { | { | ||
| - | + | echo '< | |
| - | **private** static $variable=array( | + | _("Attention: la version de base de donnée est supérieure à la version du programme, vous devriez |
| - | "id"=>"tl_id", | + | mettre à jour") . '</ |
| - | " | + | } |
| - | " | + | if (DBVERSION > dossier:: |
| - | "desc"=>" | + | { |
| - | " | + | |
| - | | + | $a = _("cliquez ici pour appliquer le patch"); |
| - | | + | $base = dirname($_SERVER['REQUEST_URI']) . '/ |
| - | + | echo '<a hreF="' | |
| - | **function** %%__%%construct | + | } |
| - | | + | |
| - | $this->tl_id=0; | + | |
| - | $this-> | + | |
| - | $this-> | + | |
| - | + | ||
| - | } | + | |
| + | </ | ||
| + | Dans le cas où DBVERSION n'est pas la valeur contenue dans la base de donnée, do.php vous propose d' | ||
| + | <code php> | ||
| + | /* fichier setup.php */ | ||
| + | // | ||
| + | // Upgrade the folders | ||
| + | // | ||
| - | Ici voici, des setters / getters génériques, | + | for ($e=0;$e < $MaxDossier; |
| + | | ||
| + | echo "< | ||
| + | $name=$cn-> | ||
| + | if ( $cn-> | ||
| + | { | ||
| + | $db=new Database($db_row[' | ||
| + | $db-> | ||
| + | Dossier:: | ||
| - | **public** **function** get_parameter($p_string) | + | } else |
| - | | + | |
| - | $idx=**self**:: | + | |
| - | return $this-> | + | |
| - | } | + | |
| - | else | + | |
| - | exit (**%%__%%FILE%%__%%**.":".**%%__%%LINE%%__%%**.' | + | |
| } | } | ||
| + | } | ||
| - | **public** **function** set_parameter($p_string, | + | </code> |
| - | if ( array_key_exists($p_string, | + | |
| - | $idx=**self**:: | + | |
| - | if ($this->check($idx, | + | |
| - | } | + | |
| - | else | + | |
| - | exit (**%%__%%FILE%%__%%**.":" | + | |
| - | + | ||
| - | } | + | |
| - | Ceci est la fonction qui contrôle que les données sont valides. Cela pourrait aussi être fait dans la base de données, soit avec des contrôles d' | + | La fonction qui applique le patch est Database:: |
| + | Tous les patchs pour la base de données se trouve dans noalyss/ | ||
| + | Chaque patch commence par | ||
| + | <code sql> | ||
| + | begin; | ||
| + | </ | ||
| - | **public** **function** check($p_idx,& | + | et termine par |
| - | if ( strcmp ($p_idx, ' | + | <code sql> |
| - | if ( strcmp ($p_idx, ' | + | update version set val=13; |
| - | if ( strcmp ($p_idx, ' | + | |
| - | $p_value=substr($p_value, | + | |
| - | return **true**; | + | |
| - | } | + | |
| - | if ( strcmp ($p_idx, ' | + | |
| - | return **true**; | + | |
| - | } | + | |
| - | Enfin la fonction save, qui permet soit d' | + | commit; |
| + | </ | ||
| + | Ainsi, si le script échoue, la mise à jour s' | ||
| - | + | ====Accèder aux données | |
| - | **public** **function** save() { | + | |
| - | if ( $this-> | + | |
| - | $this-> | + | |
| - | else | + | |
| - | $this-> | + | |
| - | } | + | |
| - | + | ||
| - | **public** **function** insert() { | + | |
| - | if ( $this-> | + | |
| - | + | ||
| - | $sql=" | + | |
| - | " values (to_date($1,' | + | |
| - | $res=ExecSqlParam($this-> | + | |
| - | $sql, | + | |
| - | array($this-> | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | ); | + | |
| - | $this-> | + | |
| - | + | ||
| - | } | + | |
| - | + | ||
| - | **public** **function** update() { | + | |
| - | if ( $this-> | + | |
| - | + | ||
| - | $sql=" | + | |
| - | " where tl_id = $4"; | + | |
| - | $res=ExecSqlParam($this-> | + | |
| - | $sql, | + | |
| - | array($this-> | + | |
| - | | + | |
| - | | + | |
| - | | + | |
| - | ); | + | |
| - | + | ||
| - | } | + | |
| - | + | ||
| - | Comme cette partie est vraiment répétitive et change peu, j'ai mis au point un script (dev/ | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | static **function** test_me() { | + | |
| - | $cn=DbConnect(dossier::id()); | + | |
| - | $r=**new** Todo_List($cn); | + | |
| - | $r-> | + | |
| - | $r-> | + | |
| - | $r-> | + | |
| - | $r-> | + | |
| - | $r-> | + | |
| - | $r-> | + | |
| - | print_r($r); | + | |
| - | $r-> | + | |
| - | $r-> | + | |
| - | print_r($r); | + | |
| - | $r-> | + | |
| - | $r-> | + | |
| - | } | + | |
| - | **public** **function** get_info() { | + | |
| - | + | ||
| - | return var_export(**self**:: | + | |
| - | + | ||
| - | } | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | Et finalement, les fonctions info et test_me qui sont très utiles lors des phases de déboggages. Je crée une simple page html/ | + | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | ====Nouvelle méthode==== | + | |
| - | Nous avons créér une classe Phpcompta_Sql qui va nous permettre de faire la même chose en très peu de ligne de code. | + | Nous avons créér une classe |
| Ligne 329: | Ligne 251: | ||
| Voici tout le code à taper par table, exemple pour la table stock_change | Voici tout le code à taper par table, exemple pour la table stock_change | ||
| - | + | <code php> | |
| - | **class** Stock_Change_Sql | + | class Stock_Change_Sql extends PhpCompta_Sql |
| { | { | ||
| - | //%%// | + | // Le contructeur obligatoire |
| - | //**function**// %%__%%construct// | + | function |
| - | //{ | + | { |
| + | // Façon dont les dates sont utilisées | ||
| + | $this-> | ||
| + | // Nom de la table | ||
| + | $this-> | ||
| + | // nom de la clef primaire | ||
| + | $this-> | ||
| - | //%%//%% Façon dont les dates sont utilisées | + | // Structure de la table, à gauche le nom logique utilisable |
| - | // | + | // avec les getters/ |
| - | + | // colonne | |
| - | //%%//%% Nom de la table | + | $this-> |
| - | // | + | " |
| - | + | " | |
| - | //%%//%% nom de la clef primaire | + | " |
| - | // | + | " |
| - | // | + | " |
| - | + | " | |
| - | // | + | ); |
| - | %%//%% avec les getters/ | + | // Type de données |
| - | %%//%% colonne | + | $this-> |
| - | //$this->//name //=// //array(// | + | " |
| - | //" | + | " |
| - | //" | + | " |
| - | //" | + | " |
| - | //" | + | " |
| - | //" | + | " |
| - | //" | + | ); |
| - | //);// | + | // Les colonnes qui ne peuvent pas être changée ni par insert ni par |
| - | %%//%% Type de données | + | // update parce leurs valeurs sont données automatiquement |
| - | //$this->//type //=// //array(// | + | // exemple : la clef primaire qui est un numéro de séquence |
| - | //" | + | // |
| - | //" | + | $this-> |
| - | //" | + | " |
| - | //" | + | " |
| - | //" | + | ); |
| - | //" | + | global $cn; |
| - | //);// | + | |
| - | %%//%% Les colonnes qui ne peuvent pas être changée ni par insert ni par | + | |
| - | // //%%// | + | |
| - | // //%%// | + | |
| - | // //%%//%%automatiquement donné | + | |
| - | //$this->//default | + | |
| - | //" | + | |
| - | //" | + | |
| - | //);// | + | |
| - | //global// //$cn;// | + | |
| - | + | ||
| - | parent//::// | + | |
| - | //}// | + | |
| - | //} | + | |
| + | parent:: | ||
| + | } | ||
| + | } | ||
| + | </ | ||
| Si on change la structure d'une table, il ne faut presque rien changer : seulement quelques lignes. | Si on change la structure d'une table, il ne faut presque rien changer : seulement quelques lignes. | ||
| + | ===== Les tests unitaires ===== | ||
| + | |||
| + | On utilise dans chaque class , une fonction nommée [[developpemement:: | ||
| + | A partir de NOALYSS (version 6.7.2.0), et pour les plugins nous utiliserons PHPUnit.Ces tests sont heureusement appelables directement depuis NetBeans (version 7.4 et supérieure). | ||
| + | Il faut tout d' | ||
| + | |||
| + | La documentation plus complète se trouve dans le manuel [[https:// | ||