Chapitre 47. Développement de NOALYSS
NOALYSS utilise le MVC, toutes les actions sont controlées par do.php pour les pages web, export.php pour tous les exports (PDF, ODT ou CSV). Ce sont les contrôleurs.
47.1. Fichiers importants
Les fichiers à inclure sont dans la table menu_ref, cette table est accèdée à travers la table profile_menu qui décrit l’interface de l’utilisateur, ce qui automatiquement empêche un utilisateur d’accèder à un menu auquel il n’a pas accès.
Le répertoire include contient les fichiers à inclure, les noms de fichiers suivent la logique suivant :
- ajax
-
Action ajax, le nom de fichier commence par ajax, contient le contenu de la variable op, c’est cette variable qui va indiquer le fichier à include.:footnote:voir https://wiki.noalyss.eu/doc/ajax__misc_8php.html
- fichier à inclure
-
le nom de fichier termine par inc.php,
- fichier ORM
-
correspondant à une table NOM_TABLE dans la base de données:class_NOM_TABLE_sql.php,
- fichier d’object
-
le nom commençent par class
Dans le répertoire template, vous avez les modèles, ce sont des fichiers contenant surtout du code HTML.
En résumé :
Les contrôleurs sont do.php, export.php
Les modèles sont dans include/template
et les vues sont dans le répertore include
47.2. La partie base de données
47.2.1. 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 do.php est exécuté, il vérifie si le nombre DBVERSION contenu dans constant.php correspond à la version actuelle.
|
Astuce
|
DBVERSION est défini dans include/constant.php |
/* Ficher do.php */
if (DBVERSION < dossier::get_version($cn))
{
echo '<h2 class="error" style="font-size:12px">' .
_("Attention: la version de base de donnée est supérieure à la version du programme, vous devriez
mettre à jour") . '</h2>';
}
if (DBVERSION > dossier::get_version($cn))
{
echo '<h2 class="error" style="font-size:12px">' . _("Votre base de données n'est pas à jour") . ' ';
$a = _("cliquez ici pour appliquer le patch");
$base = dirname($_SERVER['REQUEST_URI']) . '/admin/setup.php';
echo '<a hreF="' . $base . '">' . $a . '</a></h2>';
}
Dans le cas où DBVERSION n’est pas la valeur contenue dans la base de donnée, do.php vous propose d’appliquer le patch sur vos bases de données. Voici la fonction qui applique les patch SQL pour la base de données.
/* fichier setup.php */
//----------------------------------------------------------------------
// Upgrade the folders
//----------------------------------------------------------------------
for ($e=0;$e < $MaxDossier;$e++) {
$db_row=Database::fetch_array($Resdossier,$e);
echo "<h3>Patching ".$db_row['dos_name'].'</h3>';
$name=$cn->format_name($db_row['dos_id'],'dos');
if ( $cn->exist_database($name)> 0 )
{
$db=new Database($db_row['dos_id'],'dos');
$db->apply_patch($db_row['dos_name']);
Dossier::synchro_admin($db_row['dos_id']);
} else
{
echo_warning(_("Dossier inexistant")." $name");
}
}
La fonction qui applique le patch est Database::apply_patch voir https://wiki.noalyss.eu/doc/class_database.html
Tous les patchs pour la base de données se trouve dans /noalyss/include/sql/patch/ et sont numérotés dans l’ordre d’exécution. Chaque patch commence par
begin;
et termine par
update version set val=13;
commit;
Ainsi, si le script échoue, la mise à jour s’arrête et annule toute ce qui a été fait dans le script contenant l’erreur, la base de données reste ainsi dans un état cohérent. Une fois l’erreur corrigée dans votre base de données, ce script ainsi que ceux qui suivent seront appliqués quand vous appelerez à nouveau noalyss/admin/setup.php (ou noalyss/html/install.php)
47.2.2. Accèder aux données : ORM
Pour accèder aux tables ou aux vues, pour les SQL complexes , nous créons une classe qui va hériter de https://wiki.noalyss.eu/doc/class_table___data___s_q_l.html qui est dérivée de https://wiki.noalyss.eu/doc/class_data___s_q_l.html
et qui va nous permettre de faire la même chose en très peu de ligne de code.
Cette classe fournit entre-autres les fonctions suivantes qui peuvent être surchargée
- insert
-
pour insérer une ligne dans la base de données
- delete
-
pour insérer une ligne dans la base de données
- update
-
pour mettre à jour une ligne dans la base de données
- verify
-
à surcharger, vérifie que les données sont conformes
- setp
-
setter
- getp
-
getter
- toString
-
affiche le contenu de l’objet
- from_array
-
transforme un tableau en un objet
- seek
-
recherche dans la table sur base d’une condition
- next
-
retourne l’objet suivant (après seek)
- check
-
contrôle des valeurs
Voici tout le code à taper par table, exemple pour la table stock_change.
Le fichier sera nommé table_sql.class.php , il sera dans un répertoire /database/ et la classe se nommera table_SQL
class Stock_Change_SQL extends Noalyss_SQL
{
// Le contructeur obligatoire
function __construct($p_id = -1)
{
// Façon dont les dates sont utilisées
$this->date_format="DD.MM.YYYY";
// Nom de la table
$this->table = "public.stock_change";
// nom de la clef primaire
$this->primary_key = "c_id";
// Structure de la table, à gauche le nom logique utilisable
// avec les getters/setters (setp/getp) et à droite le nom de la
// colonne
$this->name = array(
"id" => "c_id",
"c_comment" => "c_comment",
"c_date" => "c_date",
"tech_date"=>"tech_date",
"tech_user"=>"tech_user",
"r_id"=>"r_id"
);
// Type de données
$this->type = array(
"c_id" => "numeric",
"c_comment" => "text",
"c_date" => "date",
"tech_date"=>"date",
"tech_user"=>"text",
"r_id"=>"numeric"
);
// 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
//automatiquement donné
$this->default = array(
"c_id" => "auto",
"tech_date" => "auto"
);
global $cn;
parent::__construct($cn, $p_id);
}
}
47.3. Les tests unitaires
47.3.1. test-me
Les fonctions info et test_me qui sont très utiles lors des phases de déboggages. Je crée une simple page test-classe.php et j’appelle la classe; dans la fonction test_me (de la classe) je mets tout ce que je souhaite tester.
exemple :
static function test_me()
{
$cn=new Database(dossier::id());
$obj=new Periode($cn);
$obj->set_jrn(1);
$obj->display_form_periode();
}
|
Note
|
ces tests ne sont pas ajoutés à NOALYSS mais servent de base pour les scénarios ou PHPUNIT |
47.3.2. PHPUNIT
Il faut tout d’abord un fichier bootstrap qui contient le path correct
pour php ainsi que les variables comme $g_user ou $cn, l’inclusion de
noalyss/include/config.inc.php et de noalyss/include/constant.php
47.3.3. Scenario
Vous pouvez enregistrer ce que vous soumettez, il faut dans config.inc.php, ajouter
define ('LOGINPUT',true);
Ensuite créer le fichier dans noalyss/html/authorized_debug , le contenu
n’a pas d’importance, ce fichier peut être vide.
Ensuite, aller dans votre dossier de test et faites une action (une
vente, un achat…), vous devez ouvrir le fichier test.php avec comme
paramètre le dossier (exemple
http://localhost/noalyss/html/test.php?gDossier=14) ce que vous venez
de faire a été sauvé dans le répertoire défini par $_ENV['TMP'], (sous
linux il s’agit de /tmp )avec un nom ressemblant à scenario-<nombre>.php
Vous devez d’abord copier ce fichier dans le répertoire noalyss/scenario , de préférence avec un nom plus parlant.
Si vous pointez votre browser sur noalyss/html/test.`php (après avoir créé le fichier authorized_debug) en cliquant sur le lien avec le nom de fichier vous pourrez rejouer l’action.
|
Astuce
|
Vous pouvez améliorer la description en changeant l’annotation //@description: <CODE>
|
L’objectif étant de pouvoir tester et de rejouer facilement les actions que vous avez faites. Cela permet de débogguer plus facilement en particulier les parties ajax.