Implémentation de containers OVML dans un module

Un article de OviWiki.



Sommaire

Exemple de container

bab_Functionality::includefile('Ovml/Container');
 
 
class Func_Ovml_Container_Test extends Func_Ovml_Container
{
 
    public function setOvmlContext(babOvTemplate $ctx)
    {
        parent::setOvmlContext($ctx);
 
        $id = $ctx->get_value('id');
 
        $this->count = 4;
    }
 
 
 
    public function getnext()
    {
        if ($this->idx >= $this->count) {
            return false;
        }
        $this->ctx->curctx->push('CIndex', $this->idx);
 
        $this->ctx->curctx->push('Variable1', ...);
        $this->ctx->curctx->push('Variable2', ...);
        $this->idx++;
    }
 
}

Exemple de fonction

bab_Functionality::includefile('Ovml/Function');
 
class Func_Ovml_Function_Uppercase extends Func_Ovml_Function
{
    public function toString()
	{
 
        if (count($this->args)) {
            foreach ($this->args as $p => $v) {
                switch (mb_strtolower(trim($p))) {
 
                    case 'text':
                        $text = $v;
                        break;
 
                    case 'saveas':
                        $saveas = $v;
                        break;
                }
            }
 
            if (!$text) {
                $text = '';
            } else {
                $text = str_toupper($text);
            }
 
        }
 
        if ($saveas) {
            $this->gctx->push($saveas, $text);
            return '';
        }
        return $text;
    }
 
}

Introduction

Il est indispensable de connaître le langage OVML pour comprendre la suite de ce chapitre (Voir la documentation OVML).

Le langage OVML apparaît dans Ovidentia afin de permettre aux administrateurs de personnaliser leurs pages d'accueil ou autres fichiers. L'avantage du langage est qu'il s'intègre facilement dans un code html et que son code reste compatible avec les nouvelles versions d'Ovidentia. Les données récupérées sont généralement présentes dans la base de données, la syntaxe du langage évite des accès directs aux enregistrements. Dans le cadre d'un module, il est parfois nécessaire de créer de nouvelles fonctions OVML si les fonctions existantes du noyau ne sont pas suffisantes.

Syntaxe d'utilisation des containers OvML des modules :

<OCAddon name="" param1="" param1="" ...>
 	<OVvar1>
 	<OVvar2>
 </OCAddon>

name : nom de l'add-on où se trouve la fonction (préfixe de l'add-on) param1 : premier paramètre d'envoi au module, généralement le nom de la fonction à utiliser param2 : deuxième paramètre d'envoi au module, généralement le premier paramètre de la fonction ovml du module …

Explication : Lorsqu'on va utiliser le container OCAddon, le moteur ovml d'Ovidentia va envoyer au module plusieurs données ainsi que les paramètres du container OCAddon. De son côté, le module renvoit les valeurs correspondantes aux variables de la fonction utilisée (<OVvar1> et <OVvar2> dans cet exemple).

Fonctionnement

Pour gérer de nouvelles fonctions OVML dans notre module, il faut ajouter un fichier ovml.php dans le répertoire du module contenant les fichiers PHP (dossier Programs dans le fichier zip ou $babInstallPath/addons/add-on prefix).

Le fichier ovml.php doit contenir la fonction :

function addon-name_ovml($args) {} où addon-name est le préfixe du nom de l'add-on et $args est un tableau associatif qui contiendra les noms des paramètres envoyés ainsi que leurs valeurs.

Le fonctionnement de cette fonction est laissé au programmeur. Exemple de récupération des paramètres :

if (isset($args['param1'])) {
 	switch($args['param1']){
 		case '1': ...
 		case '2': ...
 	}
 }

Une chose importante est de toujours renvoyer un tableau indexé comprenant des tableaux associatifs contenant les noms des variables (sans le préfixe OV) et leurs valeurs. Le tableau renverra plusieurs lignes donc plusieurs tableaux des mêmes variables dans le cas où plusieurs enregistrements sont retournés. Le container ovml <OCAddon> fera autant de boucles qu'il y a d'index dans le tableau.

Remarque : si aucun résultat, il faut renvoyer un tableau vide.

Exemple de renvoi du tableau :

$tab = array();
 $feed['var1'] = "value var1";
 $tab[0] = $feed;
 return $tab;