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 Prochaine révisionLes deux révisions suivantes | ||
developpement_de_phpcompta [2013/03/23 15:44] – [Contrôle] dany | developpement_de_phpcompta [2014/03/22 19:09] – [Nouvelle méthode] dany | ||
---|---|---|---|
Ligne 63: | Ligne 63: | ||
Grâce à l' | Grâce à l' | ||
+ | <code php> | ||
<?php | <?php | ||
Ligne 85: | Ligne 85: | ||
?> | ?> | ||
+ | </ | ||
Ici, comme dans contrôle, on vérifie qu'une action est bien demandée, si c'est la cas, on appelle un objet et on lui demande d' | Ici, comme dans contrôle, on vérifie qu'une action est bien demandée, si c'est la cas, on appelle un objet et on lui demande d' | ||
Ligne 101: | Ligne 101: | ||
Il est vraiment mais vraiment fastidieux de construire une chaîne de caractère contenant tout le code html, surtout quand on emploie aussi du javascript et des tableaux. La solution que j'ai trouvé, je l'ai trouvé en m' | Il est vraiment mais vraiment fastidieux de construire une chaîne de caractère contenant tout le code html, surtout quand on emploie aussi du javascript et des tableaux. La solution que j'ai trouvé, je l'ai trouvé en m' | ||
- | **Function** | + | <code php> |
+ | function | ||
ob_start(); | ob_start(); | ||
Ligne 116: | Ligne 117: | ||
} | } | ||
+ | </ | ||
exemple | exemple | ||
Ligne 156: | 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 '< | ||
+ | | ||
+ | | ||
+ | } | ||
+ | if (DBVERSION > dossier:: | ||
+ | { | ||
+ | echo '< | ||
+ | $a = _(" | ||
+ | $base = dirname($_SERVER[' | ||
+ | echo '<a hreF="' | ||
+ | } | ||
- | **private** static $variable=array( | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | **private** $cn; | ||
- | **private** | ||
- | |||
- | **function** %%__%%construct ($p_init) { | ||
- | $this-> | ||
- | $this-> | ||
- | $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 | ||
+ | // | ||
+ | for ($e=0;$e < $MaxDossier; | ||
+ | | ||
+ | echo "< | ||
+ | $name=$cn-> | ||
+ | if ( $cn-> | ||
+ | { | ||
+ | $db=new Database($db_row[' | ||
+ | $db-> | ||
+ | Dossier:: | ||
- | Ici voici, des setters / getters génériques, | + | } else |
- | + | { | |
- | + | | |
- | + | ||
- | **public** **function** get_parameter($p_string) | + | |
- | | + | |
- | $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 phpcompta/ | ||
+ | Chaque patch commence par | ||
+ | <code sql> | ||
+ | begin; | ||
+ | </ | ||
- | **public** **function** check($p_idx,& | + | et termine par |
- | if ( strcmp ($p_idx, ' | + | < |
- | if ( strcmp ($p_idx, ' | + | update |
- | 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' | + | |
- | + | ||
- | + | ||
- | + | ||
- | **public** **function** save() { | + | |
- | if ( $this-> | + | |
- | $this-> | + | |
- | else | + | |
- | $this-> | + | |
- | } | + | |
- | + | ||
- | **public** **function** insert() { | + | |
- | if ( $this-> | + | |
- | + | ||
- | $sql=" | + | |
- | " values (to_date($1,' | + | |
- | $res=ExecSqlParam($this->cn, | + | |
- | $sql, | + | |
- | array($this-> | + | |
- | | + | |
- | | + | |
- | | + | |
- | ); | + | |
- | $this-> | + | |
- | + | ||
- | } | + | |
- | + | ||
- | **public** **function** | + | |
- | 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:: | + | |
- | $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/ | + | |
+ | commit; | ||
+ | </ | ||
+ | Ainsi, si le script échoue, la mise à jour s' | ||
====Nouvelle méthode==== | ====Nouvelle méthode==== | ||
Ligne 307: | Ligne 231: | ||
- | 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 327: | 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 | ||
+ | $this->name = array( | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ); | ||
+ | // Type de données | ||
+ | $this-> | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | " | ||
+ | ); | ||
+ | // Les colonnes qui ne peuvent pas être changée ni par insert ni par | ||
+ | // update parce leurs valeurs sont données automatiquement | ||
+ | // exemple : la clef primaire qui est un numéro de séquence | ||
+ | // | ||
+ | $this-> | ||
+ | "c_id" | ||
+ | " | ||
+ | ); | ||
+ | global $cn; | ||
- | //%%//%% Nom de la table | + | parent:: |
- | //$this->//table //=// //" | + | } |
+ | } | ||
+ | </code> | ||
+ | Si on change la structure d' | ||
+ | ===== Les tests unitaires ===== | ||
+ | Avant on utilisait dans chaque class , une fonction nommée [[developpemement:: | ||
- | //%%//%% nom de la clef primaire | + | A partir |
- | // | + | |
- | // | + | |
- | + | ||
- | //%%//%% Structure de la table, à gauche le nom logique utilisable | + | |
- | %%//%% avec les getters/ | + | |
- | %%//%% colonne | + | |
- | // | + | |
- | //" | + | |
- | //" | + | |
- | //" | + | |
- | //" | + | |
- | //" | + | |
- | //" | + | |
- | //);// | + | |
- | %%//%% Type de données | + | |
- | // | + | |
- | //" | + | |
- | //" | + | |
- | //" | + | |
- | //" | + | |
- | //" | + | |
- | //" | + | |
- | //);// | + | |
- | %%//%% Les colonnes qui ne peuvent pas être changée ni par insert ni par | + | |
- | // | + | |
- | // | + | |
- | // | + | |
- | // | + | |
- | //" | + | |
- | //" | + | |
- | //);// | + | |
- | // | + | |
- | + | ||
- | parent//::// | + | |
- | //}// | + | |
- | //} | + | |
- | + | ||
- | Si on change la structure d'une table, il ne faut presque rien changer : seulement quelques lignes. | + | |
+ | Il faut tout d' | ||
+ | |||