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:48] – [Ancienne méthode (non recommandée)] dany | developpement_de_phpcompta [2014/03/22 16:53] – [La partie base de données] 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 le fichier php à une table grâce à un script (dans phpcompta/ | + | ===== Les mises à jour ===== |
- | + | Depuis 2005, dans phpcompta, on a une table version qui contient le numéro du dernier patch appliqué. Quand le fichier do.php est exécuté, il vérifie si le nombre DBVERSION contenu dans constant.php correspond à la version actuelle | |
- | Les colonnes de la table sont dans un tableau et déclaré comme variable privée. Ce point est important. Cela oblige | + | |
- | + | ||
- | Cependant, je préfère souvent utiliser les commandes SQL plutôt que de passer par les objets. D' | + | |
<code php> | <code php> | ||
- | class Todo_List | + | /* Ficher do.php */ |
+ | if (DBVERSION < dossier:: | ||
{ | { | ||
+ | echo '< | ||
+ | | ||
+ | | ||
+ | } | ||
+ | if (DBVERSION > dossier:: | ||
+ | { | ||
+ | echo '< | ||
+ | $a = _(" | ||
+ | $base = dirname($_SERVER[' | ||
+ | echo '<a hreF="' | ||
+ | } | ||
- | private static $variable=array( | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | " | ||
- | | ||
- | 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' | |
- | + | ||
- | + | ||
- | Ici voici, des setters / getters génériques, | + | |
- | + | ||
<code php> | <code php> | ||
- | public function get_parameter($p_string) { | + | /* fichier setup.php |
- | if ( array_key_exists($p_string, | + | // |
- | | + | // Upgrade the folders |
- | return $this->$idx; | + | // |
- | } | + | |
- | | + | |
- | exit (__%%FILE%%__%%**.":" | + | |
- | } | + | |
- | **public** **function** set_parameter($p_string,$p_value) { | + | for ($e=0;$e < $MaxDossier;$e++) { |
- | if ( array_key_exists($p_string, | + | |
- | $idx=**self**::$variable[$p_string]; | + | |
- | if ($this-> | + | |
- | } | + | |
- | else | + | |
- | exit (**%%__%%FILE%%__%%**.":".**%%__%%LINE%%__%%**.'Erreur attribut inexistant' | + | |
- | + | ||
- | } | + | |
- | </code> | + | |
- | 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'intégrités (foreign key, primary key) soit avec des procédures SQL embarquées de contrôle. | + | |
+ | $name=$cn-> | ||
- | <code php> | + | if ( $cn-> |
- | **public** **function** check($p_idx,& | + | |
- | if ( strcmp | + | |
- | if ( strcmp | + | |
- | if ( strcmp ($p_idx, | + | |
- | $p_value=substr($p_value, | + | |
- | return **true**; | + | |
- | } | + | |
- | if ( strcmp | + | |
- | return **true**; | + | |
- | } | + | |
- | </ | + | |
- | Enfin la fonction save, qui permet soit d' | + | |
- | + | } else | |
- | <code php> | + | { |
- | **public** **function** save() | + | |
- | | + | |
- | | + | |
- | 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 | + | La fonction qui applique le patch est Database:: |
- | + | ||
- | + | ||
- | <code php> | + | |
- | 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**:: | + | |
- | + | ||
- | } | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | + | ||
- | + | ||
- | 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/test.php et j' | + | |
Ligne 332: | Ligne 239: | ||
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> | <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::__construct($cn, $p_id); |
- | // | + | } |
- | + | } | |
- | //%%//%% nom de la clef primaire | + | |
- | // | + | |
- | // | + | |
- | + | ||
- | //%%//%% 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. | Si on change la structure d'une table, il ne faut presque rien changer : seulement quelques lignes. | ||
+ | ===== Les tests unitaires ===== | ||
+ | Avant on utilisait 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' | ||
+ | |||