Wikini

WikiNiSyndication

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-98-84-18-52.compute-1.amazonaws.com
En fait, l'idée c'est d'importer le contenu d'une page WikiNi vers un autre WikiNi.

(Cliquez sur "Editer cette page" pour voir le code d'appel)

Cette fonctionnalité devrait être recodée dans la nouvelle action ActionInclude -- DavidDelon DavidDelonASuivre

Cette action était bien cachée ! Elle mérite beaucoup, beaucoup mieux. C'est superbe ! Plusieurs wikistes, wikiniens ou wikiens(?) distants peuvent instantanément échanger leurs pages et les modifier "en direct". Il leur suffit d'ouvrir une page contenant l'includeSyndication vers la page des autres. Grâce à cela, le wiki n'a plus besoin d'un centre unique où l'échange se fait par page interposée dans un seul et unique wiki. Cette action rend transparent l'import/export des pages et ce en temps réel....sans manipulation à répéter à chaque fois...Heureusement, car les bras m'en tombent de joie !!! -- FidelioEspoir

Attention : cette action charge le contenu à chaque affichage de la page (= appel de l'action). Ce qui veut dire en particulier que l'affichage de cette page dépend d'une connexion réseau du serveur Wiki contenant l'action vers le serveur Wiki contenant la page à extraire. Ce n'est pas sans conséquence, en particulier au niveau de la lenteur de l'affichage. Il faut impérativement prévoir un cache du contenu récupéré sur ce type d'action. -- ProgFou (qui travaille avec 35 pays francophones qui sont loin d'avoir tous des super liaisons internationales...)

Exemples :


Syndication de [[|http://ns3423.ovh.net/~test/wakka UnePageDeTest]] :


[[|http://ns3423.ovh.net/~test/wakka UnePageDeTest]] => ne fonctionne plus à ce jour...


Syndication de [[|http://www.wikistes.levillage.org/wakkafr/wakka.php?wakka=Walk/raw& WaLk]] : (appel compatible WakkaFr 0.1)


[[|http://www.wikistes.levillage.org/wakkafr/wakka.php?wakka=Walk/raw& WaLk]] => ne fonctionne plus à ce jour...



Syndication de [[|http://knowledge.martignier.net/wakka.php?wakka=MyPostit/raw& MyPostIt]] : (appel compatible WakkaFr 0.1)


[[|http://knowledge.martignier.net/wakka.php?wakka=MyPostit/raw& MyPostIt]] => ne fonctionne plus à ce jour...


Utilisation de l'action include pour la syndication
J'ai fait un test en modifiant l'action include pour qu'elle puisse prendre un URL comme nom de page. Voici le code utilisé :
<?php
// récuperation du parametres
$incPageName $this->GetParameter("page");
// TODO : améliorer le traitement des classes
if ($this->GetParameter("class")) {
    
$array_classes explode(" "$this->GetParameter("class"));
    foreach (
$array_classes as $c) { $classes $classes "include_" $c " "; }
    }

// Affichage de la page ou d'un message d'erreur
if (empty($incPageName)) {
    echo 
$this->Format("//Le paramètre \"page\" est manquant.//");
} else {
    if (
eregi("^".$incPageName."$",$this->GetPageTag())) {
        echo 
$this->Format("//Impossible à une page de s'inclure dans elle même.//");
    } else {
        if (!
$this->HasAccess("read",$incPageName)){
            echo 
$this->Format("//Lecture de la page inclue $page non autorisée.//");
        } else {
            
//test si c'est une page distante
            
if (eregi("^http:(.*)$",$incPageName)){
                
$incPage implode(file($incPageName."/raw"));
                
$output $this->Format($incPage);
            }else{
                
$incPage $this->LoadPage($incPageName);
                
$output $this->Format($incPage["body"]);
            }
            if (
$classes) echo "<div class=\""$classes,"\">\n"$output"</div>\n";
            else echo 
$output;
        }
    }
}

?>

Ce code permet d'inserer le contenu d'une page d'un autre WikiNi. Le seul problème est lorsque la page distante contient elle même une inclusion. Cette inclusion n'est pas résolue ou pas correctement si c'est une inclusion de page et pas d'URL.

Par exemple : {{include page="http://www.wikini.net/wakka.php?wiki=ActionInclude"}} mis sur une page d'un autre WikiNi insèrera bien la page ActionInclude, mais cette page contient elle même l'inclusion de la page ListeDesActionsWikini. Donc, à moins d'avoir une page ayant le même nom sur le WikiNi appelant, il y aura un "blanc" à la place. Si une telle page existe sur le WikiNi appelant, rien ne prouve que le contenu soit correct....
--GarfieldFr

J'ai modifié l'action include de manière à pouvoir insérer une page WikiNi distante et cela même si cette dernière inclus elle même des pages (distante ou non). Ca a l'air de fonctionner.
Voici le code de cette action :
<?php
// TODO : voir si on peut evite une variable globale
global $PageLocalisation;    //tableau (pile) indiquant si la page est locale ou distante
if (!isset($PageLocalisation)) {
    
$PageLocalisation = array();
}

// récuperation du parametres
$incPage = array();    //la page courante : tableau associatif avec les cle 'name' et 'isLocal'
$incPage['name'] = $this->GetParameter("page");

// TODO : améliorer le traitement des classes
if ($this->GetParameter("class")) {
    
$array_classes explode(" "$this->GetParameter("class"));
    foreach (
$array_classes as $c) { $classes $classes "include_" $c " "; }
}

// Affichage de la page ou d'un message d'erreur
if (empty($incPage['name'])) {
    echo 
$this->Format("//Le paramètre \"page\" est manquant.//");
} else {
    
//determination de la localisation de la page
    
if (eregi("^http:(.*)$",$incPage['name'])||eregi("^https:(.*)$",$incPage['name'])){
        
//si le nom commence par "http:" => distante
        
$incPage['isLocal'] = FALSE;
    }else{
        
//le nom de la page n'est pas http://xxxx => la localisation de la page
        // courante = localisation de la page precedente
        
if (count($PageLocalisation)==0){
            
$incPage['isLocal']=TRUE;
        }else{
            
$incPage['isLocal'] = $PageLocalisation[count($PageLocalisation)-1]['isLocal'];
        }
        if (
$incPage['isLocal']==FALSE){
            
//si la page est distante => calcul de l'URL complete par rapport a l'URL
            //de la page precedente. La page courante etant sur le meme serveur que
            //la page precedente !!
            
$aURL parse_url($PageLocalisation[count($PageLocalisation)-1]['name']);
            
$PageUrl $aURL['scheme'].'://';
            if (!empty(
$aURL['username'])){
                
$PageUrl .=    $aURL['username'].':'.$aURL['password'].'@';
            }
            
$PageUrl .= $aURL['host'].((empty($aURL['port'])?'':':'.$aURL['port']));
            
$PageUrl .= $aURL['path'].'?wiki='.$incPage['name'];
            
$incPage['name'] = $PageUrl;
        }
    }

    
//recherche une reference circulaire
    
$canInclude True;
    foreach (
$PageLocalisation as $aPage){
        if (
$aPage['name']==$incPage['name']){
            
$canInclude False;
        }
    }
    if (
$canInclude){
        
array_push($PageLocalisation,$incPage);    //on sauve le fait que la page est local/distante
        
if ($incPage['isLocal']){    //si c'est une page local
            //test le droit de lecture avant affichage
            
if (!$this->HasAccess("read",$incPage['name'])){
                
$output $this->Format("//Lecture de la page inclue $page non autorisée.//");
            }else{
                
$incPage $this->LoadPage($incPage['name']);
                
$output $this->Format($incPage["body"]);
            }
        }else{    
//si c'est une page distante
            
$incPage implode(file($incPage['name']."/raw"));
            
$output $this->Format($incPage);            
        }
        
array_pop($PageLocalisation);
        if (
count($PageLocalisation)==0) unset($PageLocalisation);    //supprime le tableau global alloué
    
}else{
        
$output $this->Format("//Référence circulaire de la page //".$incPage['name']);
    }
    if (
$classes) echo "<div class=\""$classes,"\">\n"$output"</div>\n";
    else echo 
$output;    
}

?>

NB: il y a une gestion des références circulaires
--GarfieldFr


PageSuivieParGarfieldFr


Les accès htaccess ne sont pas gérés. Ce n'est pas grave, mais c'est bon de le savoir. Et ce n'est pas le cas général...


Commentaires [Cacher commentaires/formulaire]