Wikini

AjouterDesModulesAuNoyauWikiNi

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-54-159-186-146.compute-1.amazonaws.com
Un Besoin

Il y a trois manières pour ajouter ou modifier des fonctionnalités de WikiNi :

Les actions et les handlers sont modulaires et une simple copie de fichier suffit à installer un nouveau handler ou une nouvelle action. Cependant, de nombreuses fonctionnalités, comme en témoigne les ContributionsAvancees proposées, nécessitent une modification du noyau de WikiNi.
Nous aurrions besoin d'un mécanisme simple permettant d'étendre le noyau de WikiNi sans pour autant avoir à le modifier profondément.


Pistes de solutions

GarfieldFr a proposé, pour RendreModulaireLaGestionDesUtilisateurs, une piste de solution qui parait tout à fait intéressante. Je l'ai reformulée ici mais l'idée de départ est de lui.

Une classe module_x gère les fonctionnalités que l'on souhaite intégrer au coeur de Wikini. La classe Wiki crée dans son constructeur (la méthode Wiki() ) une instance $module_x de cette classe. Pour appeler les fonctions de ce module (cette classe), il suffit d'écrire :
--GarfieldFr

Peux-tu donner des exemples de code ?
Peux-t-on employer des fonctions de la classe wiki dans la classe module_x ?

J'imagine qu'il doit être possible de tester automatiquement la présence ou non de modules.
Solution 1 :
Solution 2 : enregistrer les modules dans wakka.config.php.
Autres solutions ?
-- CharlesNepote

Bon, j'ai essayé plusieurs codes mais je n'arrive à rien.
Classe à inclure : test.class.php
<?php
class Test
{
    
// Constructeur
    
function Test()
    {
    }

    function 
BlaBla($text)
    {
        return 
"Fonction BlaBla : impression depuis la classe test :".$text;
    }
}
?>


Action test2.php :
<?php
echo $this->$classtest->BlaBla("essai");
?>


Où dois-je mettre :
require ('_modules/test.class.php');
$classtest = new Test;
J'ai beau essayer de les mettre dans/en dehors de la classe Wiki, dans/en dehors de la fonction Wiki(), etc. Je n'arrive qu'à des erreurs...
-- CharlesNepote


Pour que cela fonctionne il faut utiliser les déclarations suivantes :
<?php

// Modifications dans le fichier wakka.php
//ne pas oublier include du fichier ou est la class

include '..../_modules/test.class.php' // exemple

/* ces includes pourraient etre fait en dynamique en fonction du contenu du repertoire _module
    Idem pour les instances de Class et les déclarations d'objet Class
*/

// dans la class Wiki
class Wiki
{
    
// rajouter la déclaration de l'objet
    
var $test;

    
// constructor
    
function Wiki($config)
    {
        
// ajouter l'instance de la class Test
         
$this->test = new Test($this); //
    
}
}
?>


Rajout pour pouvoir utiliser la class Wiki dans la class Test il faut modifier le code de cette derniere comme ceci :
<?php
class Test
{
    var 
$wiki;

    
// Constructeur
    
function Test($wiki)
    {
        
$this->wiki $wiki
        
// les appels se font ensuite comme ceci : $this->wiki->GetPageTag() par exemple
    
}

    function 
BlaBla($text)
    {
        return 
"Fonction BlaBla : impression depuis la classe test :".$text;
    }
}
?>

--GouBs

Il faut utiliser des références plutôt que des affectations simples sinon il y a recopie des objets donc le code précédent devrait plutôt être :
<?php

// Modifications dans le fichier wakka.php
//ne pas oublier include du fichier ou est la class

include '..../_modules/test.class.php' // exemple

/* ces includes pourraient etre fait en dynamique en fonction du contenu du repertoire _module
    Idem pour les instances de Class et les déclarations d'objet Class
*/

// dans la class Wiki
class Wiki
{
    
// rajouter la déclaration de l'objet
    
var $test;

    
// constructor
    
function Wiki($config)
    {
        
// ajouter l'instance de la class Test
         
$this->test = & new Test($this); //
    
}
}
class 
Test
{
    var 
$wiki;

    
// Constructeur
    
function Test(&$wiki)
    {
        
$this->wiki = &$wiki
        
// les appels se font ensuite comme ceci : $this->wiki->GetPageTag() par exemple
    
}

    function 
BlaBla($text)
    {
        return 
"Fonction BlaBla : impression depuis la classe test :".$this->wiki->Format($text);
    }
}

?>

--GarfieldFr

J'ai (PiiF) utilisé un principe proche de ça dans :

Pour faire comme proposé ici, on pourrait faire ça :

Pour cela, je viens de tester ce code, ça marche :

fichier test.php

<?php
class wiki {
    var 
$moi="ICI";

    function 
wiki() {
        
$d dir('classes');
        while (
$f $d->read()) {
            if( (
$f != ".") && ($f != "..") && (!is_dir($f))
                && 
preg_match('/^(.*)\.php[34]?$/'$f$r) ) {
                    include_once(
'classes/'.$f);
                    
$cls$r[1];
                    
$this->$cls= new $cls($this);
            }
        }
    }
}

$w= new wiki();
$w->toto->qqchose();
?>


fichier classes/toto.php

<?php
class toto {
    var 
$wiki;

    function 
toto($wiki) {
        
$this->wiki$wiki;
        echo 
"constructeur toto, depuis ".$this->wiki->moi."<br/>";
    }
    function 
qqchose() {
        echo 
"un truc de la classe toto, depuis ".$this->wiki->moi."<br/>";
    }
}
?>



Même remarque que précédement sur les références --GarfieldFr

Le principe d'utiliser des classes pour les différents besoins de WikiNi serait le suivant :
Voila l'idée générale ... et pour bien faire, ca veux dire réécrire WikiNi complètement car faire migrer un code pas vraiment entièrement objet vers un code entièrement objet est une source de bug !
Pour info, je suis en train d'écrire un wiki qui sera entièrement objet avec quelques fonctionnalités particulières comme le choix de la syntaxe d'édition d'une page (un utilisateur peut choisir d'éditer une page avec la syntaxe WikiNi ou PhpWiki ou autre) --GarfieldFr


Il n'y a pas de commentaire sur cette page. [Afficher commentaires/formulaire]