Addon tutorial

Un article de OviWiki.


Image:information.png Cet article est incomplet. Son contenu est donc à considérer avec précaution.

Voir la liste des articles incomplets


Sommaire

Introduction

Le but de ce guide est donner une initiation au développement d'un module pour Ovidentia. Il est destiné à des utilisateurs ayant déjà des connaissances en PHP et des développements de site PHP. Avant de commencer, vérifier que vous avez un serveur web avec le support PHP activé et qu'une version d'OVIDENTIA est installé. Si ce n'est pas fait vous pouvez télécharger une version sur le site communautaire http://www.ovidentia.org/ Ovidentia.org.

Création d'un nouveau module

Nous allons, pour le besoin du tutorial, développer un module qui permet de créer des nouvelles et de les afficher sur la page d'accueil.

Une nouvelle est composée d'un titre et d'un texte.

A une nouvelle est associée une date de publication et un auteur, c'est à dire l'utilisateur qui a soumis la nouvelle.

Lorsqu'un utilisateur publie une nouvelle, celle-ci n'est pas immédiatement publiée. Des utilisateurs approbateurs approuvent ou refusent la nouvelle. Si elle est approuvée, elle est publiée. Sinon elle est supprimée.

Le droit d'ajouter des nouvelles sera octroyé uniquement à certains groupes d'utilisateurs.

Création des répertoires

Créer un répertoire newsaddon dans le répertoire ovidentia/addon de votre installation d'Ovidentia.

Dans ce répertoire, créer les trois fichiers php suivants:

  • addonini.php
  • base.php
  • init.php

Editer le fichier addonini.php et y insérer le code suivant:

;<?php/*
 [general]
 name="newsaddon"
 version=1.0
 description="News addon"
 delete=1
 longdesc="Addon des nouvelles"
 db_prefix="newsaddon_"
 ov_version="6.7.0"
 php_version="4.1.2"
 mysql_version="3.23"
 author="Your name ( Your compagny )"
 ;*/?>


Editer le fichier base.php et y insérer le code suivant:

<?php
 exit;
 ?>

Enfin éditer le fichier init.php et insérer dedans le code suivant:

<?php
 require_once 'base.php';
 function newsaddon_getAdminSectionMenus(&$url, &$text)
 {
 return false;
 }
 
 function newsaddon_getUserSectionMenus(&$url, &$text)
 {
 return false;
 }
 
 function newsaddon_onSectionCreate(&$title, &$content)
 {
 return false;
 }
 
 function newsaddon_upgrade($version_base,$version_ini)
 {
 return true;
 }
 
 function newsaddon_onDeleteAddon()
 {
 return true;
 }
 ?>

A ce stade vous avez un module fonctionnel mais qui n'affiche rien et ne fait aucun traitement particulier.

Nous détaillerons le contenu des fichiers créés plus tard. Pour le moment nous allons voir comment administrer, supprimer ou télécharger notre nouveau module.

Administration du module

En tant qu'administrateur du site, à partir de la section « Administration », cliquez sur le menu « Modules ».

Le système affiche la liste des modules présents.

On remarque que dans la liste figure notre nouveau module « newsaddon ».

Cette interface vous permet de gérer les modules. En particulier, elle permet:

  • De donner les droits sur le module
  • De télécharger le module
  • De supprimer le module
  • Installer le module

Droits sur le module

Cliquez sur le lien « Droits » pour désigner le ou les groupes des utilisateurs qui peuvent utiliser le module.

Nous verrons plus tard comment le module peut surcharger ces droits pour restreindre l'accès à des sous groupes.

Pour notre exemple, donnez le droit à tous les utilisateurs enregistrés en utilisant le formulaire ACL ( Access Control Level ) affiché.

Télécharger le module

Si vous souhaitez créer un ZIP de votre module pour le fournir à vos clients ou pour l'installer sur un autre site Ovidentia, cliquer sur l'image sous forme de disquette.

Le système créé une archive ZIP du nom de l'addon et du numéro de version.

Dans notre exemple, le système proposera de télécharger l'archive « newsaddon-1-0.zip »

Supprimer le module

Si vous souhaitez supprimer le module, cliquer sur l'icône de suppression.

Le système vous demandera de confirmer la suppression.


Image:warning.png avant de procéder à la suppression, sauvegardez votre module en téléchargeant l'archive comme indiqué ci dessus.

Installer le module

Pour installer un module, cliquez sur le lien « Déposer » et charger l'archive.

Une fois l'archive installée, cliquez sur l'icône de mise à jour pour procéder à l'installation définitive.

Description des fichiers

Fichier addonini.php

Le fichier addonini.php est un fichier de configuration et contient les rubriques suivantes:


Entrée
Description
name Nom du module
version La version du module
description Description courte du module
db_prefix Le préfix utilisé pour les tables MySQL du module. Lors de la suppression du module, OVIDENTIA supprimera également de la base de données les tables dont le nom commencent par ce préfixe.
ov_version Version minimale requise d'Ovidentia


Voir toutes les variables utilisables dans la documentation : Variables du fichier addonini

Fichier base.php

Ce fichier sert de sécurité et empêche l'accès direct au module sans passer par le noyau Ovidentia.

Il contient qu'une seule instruction :

exit;

Fichier init.php

Tout module doit contenir ce fichier.

La fonction suivante ajoute une entrée dans la section « Administrateur »:

function xxx_getAdminSectionMenus(&$url, &$text)
 {
 return false;
 }

( xxx est le nom du module )

Si votre module a besoin d'un menu dans la section « Administration » pour permettre aux administrateurs de le configurer, Ovidentia vous donne une chance d'insérer ce menu par l'intermédiaire de cette fonction. Votre module doit initialiser les paramètres passés par références $url ( URL du menu ) et $text ( texte à afficher pour le menu ).

Cette fonction retourne false si le module n'a pas d'entrée à ajouter et retourne true si le module veut ajouter une entrée.

Exemple:

function newsaddon_getAdminSectionMenus(&$url, &$text)
 {
      static $j=0;
      if($j==0)
      {    
      $text = 'News Addon';
      $url = $GLOBALS['babAddonUrl']."admin";
      $j++;
      return true;
      }
      return false;
 }

Editez le fichier init.php et modifier la fonction comme ci-dessus.

Rafraîchissez la page et vous verrez qu'une entrée est venue s'ajouter à la section « Administration »


Image:warning.png Cette fonction et les suivantes ne doivent pas générer d'affichage sur la page Web ( affichage de formulaire ou autre ) et doivent retourner assez rapidement à l'appelant.

De la même manière vous pouvez ajouter un menu dans la section « Utilisateur ». Pour cela utilisez la fonction:

function xxx_getUserSectionMenus(&$url, &$text)
 {
 return false;
 }
</pre>
Dans notre exemple ceci donne:
<pre>
 function newsaddon_getUserSectionMenus(&$url, &$text)
 {
      static $j=0;
      if($j==0)
      {    
           $text = 'News Addon';
           $url = $GLOBALS['babAddonUrl']."user";
           $j++;
           return true;
      }
 return false;
 }

Si vous rafraîchissez la page du navigateur, vous verrez qu'une entrée est venue s'ajouter à la section « Utilisateur»

Si vous cliquez sur ces liens, le navigateur affichera des erreurs PHP parce que les fichiers admin.php et user.php n'existent pas. Pour éviter ces erreurs, créer deux fichiers user.php et admin.php dans le même répertoire que celui où se trouve le fichier init.php:

admin.php:

<?php
 require_once 'base.php';
 ?>

user.php:

<?php
 require_once 'base.php';
 ?>

Des fois le module a besoin de créer une section comme les sections « Administrateur » ou « Utilisateur » afin de regrouper tous les menus dont il a besoin. C'est là que la fonction suivante vient en aide:

function newsaddon_onSectionCreate(&$title, &$content)
 {
 return false;
 }

Cette fonction retourne false si le module ne créé pas de section et true dans le cas contraire.

Dans ce cas le module initialise la variable $title avec le titre de la section et la variable $content avec le contenu de la section.

La fonction:

function newsaddon_onDeleteAddon()
 {
 return true;
 }

est appelée quand Ovidentia est sur le point de supprimer le module. Cette fonction permet au module de procéder à des nettoyages du système ( suppression de fichiers, répertoires temporaires ... créés par le module ).

Enfin la fonction:

function newsaddon_upgrade($version_base,$version_ini)
 {
 return true;
 }

est appelée par Ovidentia lors d'une mise à jour de votre module.

Le premier paramètre est la version actuelle du module et le deuxième paramètre est la version définie dans le fichier addonini.php.

( Pour plus de détails, au sujet de cette fonction, voir Développement d'un programme de mise à jour)

Les variables du module

Ovidentia met à la disposition de chaque module des variables pour faciliter leur implémentation. Il s'agit par exemple de l'url d'accès au module, du nom du module, des répertoires d'installation du module etc ...

Ovidentia identifie chaque module par son nom et lui attribut un ID unique.

Par exemple dans notre cas le module s'appelle newsaddon et son ID est 1 ( peut être différent sur votre installation ). Dans ce cas les variables disponibles à notre module sont:


Variable
Description
$babAddonUrl L'url d'accès au module

http://localhost/index.php?tg=addon/1/

$babAddonPhpPath Chemin vers les fichiers PHP

« ovidentia/adons/newsaddon »

$babAddonTarget Utilisé dans les formulaires comme action du tag « form »

« addon/1 »

$babAddonHtmlPath Chemin vers les fichiers templates ( voir ci dessous )

addons/newsaddon/

$babAddonFolder Nom du répertoire du module

newsaddon

$babAddonUpload Chemin du répertoire de stockage du module

$babUploadPath.'addons/newsaddon'

Les variables globales d'Ovidentia

Ovidentia met à la disposition des modules certaines variables utiles:


Variable
Description
$BAB_SESS_LOGGED Cette variable permet au module de savoir si l'utilisateur courant est authentifié ( true ) ou c'est un utilisateur anonyme ( false )
$BAB_SESS_USER Contient le nom complet de l'utilisateur courant.

Vide si l'utilisateur est anonyme

$BAB_SESS_NICKNAME Contient l'identifiant de l'utilisateur courant.

Vide si l'utilisateur est anonyme

$BAB_SESS_USERID Contient l'ID de l'utilisateur courant.

Vide si l'utilisateur est anonyme

$BAB_SESS_EMAIL Contient l'adresse email de l'utilisateur courant.

Vide si l'utilisateur est anonyme

$babInstallPath Contient le chemin du répertoire où le noyau Ovidentia est installé.

Le chemin est relatif au répertoire racine du site.

$babSkin Contient le nom du skin courant
$babSkinPath Contient le chemin du répertoire du skin

$babInstallPath."skins/".$babSkin."/"

$babCssPath Chemin vers le répertoire du CSS

“skins/".$babSkin."/styles/name of file choosen by user.css".

$babScriptPath Chemin du répertoire des scripts

$babInstallPath."scripts/"

$babLanguage Le langage courant
$babStyle Nom du fichier CSS utilisé avec l'extension css
$babSiteName Nom du site tel que configuré dans le fichier config.php
$babUrl URL d'accès au site

http://localhost

$babDB Une instance de la classe de gestion de la base de données
$babBody Une instance de la classe de gestion de la page Ovidentia

Gestion des langues

Si vous avez besoin de gérer plusieurs langues pour votre module, vous devez utilisez la fonction:

bab_translate($str, $addonname)

où $str est la chaîne à traduire et $addonname le nom de votre module.

Dans notre exemple, on utilisera la fonction comme ceci:

bab_translate($str, $GLOBALS['babAddonFolder']);

De plus il est nécessaire de créer un répertoire du nom de votre module sous le répertoire « lang/addons » de votre installation.

Pour chaque langue créer un fichier « lang-xx.xml » où xx est la langue.

Dans notre cas on créera le fichier lang-fr.xml pour gérer les traductions en français. Le contenu de ce fichier est structuré comme suit:

 <fr>
 <string id="Interpretation">Interprétation</string>
 <string id="Display the result in popup">Afficher le résultat en popup</string>
 <string id="Result:">Résultat :</string>
 <string id="Help">Aide</string>
 </fr>

Gestion des erreurs

Pour afficher un message d'erreur à destination de l'utilisateur, Ovidentia met à la disposition des modules la fonction:

 $babBody->addError($message);

L'appel à cette fonction avec un message affiche ce dernier en rouge pour attirer l'attention de l'utilisateur.

Par exemple editer le fichier user.php et insérer le code suivant:

 <?php
 require_once 'base.php';
 $babBody->addError('Ceci est un avertissement !');
 ?>

En cliquant sur le menu de la section « Utilisateur », le système affiche le message d'erreur.

Essayez maintenant ceci:

 <?php
 require_once 'base.php';
 $babBody->addError('Ceci est un avertissement !');
 echo 'ceci est un texte';
 ?>

Que remarque-t-on? Le texte est affiché tout en haut de la page et non pas en dessous de l'avertissement !

Afin d'afficher correctement des données, utilisez la fonction:

 $babBody->babEcho($str);

Editez le fichier user.php et modifiez le comme ceci:

<?php
require_once 'base.php';
$babBody->addError('Ceci est un avertissement !');
$babBody->babEcho( 'ceci est un texte' );
?>

Maintenant le texte est bien affiché en dessous de l'avertissement.

Module de nouvelles

Base de données

Nous allons stocker nos nouvelles dans la base de données avec un schéma comme celui-ci:


Champ
Type
Null?
Notes
id Integer Non Primary key, Autoincrement
news_title Varchar(255) Non
news_body Text Non
news_datetime Datetime Non
news_author Integer Oui

En utilisant phpMyAdmin, créer une table en utilisant la requête suivante:

CREATE TABLE `newsaddon_news` (
  `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY ,
 `news_title` VARCHAR( 255 ) NOT NULL ,
 `news_body` TEXT NOT NULL ,
 `news_datetime` DATETIME NOT NULL ,
 `news_author` int(11) UNSIGNED NOT NULL DEFAULT '0' 
 )

Pour que votre module puisse créer cette table lors de son installation, vous devez éditer le fichier init.php et modifier la fonction upgrade() comme ceci:

function newsaddon_upgrade($version_base,$version_ini) 
 { 
 global $babDB; 
 if ( !bab_isTable("newsaddon_news")) 
 { 
 $res = $babDB->db_query(" 
  CREATE TABLE `newsaddon_news` ( 
  `id` INT( 11 ) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY , 
  `news_title` VARCHAR( 255 ) NOT NULL , 
  `news_body` TEXT NOT NULL , 
  `news_datetime` DATETIME NOT NULL , 
  `news_author` int(11) unsigned NOT NULL default '0' 
  )"); 
 } 
 return true; 
 }

La variable globale $babDB permet d'accéder à l'objet gérant la base de données.

La fonction bab_isTable() permet de vérifier si la table n'existe pas déjà dans la base de données ( voir Développement d'un programme de mise à jour )

Formulaire de création d'une nouvelle

Pour permettre à l'utilisateur de créer une nouvelle, il nous faut créer :

  • un menu pour accéder à cette fonctionnalité
  • un formulaire de création

Création du menu

Éditez le fichier user.php et modifier comme suit:

<?php 
require_once "base.php"; 
$babBody->addItemMenu("add", bab_translate("Add", $GLOBALS["babAddonFolder"]),$GLOBALS["babAddonUrl"]."user&idx=add"); 
?>

La méthode de $babBody

function addItemMenu($id, $txt, $url, $enabled=true)

permet d'ajouter une entrée dans le menu de la page d'OVIDENTIA. Cette fonction prend comme paramètres :


Paramètres
Description
$id Est un identifiant de l'entrée du menu
$txt Texte à afficher dans l'entrée du menu
$url URL du lien
$enabled Si true l'entrée est active.

false si on souhaite que l'entrée soit désactivée

Sauvegarder et tester votre module.

On voit bien que le menu contient maintenant une entrée « Ajouter » et si vous cliquer dessus rien ne se passe. C'est normal, l'action n'est pas gérée.

Ajout d'un titre

Pour ajouter un titre, modifiez le fichier user.php comme suit:

<?php 
require_once "base.php";
$babBody->setTitle(bab_translate("Add new", $GLOBALS['babAddonFolder']));
$babBody->addItemMenu("add", bab_translate("Add", $GLOBALS["babAddonFolder"]),$GLOBALS["babAddonUrl"]."user&idx=add"); 
?>

Création du formulaire d'ajout d'une nouvelle

La création du formulaire consiste en la création d'un fichier HTML contenant le template du formulaire et du code PHP pour afficher ce template.

En premier créer un répertoire newsaddon sous le répertoire ovidentia/skins/ovidentia/templates/addons et ajoutez y le fichier user.html. Enfin éditez ce dernier et insérer le code suivant:

<!--#begin newsaddform --> 
 <form name="newsadd" method="post" action="{ babPhpSelf }"> 
 <input type="hidden" name="tg" value="{ babAddonTarget }/user" > 
 <table align="center" border="0" cellpadding="2" cellspacing="0" width="50%"> 
 <tbody> 
 <tr> 
 <td class="BabLoginCadreBackground" align="center" valign="middle"> 
 <table align="center" border="0" cellpadding="5" cellspacing="0" width="100%"> 
 <tbody> 
 <tr> 
 <td class="BabLoginMenuBackground" align="right" nowrap="nowrap" valign="middle">{ titlelabel }:</td> 
 <td class="BabLoginMenuBackground" valign="middle"> 
 <input name="newstitle" size="50" maxlength="255" value="" type="text"> 
 </td> 
 </tr> 
 <tr> 
 <td class="BabLoginMenuBackground" align="right" valign="middle">{ bodylabel }:</td> 
 <td class="BabLoginMenuBackground" valign="middle"> 
 <textarea name="newsbody" cols="50" rows="10"></textarea> 
 </td> 
 </tr> 
 <tr> 
 <td class="BabLoginMenuBackground" nowrap="nowrap">&nbsp;</td> 
 <td class="BabLoginMenuBackground" valign="middle"> 
 <input name="baddnews" value="{ addlabel }" type="submit"> 
 <br> 
 </td> 
 </tr> 
 </tbody></table> 
 </td> 
 </tr> 
 </tbody></table> 
 </form> 
 <!--#end newsaddform -->

Un fichier template contient du code HTML et peut contenir plusieurs templates. Chaque template commence par :

<!--#begin xxxxxx --> 

et se termine par

<!--#end xxxxxx --> 

où xxxxxx est le nom du template.

Les variables d'un template sont toujours sous la forme

{ myvariable } 

Le nom de la variable et du template ne doivent pas contenir d'espace.

Pour afficher ce template, vous devez créer une classe PHP, l'instancier et appeler la fonction:

bab_printTemplate($class, $file, $template);

où:

  • $class est l'instance de la classe PHP qui contient les variables du template
  • $file est le nom du fichier qui contient le template
  • $template est le nom du template.

Affichage du formulaire

Maintenant que notre template est créé nous allons écrire le code PHP pour l'afficher. Pour cela éditez le fichier user.php et modifiez le comme suit:

<?php
require_once 'base.php';

function displayAddNewsForm()
{
global $babBody;

class displayAddNewsFormClass 
{
function displayAddNewsFormClass()
{
$this->bodylabel = bab_translate("Body", $GLOBALS['babAddonFolder']);
$this->titlelabel = bab_translate("Title", $GLOBALS['babAddonFolder']);
$this->addlabel = bab_translate("Add", $GLOBALS['babAddonFolder']);
}

}

$obj= new displayAddNewsFormClass();
$babBody->babecho( bab_printTemplate($obj,$GLOBALS['babAddonHtmlPath']."user.html", "newsaddform"));
}

$babBody->addItemMenu("add", bab_translate("Add", $GLOBALS['babAddonFolder']), $GLOBALS['babAddonUrl']."user&idx=add");
displayAddNewsForm();
?>

Sauvegardez et testez votre module. En cliquant sur le lien de la section « Utilisateur », le module affiche le formulaire de création d'un nouvelle.

Enregistrement de la nouvelle

Il faut sauvegarder la nouvelle dans la base de données. Pour cela modifier le fichier user.php comme suit:

<?php
require_once 'base.php';

function displayAddNewsForm()
{
global $babBody;
class displayAddNewsFormClass 
{
function displayAddNewsFormClass()
{
$this->bodylabel = bab_translate("Body", $GLOBALS['babAddonFolder']);
$this->titlelabel = bab_translate("Title", $GLOBALS['babAddonFolder']);
$this->addlabel = bab_translate("Add", $GLOBALS['babAddonFolder']);
}
}

$obj= new displayAddNewsFormClass();
$babBody->babecho( bab_printTemplate($obj,$GLOBALS['babAddonHtmlPath']."user.html", "newsaddform"));
}
 
function recordNews()
{
global $babBody, $babDB;
if( !empty($_POST['newstitle']) && !empty($_POST['newsbody']) )
{
$babDB->db_query("insert into newsaddon_news (news_title, news_body, news_datetime, news_author) values ('".$babDB->db_escape_string($_POST['newstitle'])."','".$babDB->db_escape_string($_POST['newsbody'])."',now(),'".$GLOBALS['BAB_SESS_USERID']."')");
}
else
{
$babBody->addError(bab_translate("All fields are required!", $GLOBALS['babAddonFolder']));
}
}
 
if( isset($_POST['baddnews']))
{
recordNews();
}

$babBody->title = bab_translate("Add new", $GLOBALS['babAddonFolder']);
$babBody->addItemMenu("add", bab_translate("Add", $GLOBALS['babAddonFolder']), $GLOBALS['babAddonUrl']."user&idx=add");
displayAddNewsForm();
?>


Maintenant les utilisateurs peuvent ajouter autant de nouvelles qu'ils le souhaitent. EN utilisant phpMyAdmin, vous pouvez le vérifier en affichant le contenu de la table newsaddon_news.

Peut être souhaitez-vous restreindre la création des nouvelles uniquement à certains groupes d'Ovidentia au lieu de laisser l'ensemble des utilisateurs le faire. Dans ce cas il faut utiliser les ACL ( Access Control List ) pour donner le droit de création uniquement à certains groupes.

Droits de création de nouvelle

Tout d'abord nous allons créer une table dans la base de données pour stocker ces droits. En utilisant phpMyAdmin, créer la table en utilisant la requête suivante:

CREATE TABLE newsaddon_newsadd_groups (
   id int(11) unsigned NOT NULL auto_increment,
   id_object int(11) unsigned DEFAULT '0' NOT NULL,
   id_group int(11) unsigned DEFAULT '0' NOT NULL,
   PRIMARY KEY (id));

où:


Champ
Type
Null?
Notes
id Integer Non Primary key, Autoincrement
id_object Integer Non
id_group Integer Non

Afin qu'Ovidentia puisse gérer les droits à votre place, il est nécessaire de respecter le noms des champs et de nommer votre table xxxx_groups.

Le champ id_object sert à Ovidentia pour stocker l'ID de l'objet sur lequel vous souhaitez gérer des droits. Par exemple, ça peut être l'ID de toute donnée stockée dans la base de données.

Les autres champs sont gérés complètement par Ovidentia.

Dans notre cas, nous souhaitons gérer les droits sur la création des nouvelles. Ce n'est pas un objet de la base de données et nous n'avons donc pas d'ID. Pas de problème, nous allons définir un ID nous même pour cette fonctionnalité, par exemple 1000. Vous pouvez choisir un tout autre nombre.

Editez le fichier admin.php et modifiez le comme ci-dessous:

<?php
require_once 'base.php';
include_once $babInstallPath."admin/acl.php";

if( isset($_POST['updateaccess']))
{
maclGroups();
$babBody->addError( bab_translate("Update done", $GLOBALS['babAddonFolder']));
}

$macl = new macl($GLOBALS['babAddonTarget']."/admin", 'idx_value', 1000, 'updateaccess');
$macl->addtable( 'newsaddon_newsadd_groups',bab_translate("Who can add news?", $GLOBALS['babAddonFolder']));
$macl->filter(0,0,1,1,1);
$macl->babecho();
?>


La classe macl prend en charge, à la place de votre module, la gestion des droits de l'affichage, au choix des groupes jusqu'à l'enregistrement dans la base de données.

A cette classe nous avons passé l'ID 1000 que nous avons choisi précédement et la variable 'updateaccess' qui nous sera retournée dans le tableau $_POST une fois le formulaire des droits soumis.

Pour de plus de détails sur l'utilisation des ACL consultez la rubrique Access Control List

Maintenant que les droits sont octroyés pour la création des nouvelles, modifions le fichier user.php afin qu'il vérifie si l'utilisateur a ou non le droit de créer une nouvelle. Pour cela on affichera le menu « Ajouter » que si l'utilisateur a le droit d'ajouter une nouvelle:

...

if( isset($_POST['baddnews']))
{
recordNews();
}

if( bab_isAccessValid('newsaddon_newsadd_groups', 1000))
{
$babBody->title = bab_translate("Add new", $GLOBALS['babAddonFolder']);
$babBody->addItemMenu("add", bab_translate("Add", $GLOBALS['babAddonFolder']), $GLOBALS['babAddonUrl']."user&idx=add");
displayAddNewsForm();
}

La fonction bab_isAccessValid() permet de vérifier les droits d'accès de l'utilisateur courant en utilisant une table des droits et l'ID d'un objet:

 bab_isAccessValid($table, $ID)

Mais ce n'est pas suffisant, il faudrait que lors de l'enregistrement de la nouvelle dans la base de données, on vérifie que l'utilisateur qui a soumis le formulaire de création est un utilisateur autorisé. Modifiez la fonction recordNews() comme ceci:

function recordNews()
{
global $babBody, $babDB;
if( bab_isAccessValid('newsaddon_newsadd_groups', 1000))
{
if( !empty($_POST['newstitle']) && !empty($_POST['newsbody']) )
{
 $babDB->db_query("insert into newsaddon_news (news_title, news_body, news_datetime, news_author) values ('".$babDB->db_escape_string($_POST['newstitle'])."','".$babDB->db_escape_string($_POST['newsbody'])."',now(),'".$GLOBALS['BAB_SESS_USERID']."')");
}
else
{
$babBody->addError(bab_translate("All fields are required!", $GLOBALS['babAddonFolder']));
}
}
else
{
$babBody->addError(bab_translate("You don't have rights to add news!", $GLOBALS['babAddonFolder']));
}
}

Affichage de la liste des nouvelles

Afin d'afficher la liste des nouvelles, nous allons modifier le fichier user.php pour y intégrer une nouvelle entrée Liste au menu. Lorsque l'utilisateur clique sur le lien de la section Utilisateur on affichera la page contenant la liste des nouvelles et s'il est autorisé à créer des nouvelles, il aura une autre entrée dans le menu pour le faire.

...
if( isset($_POST['baddnews']))
{
	recordNews();
}

$idx = bab_rp('idx', 'list');

switch($idx)
{
	case 'add':
		$babBody->addItemMenu("list", bab_translate("List", $GLOBALS['babAddonFolder']), $GLOBALS['babAddonUrl']."user&idx=list");
		if( bab_isAccessValid('newsaddon_newsadd_groups', 1000))
		{
		$babBody->title = bab_translate("Add new", $GLOBALS['babAddonFolder']);
		$babBody->addItemMenu("add", bab_translate("Add", $GLOBALS['babAddonFolder']), $GLOBALS['babAddonUrl']."user&idx=add");
		displayAddNewsForm();
		}
		break;
	case 'list':
	default:
		$babBody->addItemMenu("list", bab_translate("List", $GLOBALS['babAddonFolder']), $GLOBALS['babAddonUrl']."user&idx=list");
		if( bab_isAccessValid('newsaddon_newsadd_groups', 1000))
		{
		$babBody->addItemMenu("add", bab_translate("Add", $GLOBALS['babAddonFolder']), $GLOBALS['babAddonUrl']."user&idx=add");
		}
		break;
}

$babBody->setCurrentItemMenu($idx);
?>

La fonction bab_rp() permet de récupérer les variables des tableaux $_GET et $_POST ( voir Règles de codage )

En fonction de la valeur de la variable $idx on accède soit à la liste des nouvelles (list) soit au formulaire de création d'une nouvelle ( add ).

La fonction setCurrentItemMenu() permet de désactiver l'entrée courante du menu.

Création du template de la liste

Editez le fichier user.html et insérer à la fin le code HTML suivant:

<!--#begin newslist -->
<table align="center" border="0" cellpadding="2" cellspacing="0" width="95%">
<tbody><tr> 
<td align="center" valign="middle"> 
<table align="center" border="0" cellpadding="5" cellspacing="0" width="100%">
<tbody><tr> 
<td class="BabSiteAdminTitleFontBackground" nowrap="nowrap" valign="middle" width="30%">{ titlelabel }</td>
<td class="BabSiteAdminTitleFontBackground" valign="middle">{ bodylabel }</td>
</tr>
<tr> 
<td nowrap="nowrap" valign="middle"></td>
<td valign="middle"></td>
</tr>
</tbody></table>
</td>
</tr>
</tbody></table>
<!--#end newslist -->

Affichage de la liste

Et modifiez le fichier user.php pour inclure la fonction qui affiche ce template:

	...
	case 'list':
	default:
		$babBody->addItemMenu("list", bab_translate("List", $GLOBALS['babAddonFolder']), $GLOBALS['babAddonUrl']."user&idx=list");
		displayListNews();
		if( bab_isAccessValid('newsaddon_newsadd_groups', 1000))
	...

et ajouter l'implémentation de la fonction displayListNews():

function displayListNews()
{
	global $babBody;
	class displayListNewsFormClass 
	{
		function displayListNewsFormClass()
		{
		$this->bodylabel = bab_translate("Body", $GLOBALS['babAddonFolder']);
		$this->titlelabel = bab_translate("Title", $GLOBALS['babAddonFolder']);
		}
	}
	$obj= new displayListNewsFormClass();
	$babBody->babecho( bab_printTemplate($obj,$GLOBALS['babAddonHtmlPath']."user.html", "newslist"));
}

Si vous testez votre module, vous remarquez que pour le moment on affiche un tableau vide. Pour afficher la liste des nouvelles il faut interroger la base de données pour avoir la liste et les afficher en utilisant le template. C'est ce que nous allons faire.

Tout d'abord, on va récupérer la liste des nouvelles de la base de données. Modifier la fonction displayListNewsForm() comme suit:

function displayListNews()
{
	global $babBody;
	class displayListNewsFormClass 
	{
		function displayListNewsFormClass()
		{
		global $babDB;
		$this->bodylabel = bab_translate("Body", $GLOBALS['babAddonFolder']);
		$this->titlelabel = bab_translate("Title", $GLOBALS['babAddonFolder']);

		$this->res = $babDB->db_query("select * from newsaddon_news");
		$this->count = $babDB->db_num_rows($this->res);
		}

		function nextrow()
		{
		global $babDB;
		static $k=0;
		if( $k < $this->count)
		{
			$arr = $babDB->db_fetch_array($this->res);
			$this->newstitle = $arr['news_title'];
			$this->newsbody = $arr['news_body'];
			$k++;
			return true;
		}
		else
		{
			return false;
		}
		}
	}
	$obj= new displayListNewsFormClass();
	$babBody->babecho( bab_printTemplate($obj,$GLOBALS['babAddonHtmlPath']."user.html", "newslist"));
}

et le template ainsi:

<!--#begin newslist -->
<table align="center" border="0" cellpadding="2" cellspacing="0" width="95%">
<tbody><tr> 
<td align="center" valign="middle"> 
<table align="center" border="0" cellpadding="5" cellspacing="0" width="100%">
<tbody><tr> 
<td class="BabSiteAdminTitleFontBackground" nowrap="nowrap" valign="middle" width="30%">{ titlelabel }</td>
<td class="BabSiteAdminTitleFontBackground" valign="middle">{ bodylabel }</td>
</tr>
<!--#in nextrow -->
<tr> 
<td nowrap="nowrap" valign="middle">{ newstitle }</td>
<td valign="middle">{ newsbody }</td>
</tr>
<!--#endin nextrow -->
</tbody></table>
</td>
</tr>
</tbody></table>
<!--#end newslist -->

Vous remarquez que pour afficher les nouvelles, on fait appel, dans le template, à la forme:

<!--#in nextrow -->
...
<!--#endin nextrow -->

Le moteur de template d'Ovidentia fait appel à la fonction nextrow() définie dans la classe et affiche ce qu'il y'a entre ces deux tags tant que cette fonction retourne true. La fonction nextrow() à son tour parcoure le résultat de la requête SQL et initialise les variables.

Enregistrer les modifications et tester le module.

Maintenant qu'on a affiché la liste des nouvelles, on va modifier l'affichage afin d'utiliser une couleur de fond pour alterner les nouvelles. Pour cela, éditez d'abord le fichier des templates user.html et modifiez le comme suit:

<!--#begin newslist -->
<table align="center" border="0" cellpadding="2" cellspacing="0" width="95%">
<tbody><tr> 
<td align="center" valign="middle"> 
<table align="center" border="0" cellpadding="5" cellspacing="0" width="100%">
<tbody><tr> 
<td class="BabSiteAdminTitleFontBackground" nowrap="nowrap" valign="middle" width="30%">{ titlelabel }</td>
<td class="BabSiteAdminTitleFontBackground" valign="middle">{ bodylabel }</td>
</tr>
<!--#in nextrow -->
<!--#if bred -->
<tr bgcolor="red">
<!--#else bred -->
<tr>
<!--#endif bred -->
 
<td nowrap="nowrap" valign="middle">{ newstitle }</td>
<td valign="middle">{ newsbody }</td>
</tr>
<!--#endin nextrow -->
</tbody></table>
</td>
</tr>
</tbody></table>
<!--#end newslist -->

La structure :

<!--#if bred -->
	...
<!--#else bred -->
	...
<!--#endif bred -->

permet d'afficher une partie de template selon la valeur d'une variable, ici bred. Cette variable doit être initialisée dans le contructeur à true et doit changer d'état à chaque affichage d'une nouvelle:

	...// dans le constructeur
	$this->bred = true;
	...
	...
	
	// dans la fonction nextrow()
	$this->bred = !$this->bred;

Utilisation des schémas d'approbation

[EN COURS DE REDACTION]

Utilisation de l'OVML

[EN COURS DE REDACTION]