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:45] – [Modèle] dany | developpement_de_phpcompta [2014/03/22 16:57] – [Les mises à jour] dany | ||
---|---|---|---|
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, on 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 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 | ||
+ | $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' | ||
+ | |||