Changes

m
no edit summary
Line 1: Line 1:  
{{TemplateDocDevEn}}
 
{{TemplateDocDevEn}}
{{ToTranslate}}
  −
  −
Voici les quelques règles sur le langage, la syntaxe et normes de développement en vigueur pour le projet Dolibarr:
      +
This is some rules on language, syntax and norm we use into Dolibarr project:
    
= Versions =
 
= Versions =
   −
* Dolibarr doit fonctionner sur:
+
* Dolibarr must works on:
# Tous OS (Windows, Linux, MACOS...)
+
# All OS (Windows, Linux, MACOS...)
# PHP 4.3 ou + (Doit fonctionner sans aucun module PHP complémentaire hors les modules d'accès base de donnée).
+
# PHP 4.3 or + (Must works with no need of complementary PHP module, except module to PHP module to access database).
# Mysql 3.1 ou +
+
# Mysql 3.1 or +
 
  −
= Normes PHP =
      +
= PHP Norms =
 +
{{ToTranslate}}
 
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l'extension .php
 
* Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la 4.1. Les fichiers doivent tous comporter l'extension .php
   Line 25: Line 23:     
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes
 
* Quand plusieurs variables doivent être initialisées avec la même valeur, il faut utiliser plusieurs lignes
<pre>
+
<source lang="php">
 
$var1=1;$var2=1;$var3=1;
 
$var1=1;$var2=1;$var3=1;
</pre>
+
</source>
 
plutôt que
 
plutôt que
<pre>
+
<source lang="php">
 
$var1=$var2=$var3=1;
 
$var1=$var2=$var3=1;
</pre>
+
</source>
 
qui est moins performant.
 
qui est moins performant.
    
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.
 
* Les chaines doivent être encadrés de simple quote et les variables sorties de la chaine.
<pre>
+
<source lang="php">
 
print 'Mon texte affiche ma '.$variable.' !';
 
print 'Mon texte affiche ma '.$variable.' !';
</pre>
+
</source>
    
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d'une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes
 
* Les commentaires doivent suivre la syntaxe C, ie un double antislash pour un commentaire d'une ligne et utilisation slash-étoile pour ouvrir un bloc de plusieurs lignes
<pre>
+
<source lang="php">
 
   
/* Bloc de commentaire
 
/* Bloc de commentaire
 
  *
 
  *
Line 56: Line 53:  
}
 
}
   −
</pre>
+
</source>
    
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.
 
* Les fichiers doivent etre sauvés en format Unix (LF) et non Windows (CR/LF). Le format Unix étant compatible sur les OS Unix like, Windows, Mac, alors que le format fichier texte Windows pose problème sous certains PHP sous Unix.
Line 66: Line 63:     
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d'éviter les confusions. Exemple:
 
* Les SELECT * sont interdits ! Chaque SELECT doit spécifier la liste complète des champs à récupérer. Cela permet d'éviter les confusions. Exemple:
<pre>
+
<source lang="sql">
 
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = '$id'
 
SELECT field_a, field_b, field_c FROM table_1 WHERE field_d = '$id'
</pre>
+
</source>
    
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d'une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l'impression qu'il n'y a pas de problème. Et c'est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.
 
* Dans les requêtes SQL, on quote les champs mais pas les numériques qui contiennent des montants destinés à être stockés dans des champs de type double ou real. Les quotes sur les numériques de type float provoquent parfois un stockage d'une valeur différente. Par exemple 412.62 dans le insert sera en fait stocké avec la valeur 412.61999512 en base si le champ est de type double(24,8). Et seul le PHP voit 412.61999512. Les autres outils verront 412.62 donnant l'impression qu'il n'y a pas de problème. Et c'est le PHP qui a raison, il y a problème en base. En supprimant les quotes sur les numériques, cela va mieux.
    
Exemple:
 
Exemple:
<pre>
+
<source lang="sql">
 
Bon:    INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', 412.62)
 
Bon:    INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', 412.62)
 
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', '412.62')
 
Mauvais: INSERT INTO table_1 (field_txt, field_num) VALUES ('txt', '412.62')
</pre>
+
</select>
    
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:
 
Remarque, le pb des float est général et pas seulement sur les accès base, il est présent dans tous les languages quand on travaille sur des nombres réels, aussi ils doivent être, dès que affectés, nettoyés par la fonction price2num avec le 2eme paramètre renseigné à:
Line 96: Line 93:  
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l'appel de la fonction img_picto.
 
* Les liens href doivent être absolus et se baser pour les pages sur la constante DOL_URL_ROOT qui pointe sur htdocs et pour les images se base sur l'appel de la fonction img_picto.
 
Par exemple:
 
Par exemple:
<pre>
+
<source lang="php">
 
print '<a href="'.DOL_URL_ROOT.'/monrep/mapage.php">'.img_picto('Texte alt','nompictopng','').'</a>';
 
print '<a href="'.DOL_URL_ROOT.'/monrep/mapage.php">'.img_picto('Texte alt','nompictopng','').'</a>';
</pre>
+
</source>
    
* Le javascript et l'appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur "$conf->use_javascript"
 
* Le javascript et l'appel aux scripts java dans les pages php est à proscrire. Si toutefois du code javascript est inclus, il doit être conditionné par le test sur "$conf->use_javascript"
<pre>
+
<source lang="php">
 
if ($conf->use_javascript)
 
if ($conf->use_javascript)
 
{
 
{
 
...  // Le code php qui génère du javascript est ici
 
...  // Le code php qui génère du javascript est ici
 
}
 
}
</pre>
+
</source>
    
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).
 
* Les popups windows ne doivent pas être utilisées, sauf pour des tooltips (et restent condtionnées par le point ci-dessus).
Line 144: Line 141:  
En PHP comme dans d'autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.
 
En PHP comme dans d'autres langages (Java par exemple), les données non entières (float, real, double) ne sont pas fiables.
 
Essayer de faire par exemple  
 
Essayer de faire par exemple  
<pre>
+
<source lang="php">
 
print 239.2 - 229.3 - 9.9;
 
print 239.2 - 229.3 - 9.9;
</pre>
+
</source>
 
Vous n'obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d'autres exemples qui ne fonctionnent pas.
 
Vous n'obtiendrez pas zéro mais un nombre très petit en puissance de 10 négative. Si vous obtenez zéro, vous pourrez trouvez d'autres exemples qui ne fonctionnent pas.
 
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: 'MU', 'MT' ou 'MS' selon le besoin (voir doc fonction).
 
Le problème des float est général, une variable résultante de calcul de nombre réels doit SYSTEMATIQUEMENT être nettoyée par la fonction price2num avec le 2eme paramètre renseigné à: 'MU', 'MT' ou 'MS' selon le besoin (voir doc fonction).
<pre>
+
<source lang="php">
 
print price2num(239.2 - 229.3 - 9.9, 'MT');
 
print price2num(239.2 - 229.3 - 9.9, 'MT');
</pre>
+
</source>
 
S'il ne s'agit pas d'un prix sur lequel s'adapte les paramètres MU, MT ou MS, il faut utiliser la fonction '''round()'''.
 
S'il ne s'agit pas d'un prix sur lequel s'adapte les paramètres MU, MT ou MS, il faut utiliser la fonction '''round()'''.
   Line 166: Line 163:  
DOL_DATA_ROOT.'/monmodule'.
 
DOL_DATA_ROOT.'/monmodule'.
 
Le répertoire peut être créé dans votre code à l'exécution par le code suivant:
 
Le répertoire peut être créé dans votre code à l'exécution par le code suivant:
<pre>
+
<source lang="php">
 
$mymoduledir=DOL_DATA_ROOT.'/monmodule';
 
$mymoduledir=DOL_DATA_ROOT.'/monmodule';
 
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);
 
if (! is_dir($mymoduledir)) create_exdir($mymoduledir);
</pre>
+
</source>
    
Si vous avez besoin d'un répertoire qui contiendra des données temporaires, ce répertoire doit être DOL_DATA_ROOT.'/monmodule/temp'
 
Si vous avez besoin d'un répertoire qui contiendra des données temporaires, ce répertoire doit être DOL_DATA_ROOT.'/monmodule/temp'