23
edits
Tag: 2017 source edit |
Vdegrandpre (talk | contribs) m (→PHP: remplacement par le bon nom de variable $_COOKIE au lieu de $_COOKIES) |
||
| Line 41: | Line 41: | ||
*Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la {{PHPMinVersion}}. Les fichiers doivent tous comporter l'extension .php | *Dolibarr est écrit en PHP et supporte toutes versions PHP supérieures à la {{PHPMinVersion}}. Les fichiers doivent tous comporter l'extension .php | ||
*L'appel aux variables superglobales PHP doit passer par les opérateurs dédiés $ | *L'appel aux variables superglobales PHP doit passer par les opérateurs dédiés $_COOKIE, $_SERVER, $_ENV. Mais pour récupérer les contenus de $_GET ou $_POST, il faut passer par la fonction dolibarr [[Fonctions utiles Dolibarr|GETPOST()]] ou [[Fonctions utiles Dolibarr|GETPOSTINT()]] . | ||
Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l'option '''register_long_arrays''' est à off. | Les autres opérateurs ($HTTP_SERVER_GET, ...) ayant été passés en deprecated au sein de PHP, ne doivent plus être utilisés. Ainsi le code doit fonctionner y compris quand l'option '''register_long_arrays''' est à off. | ||
| Line 258: | Line 258: | ||
*Les fonctions SQL de date NOW, SYSDATE, DATEDIFF sont interdites au sein des ordres SQL. S'il faut saisir la date du moment dans un champ, la valeur doit venir du PHP, par exemple par la fonction dol_now(), et non du moteur de base de données. Ceci pour les raisons suivantes: | *Les fonctions SQL de date NOW, SYSDATE, DATEDIFF sont interdites au sein des ordres SQL. S'il faut saisir la date du moment dans un champ, la valeur doit venir du PHP, par exemple par la fonction dol_now(), et non du moteur de base de données. Ceci pour les raisons suivantes: | ||
** afin d'avoir une meilleure portabilité du code | **afin d'avoir une meilleure portabilité du code | ||
** avoir une gestion correcte des TimeZone et ne pas dépendre du TimeZone de la base de donnée (le timezone de réference est le timezone de PHP et le timezone de la base de données peut être différent de celui-ci, aussi les conversions de date doivent se faire toute côté PHP). | **avoir une gestion correcte des TimeZone et ne pas dépendre du TimeZone de la base de donnée (le timezone de réference est le timezone de PHP et le timezone de la base de données peut être différent de celui-ci, aussi les conversions de date doivent se faire toute côté PHP). | ||
** meilleurs performances (voir exemples et commentaire plus loin) | **meilleurs performances (voir exemples et commentaire plus loin) | ||
Par exemple, on ne fera pas: | Par exemple, on ne fera pas: | ||
| Line 288: | Line 288: | ||
Outres son côté pas bien standardisé, en insérant des résultats de calculs au sein des données, donnant un résultat qui est un mixe donnée et calculs métiers d'aggrégation, la compréhension du code se trouve compliqué et même les évolutions du code sur ces agrégations plus possibles lorsque se complexifient. | Outres son côté pas bien standardisé, en insérant des résultats de calculs au sein des données, donnant un résultat qui est un mixe donnée et calculs métiers d'aggrégation, la compréhension du code se trouve compliqué et même les évolutions du code sur ces agrégations plus possibles lorsque se complexifient. | ||
* Utilisez $db->ifsql pour le IF SQL | *Utilisez $db->ifsql pour le IF SQL | ||
N'incluez pas le IF dans votre requête SQL générée. Mais utilisez plutôt la méthode $db->ifsql() pour créer un SQL IF compatible avec toutes les bases de données SQL. | N'incluez pas le IF dans votre requête SQL générée. Mais utilisez plutôt la méthode $db->ifsql() pour créer un SQL IF compatible avec toutes les bases de données SQL. | ||
* Pas de DELETE CASCADE et ON UPDATE CASCADE | *Pas de DELETE CASCADE et ON UPDATE CASCADE | ||
De telles instructions SQL sont interdites car elles contournent les règles métiers de l'application. Par exemple, s'il existe une cascade de suppression entre la table A et B, lorsque l'application exécutera le code pour supprimer un enregistrement dans A, les enfants de la table B seront également supprimés. S'il y a eu un trigger Dolibarr PHP (par exemple apporté par un module externe) sur la suppression de l'enregistrement de B (par exemple pour valider la suppression ou pour exécuter une action complémentaire), la DELETE CASCADE sera exécutée sans avoir le trigger Dolibarr PHP exécuté, manquant la validation ou les actions du déclencheur PHP du module. Donc toutes les règles métiers doivent être implémentées du même côté (côté serveur PHP), c'est la raison pour laquelle les règles métier implémentées sur Database ne sont pas autorisées (même situation que le point suivant sur les triggers Database) | De telles instructions SQL sont interdites car elles contournent les règles métiers de l'application. Par exemple, s'il existe une cascade de suppression entre la table A et B, lorsque l'application exécutera le code pour supprimer un enregistrement dans A, les enfants de la table B seront également supprimés. S'il y a eu un trigger Dolibarr PHP (par exemple apporté par un module externe) sur la suppression de l'enregistrement de B (par exemple pour valider la suppression ou pour exécuter une action complémentaire), la DELETE CASCADE sera exécutée sans avoir le trigger Dolibarr PHP exécuté, manquant la validation ou les actions du déclencheur PHP du module. Donc toutes les règles métiers doivent être implémentées du même côté (côté serveur PHP), c'est la raison pour laquelle les règles métier implémentées sur Database ne sont pas autorisées (même situation que le point suivant sur les triggers Database) | ||
| Line 372: | Line 372: | ||
Par exemple: | Par exemple: | ||
*1 fichier qui sert d'exemple de descripteur de module: '''myModule.class.php''' | *1 fichier qui sert d'exemple de descripteur de module: '''myModule.class.php''' | ||
*1 fichier qui sert d'exemple de code pour faire une nouvelle classe: '''skeleton_class.class.php''' | *1 fichier qui sert d'exemple de code pour faire une nouvelle classe: '''skeleton_class.class.php''' | ||
*1 fichier qui sert d'exemple de code pour faire une nouvelle page: '''skeleton_page.php''' | *1 fichier qui sert d'exemple de code pour faire une nouvelle page: '''skeleton_page.php''' | ||
*1 fichier qui sert d'exemple de code pour faire un script à exécuter en ligne de commande: '''skeleton_script.php''' | *1 fichier qui sert d'exemple de code pour faire un script à exécuter en ligne de commande: '''skeleton_script.php''' | ||
... | ... | ||
| Line 381: | Line 383: | ||
Notons que ces squelettes sont aussi utilisés par le générateur de code PHP ([[Module ModuleBuilder]]) qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développements. | Notons que ces squelettes sont aussi utilisés par le générateur de code PHP ([[Module ModuleBuilder]]) qui est décrit dans la chapitre de développement de module Dolibarr pour accélérer vos développements. | ||
== Variables globales == | ==Variables globales== | ||
Certaines informations ou objets sont communs et fixes pour toute l'exécution d'une page PHP et doivent être utilisés presque partout dans le code. Pour éviter de propager partout ces | Certaines informations ou objets sont communs et fixes pour toute l'exécution d'une page PHP et doivent être utilisés presque partout dans le code. Pour éviter de propager partout ces | ||
informations ou objets, ils sont stockés dans des variables globales auxquelles vous pouvez accéder partout. Ces variables globales sont initialisées au début de chaque appel PHP (dans le master.inc.php ou master.inc.php ou en haut de la page). Ces objets ne sont normalement instanciés qu’une seule fois. La liste des variables globales disponibles est définie ici : | informations ou objets, ils sont stockés dans des variables globales auxquelles vous pouvez accéder partout. Ces variables globales sont initialisées au début de chaque appel PHP (dans le master.inc.php ou master.inc.php ou en haut de la page). Ces objets ne sont normalement instanciés qu’une seule fois. La liste des variables globales disponibles est définie ici : | ||
{{Template:TemplateGlobalVariables}} | {{Template:TemplateGlobalVariables}} | ||
* $conf est l'objet qui contient la configuration (enregistrée dans la base de données) | *$conf est l'objet qui contient la configuration (enregistrée dans la base de données) | ||
* $user est l'objet de l'utilisateur actuel | *$user est l'objet de l'utilisateur actuel | ||
* $mysoc est l'objet contenant toutes les informations sur l'entreprise actuelle | *$mysoc est l'objet contenant toutes les informations sur l'entreprise actuelle | ||
* $langs est l'objet avec la langue actuelle | *$langs est l'objet avec la langue actuelle | ||
* $db est le gestionnaire de base de données de la connexion actuelle à la base de données | *$db est le gestionnaire de base de données de la connexion actuelle à la base de données | ||
* $hookmanager est une classe d'usine pour gérer les hooks | *$hookmanager est une classe d'usine pour gérer les hooks | ||
* $extrafields est une classe d'usine pour gérer les extrafields | *$extrafields est une classe d'usine pour gérer les extrafields | ||
==Les dates et TimeZone== | ==Les dates et TimeZone== | ||
edits