Wikini

ActionRedirect

PagePrincipale :: DerniersChangements :: DerniersCommentaires :: ParametresUtilisateur :: Vous êtes ec2-34-236-152-203.compute-1.amazonaws.com
<< ActionRecentlyCommented ListeDesActionsWikiNi ActionResetPassword >>



L'action {{redirect page="PagePrincipale"}} permet d'être redirigé vers une autre page lorsqu'une page est demandée (ici vers la PagePrincipale). Cela permet de faire des "alias" de page, plusieurs noms différents pour une même page.

Synthèse des cas où cette action peut être utile :

Une différence notable entre une inclusion et une redirection : lors d'une inclusion, le contenu de la page incluant une autre page peut être modifé, donc utiliser l'inclusion pour faire des alias de page ne me parait pas très sûr car il risque d'apparaitre des divergences de contenu si c'est la page incluant une autre page qui est modifée. Par contre, une redirection impose qu'une seule page est éditable et la cohérence de contenu est donc correcte.
-- GarfieldFr

Paramètres


Cette action accepte un seul paramètre :

Modification d'une page contenant l'action redirect

Il faut entrer manuellement dans la barre d'adresse du navigateur l'adresse de la page + le "handler" désiré ; par exemple :
Pour la modifier :
Pour la supprimer :



Bugs


J'ai remarqué un bug: si on essai de faire une redirection vers une URL absolue (comme un site internet quelconque), WikiNi interpréte cela comme un nom de page et popose sa création.
Explication par l'exemple: ExempleBugActionRedirect (avec l'utilisation du code {{redirect page="http://www.google.com"}}). On pourrait peut-être envisager de limiter la redirection vers une page qui existe déjà.
-- Nicephore17


09/02/2005

Lorsqu'on a activé la prévisualisation obligatoire des pages avant enregistrement des modifications, il est impossible d'enregistrer une page qui est une redirection vers une autre. En effet cliquer sur Aperçu n'affiche pas la page éditée mais la cible de la redirection, qui n'est pas en cours d'édition. Il n'y a alors pas de bouton Sauver (il n'y a pas de boutons du tout) et il est impossible d'enregistrer cette page. -- JmPhilippe


<< ActionRecentlyCommented ListeDesActionsWikiNi ActionResetPassword >>



Ailleurs



Discussions

Je découvre des possibilités d'usages imprévues de l'action redirect, moyennant des modifications de l'action.
Nous avons mis en oeuvre sur websemantique.org une redirection vers la date du jour : pour l'utiliser {{redirect page="NomDePage" suffix="today"}} qui va donner une redirection vers NomDePage20040205 pour aujourd'hui ; {{redirect page="NomDePage" prefix="today"}} s'utilise pour préfixer plutôt que suffixer. Cette fonctionnalité peut servir par exemple pour créer la CitationDuJour ou bien l'AgendaDuJour ou bien encore OccupationDeLaSalle4AujourdHui ou autres.
Par ailleurs, on peut imaginer beaucoup d'autres applications :
Je pense qu'il y a encore beaucoup d'autres applications. Pourriez-vous me dire ce que vous en pensez et s'il y a des catégories temporelles que vous voudriez vous ajouter ?
Si tout le monde est d'accord, je souhaite intégrer cette modification quand le CVS sera à nouveau opérationnel.
Ci-dessous le premier code qui gère la date du jour :
<?php
# Permet de faire une redirection vers une autre pages Wiki du site

# Parametres : page : nom wiki de la page vers laquelle ont doit rediriger (obligatoire)

# exemple : {{redirect page="BacASable"}}
#
# Copyrigth Eric Feldstein 2003 mailto:garfield_fr@tiscali.fr
# Complétée par Charles Népote. mailto:charles02@nepote.org
#
# Licence GPL, vous etes libre d'utiliser et de modifier ce code a condition de
# laisser le copyright d'origine. Vous pouvez  bien sur vous ajouter a la liste
# des auteurs.
#
# Installation : copier le fichier dans le repertoire "actions" de WikiNi

// Récuperation des parametres
$redirPageName $this->GetParameter("page");
if (
$this->GetParameter("suffix") == "today"$redirPageName .= date("Ymd");
if (
$this->GetParameter("prefix") == "today"$redirPageName date("Ymd").$redirPageName;


if (!
$this->GetParameter("page")){
    echo 
$this->Format("//Le param&ecirc;tre \"page\" est manquant.//");
}else{
    if (
eregi("^".$redirPageName."$",$this->GetPageTag())){
        echo 
$this->Format("//Impossible &agrave; une page de se rediriger vers elle m&ecirc;me.//");
    }else{
        
$fromPages = array();
        
$fromPages explode(":",$_COOKIE['redirectfrom']);
        if (
in_array($this->GetPageTag(),$fromPages)){
            echo 
$this->Format("//Redirection circulaire.//");
        }else{
            
$fromPages[] = $this->GetPageTag();
            
SetCookie('redirectfrom'implode(":",$fromPages), time() + 30"/");
            
$this->Redirect("wakka.php?wiki=$redirPageName");
        }
    }
}

?>


Attention la ligne $this->Redirect("wakka.php?wiki=$redirPageName");, bien que fonctionnelle, est à aménager pour ceux qui utilisent la réécriture d'URL.

-- CharlesNepote

C'est en effet une modification amusante, mais je me demande si il faut l'intégrer telle qu'elle car, après tout, la valeur du suffix/préfix pourrait être n'importe quoi d'autre que "today". Ou alors mettre un tableau de configuration qui à chaque nom de sufix/préfix associe une expression php à évaluer ( fonction eval() ). Mais ça veux dire qu'il faut connaitre PHP pour faire ce que l'on veux --GarfieldFr

Oui, je comprends ta remarque et je suis d'accord, mais je ne vois pas bien d'autres solutions... La solution eval() complique pas mal et comporte des risques.
Je conçois que ma proposition n'est pas idéale mais elle a le mérite d'être simple : peut-être à intégrer dans "contrib" ?
-- CharlesNepote

Je voyais un truc du genre (à la vérification de la syntaxe pré et de l'utilisation correct de eval ) :
<?php
//un tableau dans wakka.config.php :
$aSuffixPrefix = array('today' => 'date("Ymd")'
                             
'agedemagrandmere'=>'unefonction()');

//et dans le code de redirect :
if (!empty($this->GetParameter("suffix"))) $redirPageName .= eval($aSuffixPrefix[$this->GetParameter("suffix")]);
if (!empty(
$this->GetParameter("prefix"))) $redirPageName = eval($aSuffixPrefix[$this->GetParameter("suffix")]) . $redirPageName ;
?>

C'est vrai que ce n'est pas très simple, mais en fournissant un ensemble de prefix/suffix correct, on ne touche pas au code de l'action et il est facile de rajouter des préfixes/suffixes ... à condition de maitriser à peu prés la fonction eval() --GarfieldFr

J'aime bien cette idée bien que je n'en ai pas du tout besoin :-j. En fait on pourrait tout simplement donner un accès direct à la fonction php date() ou alors strftime() (mais ça pourrait être fort compliqué si on veut pouvoir faire des lastyear etc. car alors il faudrait faire des combinaisons avec strtotime(), ce qui signifie deux paramètres...)
Mais en fait pour éviter d'avoir à modifier ce fichier on pourrait imaginer un système modulaire, ça devrait être assez aisé... De plus si les modules sont de simples fichiers (et non des fonctions), ils auront accès à GetParameter, et pourraient éventuellement utiliser d'autres paramètres de l'action. Par exemple un module pourrait faire simple date('Ymd') tandis qu'un autre pourrait faire une date au format voulu par l'utilisateur ou encore calculer l'age que ma grand mère avait le jour spécifié par un autre paramètres de l'action.
(A vrai dire je préfère quand les modules sont des fonctions car ça permet de n'inclure qu'une seule fois le fichier même si on n'en a besoin plusieurs fois, et cela permet aussi de déclarer n'importe quelle fonction à l'intérieur de ce fichier sans se soucier de leur existance au préalable. Pour accéder à la ClasseWiki, les fonctions peuvent soit utiliser la variable globa $wiki soit on peut la leur fournir via un paramètre) -- LordFarquaad

Lors d'une redirection, j'avais besoin que l'ActionRedirect retienne des paramètres passés à l'url.

Le cas de figure est que je voulais pouvoir changer le titre de la page de recherche dans le cadre d'un site multilingue, sans toucher au code de footer. Je propose donc deux pages qui redirigent toutes vers une seule: RechercheTexte et ZoeKen? redirigent sur SearCh?. Cela me permet d'afficher un lien vers la page de recherche dans chacune des langues proposées par mon site. Dans mon cas, au moment de la redirection, le paramètre phrase nécessaire à l'action textsearch était perdu.

Quoiqu'il en soit, cette modification du code de redirect a sans doute d'autres applications.

Dites-moi si ça pose des problèmes auxquels je n'ai pas pensé. --AureLie

<?php

//récupération de critères envoyés par GET
$criteres "";
$variables $_GET;
reset($variables);
while (list(
$key$val) = each($variables)) {
    if(
$key!="wiki"$criteres .="&".$key."=".$val;
}

//recuperation du parametres de page
$redirPageName $this->GetParameter("page");

// élaboration de l'adresse de redirection
$redirection "wakka.php?wiki=$redirPageName$criteres";

// ... et plus bas, modifier la ligne $this->Redirect(...

            
$this->Redirect("$redirection");
?>


Je vois une application, qui pourrait fonctionner en aménageant un peu ton code, c'est de pouvoir mémoriser en paramètre le nom de la page source pour éviter les redirections circulaires ! On pourrait ainsi concevoir un système plus propre évitant les redirections circulaires, sans cookies (cf. tes commentaires ci-dessous).
Peux-tu mettre ton code en ligne sur ton site pour qu'on le teste ? Je ne vois pas d'inconvénients pour intégrer ton code à WikiNi, mais le mieux serait d'avoir l'avis de GarfieldFr qui est le "père" de cette fonction sur WikiNi...
-- CharlesNepote

Pour moi, si le code marche correctement, il n'y a pas de problèmes, les modifs d'AureLie peuvent être ajoutées. --GarfieldFr



Problème des redirections circulaires


L'idée d'Aurélie pour éviter les redirection circulaire est une bonne idée à tester, mais il y a un problème concernant la taille de l'URL en fin de parcour. En effet, le cookie que j'utilise stock la liste de toutes les pages parcourus et pas seulement la première, dans un requète GET, cela va poser le problème de la taille de la requète qui est limité en longeur à quelque chose comme 1024 ou 512 caractères. La je n'ai pas le temp de me pencher dessus, je m'attaque à la réécriture de l'action {{attach}} et à l'accès CVS auquel je n'arrive pas à accéder. --GarfieldFr

Je ne comprends pas bien le principe de redirection circulaire... Le but est de stocker toutes les pages parcourues? Quel rapport avec la page redirigée?
De toute façon, la liste des pages parcourues en 30 secondes peut-elle être très longue? (cf. commentaire)
+ Mon code est en ligne: choisissez le néerlandais, cliquez sur le titre de la page QuilomBo?, ceci lance l'url: "http://quilombo.collectifs.net/wakka.php?wiki=ZoeKen&phrase=QuilomBo". Or, ZoeKen? redirige sur SearCh?. On arrive bien sur la page SearCh? et le paramètre de recherche "QuilomBo?" a bien été conservé. Est-ce que je réponds à la question?--AureLie

Le code de l'action redirect évite les redirection circulaire. Par exemple, une pageA redirige vers pageB qui redirige vers pageC qui redirige vers pageD, si pageD redirige vers une des pages précédente, on a une redirection circulaire et donc une boucle infini. Pour évité cela, il faut stocker le nom de toutes les pages visitées pour s'assurer que la page courante n'a pas déjà été visité. Quand je dis visité, je ne parle pas par l'utilisateur mais par l'action, seule la dernière page est affichée. Le temp de 30secondes pour le cookie, c'est simplement que je considère que l'envois et la lecture par l'utilisateur de la page finale devrait prendre au moins 30 secondes et donc le cookie devient obsolète et n'est pas renvoyé par le navigateur. C'est une manière assez peu élégante de supprimer la liste des pages parcouru lors de la redirection. Pour répondre à ta question, ce n'est pas le nombre de page qui importe mais la longeur totale du nom des pages parcourus en tenant compte des séparateur, cela peut devenir rapidement très long dans le cas d'une page avec un nom du style LeNomDUnePageTresLong? qui redirige vers une page avec un nom aussi long.
Il faut bien comprendre que le cas de redirection circulaire est marginal mais en vertu du principe "si c'est pas prévu, c'est sur que l'utilisateur va le faire et ca va planter" (vieille adage de développeur) il faut traiter le cas. --GarfieldFr

Ooooooook! Bon, j'ai pas encore de solution, mais j'y réfléchis... --Aurélie

La gestion des redirections circulaire est tout à fait buggée actuellement:

Je pense que l'idéal est d'utiliser une variable de session, celles-ci étant stockées même si le script est arrêté avant sa fin (par exemple dans le cas d'une redirection...)
La technique:
Le code que je propose:
<?php
//recuperation du parametres
$redirPageName $this->GetParameter('page');

if (!
$redirPageName) {
    echo 
'<em><strong>Erreur ActionRedirect</strong>: Le param&egrave;tre "page" est manquant.</em>';
} else {
    if(!isset(
$_SESSION['redirects'])) $_SESSION['redirects'] = array();
    
$_SESSION['redirects'][] = strtolower($this->GetPageTag());

    if(
in_array(strtolower($redirPageName), $_SESSION['redirects'])) {
        echo 
"<em><strong>Erreur ActionRedirect</strong>: redirection circulaire depuis la page $redirPageName ("
            
$this->ComposeLinkToPage($redirPageName'edit''cliquez ici pour l\'éditer') . ')</em>';
    } else {
        
$this->Redirect($this->Href(''$redirPageName));
    }
}
?>

-- LordFarquaad



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