Table des matières

Note : Les règles de codage s'applique à tout le code de l'application de Ganesha.
Nous nous sommes basés sur le manuel de PEAR.

Structures de Contrôles

Les structures de contrôles incluent les 'if', 'for', 'while', 'switch', etc. Vous trouverez ici un exemple de structure 'if'
qui est la plus compliquée :

if ((condition1) || (condition2)) {
    action1;
} elseif ((condition3) && (condition4)) {
    action2;
} else {
    defaultaction;
}

Les instructions de contrôle doivent avoir un espace entre le mot clé de l'instruction et la parenthèse ouvrante,
afin de ne pas les confondre avec des appels de fonction.

Il est vivement recommandé de toujours utiliser des parenthèses, même dans les situations où elles sont techniquement optionnelles.
Leur présence augmente la lisibilité du code et réduit le risque d'erreur logique lors de l'ajout de nouvelles lignes de code.

Pour l'instruction "switch" :

switch (condition) {
case 1:
    action1;
    break;

case 2:
    action2;
    break;

default:
    defaultaction;
    break;

}

Appels de Fonction

Les fonctions doivent être appelées sans espaces entre le nom de la fonction, la parenthèse ouvrante et le premier paramètre;
avec un espace entre la virgule et chaque paramètre; et aucun espace entre le dernier paramètre, la parenthèse fermante
et le point virgule.

Voici un exemple :

$var = foo($bar, $baz, $quux);

Comme montré ci-dessus, il doit y avoir un espace de chaque côté du signe égal utilisé pour affecter la valeur de retour de
la fonction à une variable. Dans le cas d'un bloc d'instructions similaires, des espaces supplémentaires peuvent être ajoutés
pour améliorer la lisibilité :

$short         = foo($bar);
$long_variable = foo($baz);

Définitions des Fonctions

La déclaration des fontions respecte l'indentation classique des parenthèses :

function fooFunction($arg1, $arg2 = '') {
    if (condition) {
        statement;
    }
    return $val;
}

Les arguments possèdant des valeurs par défaut vont à la fin de la liste des arguments. Il faut toujours chercher à retourner
une valeur ayant un sens lorsque cela est possible. Voici un exemple un peu plus long :

function connect(&$dsn, $persistent = false) {
    if (is_array($dsn)) {
        $dsninfo = &$dsn;
    } else {
        $dsninfo = DB::parseDSN($dsn);
    }

    if (!$dsninfo || !$dsninfo['phptype']) {
        return $this->raiseError();
    }

    return true;
}

Commentaires

La documentation des classes incluse dans le source code doit suivre la convention PHPDocumentor, similaire à celle de Javadoc.
Pour plus d'informations au sujet de PHPDocumentor vous reporter à : http://www.phpdoc.org ou http://phpdocu.sourceforge.net

Les commentaires non inclus dans la documentation sont vivement encouragés. La règle générale est que, si en regardant
une portion de code, vous pensez "Wououh, je ne veux pas me lancer dans cette explication", il faut absolument la
commenter tout de suite avant que vous oubliez comment cela fonctionne.

Les commentaires du type C (/* */) et les commentaires standard C++ (//) sont tous les deux acceptés.
Les commentaires de type Perl/shell (#) sont à éviter.

Exemple de commentaires pour une fonction :

/**
  * Retourne le nombre de documents poste par un membre
  * @param	integer	$idu	id du membre
  * @param	integer	$idg	id du groupe
  * @return	integer	Retourne le nombre de documents poste par un membre
  * @access	public
  */

Exemple de commentaires pour une classe :

/**
* Fournit une API pour acceder aux chapitres.
* @author Georges Caldeira <gcaldeira@anemalab.org>
* @access public
* @package GaneshaClass
*/

Exemple de commentaires pour un fichier :

/**
* Gestion des chapitres
* @author Georges Caldeira <gcaldeira@anemalab.org>
* @package GaneshaClass
*/

Inclure du Code

A chaque endroit où vous voulez inclure de façon inconditionnelle un fichier de classe, utilisez require_once().
A chaque endroit où vous voulez inclure de façon conditionnelle un fichier de classe (par exemple des méthodes de construction),
utilisez include_once(). Ces deux méthodes s'assurent que le fichier de classe n'est inclu qu'une seule fois. Un fichier inclu
avec require_once() ne sera pas inclu une seconde fois par include_once().

Note : include_once() et require_once() sont des instructions, pas des fonctions. Vous n'avez pas besoin de
parenthèses autour du nom de fichier à inclure.

L'Equipe de développement d'Anéma a fait le choix d'inclure systématiquement toutes les classes et tous les modules. Ces deux fichiers se nomment common.inc.php .

Exemple pour les classes Ganesha :

require_once ($class_path."bdd.class.php")
require_once ($class_path.'norme.class.php')
require_once ($class_path."chapitre.class.php")
require_once ($class_path."connexion.class.php")
require_once ($class_path."document.class.php")
require_once ($class_path."formation.class.php")
require_once ($class_path."groupe.class.php")
require_once ($class_path."mail.class.php")
require_once ($class_path."membre.class.php")
require_once ($class_path."module.class.php")
require_once ($class_path."tracking.class.php")
require_once ($class_path."webmail.class.php")
require_once ($class_path."color.class.php")
require_once ($class_path."stats.class.php")
require_once ($class_path."excelgen.class.php")
require_once ($class_path."log.class.php")
require_once ($class_path."news.class.php")
require_once ($class_path."phorum.class.php")
require_once ($class_path."evalannexes.class.php")
require_once ($class_path."session.class.php")
require_once ($class_path."admin.class.php")
require_once ($class_path."bno.class.php")
;
;
;
;
;
;
;
;
;
;
;
;
;
; // PEAR : Voir le fichier
; // Erh-Wen,Kuo (erhwenkuo@yahoo.com)
;
;
;
; // Eric Villard < evillard@nef.fr >
;
;
; // pyg_listes@exiup.com

Tags dans le Code PHP

Toujours utiliser <?PHP ......   ?> pour délimiter du code PHP, et non la version abrégée <? ........ ?>. C'est la méthode la plus portable pour
inclure du code PHP sur différents systèmes d'exploitation et configurations.

Utilisation de PhpLib pour la connexion à la base de données

Ganesha a été developpée sur un modèle 3-tiers. Nous avons utilisé PhpLib pour la couche d'abstraction d'accès à la base de données. Tout développement dans Ganesha implique l'utilisation de cette couche.

Exemple :

function Nb($idg) {
 global $TBL, $db ;
	$sSQL = "SELECT id FROM ".$TBL['document']." WHERE groupe=".$idg ;
	$db->query($sSQL)		;
	return($db->num_rows())	;
}
 
anema formation