Nom de la contribution : ActionCondition
Description : Permet aux utilisateurs d'afficher des choses différentes grâce à des instructions conditionnelles
Type de contribution : Action
Fonctionne avec : WikiNi 0.4.3
Intégration technique : placez le contenu de l'archive dans './actions'
Mainteneur : LordFarquaad
Licence : GPL
Dernière version : 0.1.1-20041223 (beta)
Dernière livraison : 23/12/2004
Accès au code et mise en oeuvre : http://contributions-wikini.notredomaine.org/ActionCondition-v.0.1.1-20041223.zip
Démonstration : http://www.notredomaine.org/ActionCondition
Intégration au projet WikiNi :
Bugs : [signaler ici les bugs connus]
Mode d'emploi :
Utilisez l'action comme ceci:
- {{condition if="cond" then="Texte à afficher" else="Texte à afficher"}}
L'action va vérifier la condition
cond et afficher la partie
then si elle est vérifiée ou la partie
else (facultative) sinon.
Dans
cond, vous pouvez utiliser la liste de fonctions décrites par
{{condition/list}}. Vous pouvez les combiner de la façon suivante:
- Pour vérifier fonctionA et fonctionB: fonctionA([arguments[,...]]) and fonctionB([arguments[,...]])
- Pour vérifier fonctionA ou fonctionB: fonctionA([arguments[,...]]) or fonctionB([arguments[,...]])
- Pour inverser une fonction : not fonction([arguments[,...]) (inverse uniquement la fonction ou la parenthèse qui suit)
- Par défaut les conditions sont évaluées de gauche à droite, pour empêcher cela vous pouvez utiliser des parenthèses comme bon vous semble. Par exmple:
- {{condition if="not (exempletest() or not exempletest()) and exempletest()" then="..."}}
- NB.: toutes les parenthèses non fermées sont considérées comme automatiquement fermées en fin de condition. Si vous fermez une parenthèse de trop elle est ignorée un une message d'avertissement apparait.
La casse n'a pas d'importance (sauf éventuellement dans les arguments des fonctions)
Suivant le résultat de la condition, la partie
then ou
else est passée au moteur wiki pour que celui l'analyse comme du texte normal. Cependant si vous voulez utiliser d'autres actions, la balise de fin d'action ("}}") pose problème car le moteur la confondra avec celle de l'
ActionCondition. Pour éviter cela placez une antislash au milieu (comme ceci: "}\}"). Vous pouvez faire de même avec la balise ouvrante mais ça ne sert à rien...
De même les guillemets doubles posent problème puisqu'ils servent normalement à encadrer les arguments. Remplacez donc chaque guillemet double par deux guillemets simples.
NB.: le tracking des liens est stoppé pendant l'évaluation de l'
ActionCondition, et rétabli à son ancien état après.
Les fonctions utilisables doivent être placées dans le dossier './actions/ConditionFunctions'. Il n'existe encore que 4 fonctions utilisables dans les conditions:
- Exempletest() -- renvoie toujours vrai, consultez ce fichier (Exmpletest.php) pour savoir comment créer d'autres fonctions
- Userloggedin() -- renvoie vrai si l'utilisateur qui regarde la page est connecté.
- Usernameis(NomDUtilisateur1[, ...]) -- renvoie vrai si l'utilsateur qui lit la page est dans la liste passée en arguments.
- Pagecalleris(NomDePage) -- renvoie vrai si la page actuelle est NomDePage. (permet de vérifier les inclusions... je n'ai rien trouvé de mieux pour l'instant sans modifier l'ActionInclude...)
- Pourquoi as tu besoin de faire un tel test ? --GarfieldFr
- Personnellement je n'en ai pas besoin, mais cela pourrait permettre à une page d'afficher des choses différentes suivant si elle est incluse ou non. Par exemple un lien vers la page qui est sensée l'inclure. -- LordFarquaad
Pour obtenir de l'aide sur ces fonctions, utilisez la commande
- {{condition help="NomDeLaFonction"}}
Pour obtenir la liste des fonctions avec leur aide, utilisez:
Pour établir une liste de toutes les fonctions sous forme de liens:
Vous trouverez plus de détails dans l'entête du fichier condition.php
Applications possibles:
- Ne montrer le formulaire de connexion qu'aux gens qui ne sont pas connectés (par exemple sur la PagePrincipale):
- Avec des fonctions qui ne sont pas encore créées:
- Sélectionner une page en fonction de la langue de l'utilisateur, par exemple comme ceci:
- {{condition if="preferredlanguage(fr)" then="[[MaPageEnAnglais english version]]{{include ''MaPageEnFrancais''}\}" else="[[MaPageEnFrancais version française]]{{include ''MaPageEnAnglais''}\}"}}
- Masquer les liens vers des pages auxquelles un utilisateur n'a pas accès:
- {{condition if="usercanread(MaPageDAdministration)" then="MaPageDAdministration"}}
- les idées sont les bienvenues...
Important : l'
ActionCondition ne protège
en aucun cas l'accès aux pages, elle ne sert qu'à masquer certaines choses et à en montrer d'autres...
Notes aux développeurs : modifiez l'
ActionCondition "
à vos risques et périls", le code est assez fragile, notemment à cause des nombreux appels récursifs (et réciproques) des fonctions mises en jeux... Modifier la moindre chose peut donc parfois faire apparaître des boucles infinies...
Si vous avez des suggestions d'optimisation elles sont les bienvenues. Je pense qu'il y a moyen de travailler en une seule étape plutôt qu'en deux, ce qui serait en toute logique plus performant... seulement au niveau du code ce serait probablement beaucoup moins clair...
Par contre la gestion des erreurs me paraît assez bonne: si une erreur se produit dans un appel récursif, elle affiche un message d'erreur (convivial) et la valeur
NULL est retransmise jusqu'à l'origine pour empêcher la poursuite de l'exécution de l'action.
Changelog
2004-12-23 - version 0.1.1
- Ajout de la fonction usernameis - Remerciements à ElerosseElanesse?
- Correction d'un bug provoquant un mauvais affichage du nom de la fonction dans le message d'erreur lorsque l'on demandait l'aide d'une fonction inexistante.
- Correction du message d'erreur affiché lors de l'un appel de pagecalleris sans arguments.
2004-12-07 - version 0.1.0
- L'action dispose dés fonctions exempletest, userloggedin et pagecalleris.
Votre avis m'intéresse !
J'hésite un peu à la poster dans les
ContributionsClesEnMain, car pour l'instant on ne sait pas en faire grand chose, il faut encore programmer des fonctions conditionnelles... --
LordFarquaad
A mon avis, cette action est bien trop complexe pour des utilisateurs "normaux" de
WikiNi. Je pense qu'il serait plus interressant de coder les conditions dans les actions elles-mêmes, par exemple pour l'affichage de l'action {{usersettings}} si l'utilisateur est loggé ou non. En tout cas, c'est un bel effort de participation! --
GarfieldFr
- Oui de fait c'est un rien complexe, elle est en effet plutôt destinée aux utilisateurs avancés de WikiNi. Elle serait probablement utile à un administrateur qui ne s'y connaîtrait pas en PhP/MySQL, et permet d'éviter d'avoir à mettre la main dans le cambouis... Je pense qu'il peut y avoir de nombreux cas où elle peut être utile, même si on peut très bien s'en passer... Elle pourrait notemment servir de moyen pour "dynamiser" les pages d'un WiKi: c'est énorme ce que l'on peut faire grâce à des instructions conditionnelles, et ça pourrait être le début d'un "langage de programmation" simplifié (j'ai vu quelques personnes que ça intéressait, voulant permettre d'utiliser du code PhP directement, sans se rendre compte des risques que cela engendrait...) Désolé, je m'emballe un peu, les idées surgissent sans prévenir ;-)...
- A vrai dire j'ai eu une idée simple au départ qui consistait à permettre des vérifications conditionnelles simples (juste un appel de fonction), et puis les idées se sont succédées (notemment pour les "and", "or" et "not") et je n'ai pas pu m'empêcher de mettre tout cela en pratique :-P -- LordFarquaad