Documentation de WikiNi 0.4.1
L'action
{{include page="PagePrincipale"}} (
WikiNi >= 0.4.1) permet d'inclure dans une page une autre page du wiki (ici la page
PagePrincipale). Cette action possède plusieurs applications :
- elle permet de regrouper plusieurs pages en une seule et donc, par exemple, créer un document à partir de différentes "sections" disséminées dans plusieurs pages
- elle permet de commenter/critiquer une page en lecture seule en l'incluant dans le corps d'une autre page
- elle peut permettre, par exemple, de constituer des blocs d'informations redondantes qui seront répétés (inclus) dans plusieurs autres pages (il peut s'agir d'un menu, d'une signature, d'une mention légale, ou autre)
- encore plus fort ! il est possible de configurer ainsi le menu de navigation de WikiNi de cette manière ! dans le fichier wakka.config.php, il suffit d'indiquer :
- "navigation_links" => "{{include page=\"MenuDuHaut\"}}",
- et de créer dans la page MenuDuHaut ce que l'on souhaite voir apparaître. Cette page peut être protégée en lecture seule pour tout le monde et en écriture pour les administrateurs fonctionnels.
c'est sans doute la manière la plus simple, la plus habile et la plus rapide de construire un menu que je connaisse ! Même hypercard ne faisait pas mieux !!--
FidelioEspoir
Paramètres
Cette action accepte deux paramètres :
- page : paramètre obligatoire pour désigner la page à inclure (sans lequel l'action ne fonctionne pas)
- class : désignant une ou plusieurs classes de style, séparées par des espaces, agissant sur la mise en forme de l'inclusion ; ce paramètre est optionnel.
Actuellement,
WikiNi intègre plusieurs classes prédéfinies pour gérer la mise en forme de l'inclusion :
Wikini propose par défaut les "Actions" suivantes.
Liens connexes :
Voir aussi :
Ces classes de style peuvent être employées cumulativement. Ainsi, si l'on souhaite obtenir, par exemple, une boite grise avec une bordure et de petits caractères, on employera :
{{include page="PagePrincipale" class="gray_background solid_border small_fonts"}}
L'inclusion par défaut, pour le moment, produit une présentation non différenciée par rapport au reste de la page ; il faut
spécifier un style (comme en HTML classique), pour le voir appliqué. L'utilisation des classes de style doit faire l'objet d'une attention particulière, certains navigateurs ne supportant que peu ou pas les styles CSS.
La boite ci à droite correspond à l'inclusion suivante :
{{include page="ListeDesActionsWikini" class="right height15em small_fonts solid_border gray_background"}}
Une page ne peut-être inclue dans elle-même : cela provoquerait une boucle récursive infinie : un page affichant une page, affichant une page, affichant une page, etc.
De même, les boucles d'inclusion portant sur plus d'une page, sont impossibles. Prenons par exemple : un page
Page1 inclus une page
Page2 qui inclus une page
Page3? qui inclus la page
Page1. Lorsque ont demande à afficher la page
Page1, on voit le contenu des pages
Page1,
Page2 et
Page3? et le message d'erreur indiquant qu'il est impossible d'inclure une page dans elle même. En effet, la page "active" est
Page1 et le test dans l'action
{{include}} regarde si le nom de la page inclus est le même que celui de la page active ce qui provoque une erreur car l'inclusion d'autres pages ne change pas la page active.
On verra cet exemple concrètement développé dans
ActionIncludeExempleDeBouclePage1 et suivantes.
Il faut remercier
GarfieldFr pour l'impulsion donné au développement de cette action.
Discussions
Problème lié à l'utilisation d'un include pour gérer l'interface utilisateur
Nous avons évoqué plus haut la possibilité d'employer l'action
include pour laisser le contrôle de l'interface à l'utilisateur ; à ce titre, nous avons pris l'exemple du contrôle du menu de navigation grâce à un include : dans le fichier wakka.config.php, il suffit d'indiquer :
"navigation_links" => "{{include page=\"MenuDuHaut\"}}",
Cette possibilité a un effet de bord un peu génant : lorsque l'on affiche la page source, MenuDuHaut dans notre exemple, un message d'erreur est affiché en lieu et place du menu :
Impossible à une page de s'inclure dans elle même. Ce message est logique dans le cas d'un include d'une page dans corps même de sa propre page, mais il serait en revanche souhaitable que l'include fonctionne normalement lorsque l'include est réalisé en-dehors du corps de la page. (Suis-je clair ?)
Il existe une solution technique assez simple mais que je ne trouve pas très élégante : dans /handlers/page/show.php il suffit :
- de déclarer une variable juste avant le traitement du corps du texte et de la remettre à 0 après le traitement
- de tester la variable dans /actions/include.php
Dans /wakka.php :
var $page;
Dans /handlers/page/show.php :
// display page
- $this->page_body = "1";
- echo $this->Format($this->page["body"], "wakka");
- $this->page_body = "0";
Dans /actions/include.php :
if (eregi("^".$incPageName."$",$this->GetPageTag?()) and $this->page = "1") {
- echo $this->Format("//Impossible à une page de s'inclure dans elle même.//");
(non testé)
Qu'en pensez-vous ? Voyez vous d'autres solutions ?
--
CharlesNepote
Je ne pense pas que ce soit utile de faire un test sur le fait que l'on soit dans le corp ou l'entête de la page simplement parce que la personne habilité à modifier le menu (ou toutes autre partie de l'interface) est l'administrateur du site et donc doit savoir ce qu'elle fait. Si la documentation de l'action indique que l'inclusion d'une page dans elle même est impossible, et bien le message d'erreur ne lui semblera pas anormal.
--
GarfieldFr
- La personne habilité à modifier le menu n'est pas forcément l'administrateur du site. Je suis actuellement en train de mettre en place en intranet un menu gauche où les utilisateurs veulent voir les actualités du site : les actualités du site est une page accessible à la totalité des utilisateurs ; chacun y publie ce qu'il veut, l'actualité est ainsi immédiatement publiée en page dans chaque menu de chaque page du wiki. Je peux vous citer beaucoup d'autres exemples où un élément de "menu" -- tout du moins un élément répetté sur chaque page -- peut avoir un intérêt à être modifié par tout utilisateur. Peut-être que le test que je propose n'est pas une bonne solution mais le problème ergonomique reste entier : le message "Impossible à une page de s'inclure dans elle même." pose problème aux utilisateurs. -- CharlesNepote
Vers une personnalisation poussée de WikiNi ?
On peut aussi améliorer cette action en ajoutant la possibilité de styler le code produit à l'aide du paramètre "style" : ce dernier permet d'entrer du code CSS de façon équivalente à l'attribut HTML "style" : exemple :
{{include page="PagePrincipale" style="font-size: 9px;"}}
Cependant, il existe quelques problèmes de sécurité dus à l'attribut "style". J'ai posé la question dans la liste spécialisé CSS en français ; cf. le fil de discussion suivant :
http://fr.groups.yahoo.com/group/pompeurs/message/4085?threaded=1
Je vais voir comment il est possible d'intégrer l'attribut "style" en filtrant les propriétés CSS passées en paramètre.
--
CharlesNepote
Inclusion d'une page d'un autre WikiNi
Dans la page
WikiNiSyndication,
DavidDelon parle de recoder l'action
include pour faire de la syndication. J'ai codé une telle action include. Maintenant, le nom de la page est soit un URL soit une page
WikiNi local. Les syntaxe suivante sont donc valide :
- {{include page="http://www.wikini.net/wakka.php?wiki=ActionInclude"}}
- {{include page="ActionInclude"}}
Avec le changement de serveur arrive des problèmes de référence circulaire, cela est géré.
La seule chose qui ne soit pas gérée est le transfert des styles d'un serveur à l'autre, c'est à dire que si la page incluse provient d'un autre
WikiNi et que cette page inclus elle même une page avec un certain style, l'affichage pourra être différent.
J'ai déjà testé les références circulaires, mais pas de manière exhaustive. Je n'est pas vérifié si droit de lecture était correctement vérifié, à priori oui car la méthode /raw vérifie les droits de lecture.
Voici le code de l'action pour teste :
WikiNiSyndication
--
GarfieldFr
Trés bien cette action, le codage de l'ancienne syndication ne me plaisait pas vraiment. Je teste tout cela (éventuellement à partir de la branche CVS de Test si on se met d'accord dessus). --
DavidDelon
Tout ce que je fais de "distribuable à mon avis" se retrouve dans le CVS TEST pour que vous puissiez le tester. Donc la modification de include pour le support de page externe au site est dans le CVS TEST. --
GarfieldFr
NOTE
I have been trying to get the
ActionInclude to work on the latest (0.1.2) Wakkawiki code. I copied the include.php from the 0.4.1 tar ball and drop it on the /actions directory. I added var $parameter = array(); to the wakka class and added the function
GetParameter? as well. Still is not working, even though I am calling it {{include page="HomePage"}} it still says the parameter "page" is missing. Am I missing something? Thanks! --
DavidCollantes (
http://www.netbros.com/)
You did right in adding $parameter = array() and fonction
GetParameter?() in wakka.php, but you should also make these changes in wakka.php near line 330 :
// prepare an array for extract() to work with (in $this->IncludeBuffered())
if (is_array($matches))
{
for ($a = 0; $a < count($matches); $a++)
{
$vars[$matches[1][$a]] = $matches[2][$a];
$this->parameter[$matches[1][$a]]=$matches[2][$a];
}
}
}
if (!$forceLinkTracking) $this->StopLinkTracking();
$result = $this->IncludeBuffered(strtolower($action).".php", "<i>Unknown action \"$action\"</i>", $vars, $this->config["action_path"]);
$this->StartLinkTracking();
if (isset($parameter)) unset($this->parameter[$parameter]);
unset($this->parameter);
- Excellent!!! It works!!! Thanks!!!
Peut-on inclure une page d'un autre Wiki ?, d'un autre site ? --
FidelioEspoir
Non, cela est impossible. Il s'agit d'inclusion de page
WikiNi uniquement car la page incluse est soumise au formatage de Wikini et donc une page google ne peut pas être incluse. Par contre il doit etre possible d'ecrire une action du style {{includeURL URL="http://www.google.com/search?q=contrepeterie"}}. --
GarfieldFr
Par contre, avec quelques modifications, il doit être possible d'inclure une page d'un autre
WikiNi --
GarfieldFr
Idée superbe : tout ce qui permet de densifier les mailles du réseau enrichit
WikiNi --
FidelioEspoir
Include, page d'aide et MultiWikiNi
Ta fonction est parfaite pour insérer une page constamment actualisée. Lorsque je propose d'ouvrir une nouvelle fenêtre, c'est dans l'optique d'un changement de registre : Texte et Aide sur le texte , Web et meta-Web. L'avantage d'une nouvelle fenêtre permet de ne pas mélanger les deux historiques. On peut ainsi consulter plusieurs pages d'aide tout en restant sur la page étudiée. On peut surtout rester sur la Page Sujet tout en lisant les pages SujetAvisdeX , SujetAvisdeXY ou sur les pages "SujetHier , "SujetDemain . Cela permet en quelque sorte de quitter le Wiki, ensemble linéaire de liens à une dimension, pour un
MultiWikiNi. --
FidelioEspoir
Paramètre créant un bouton d'ouverture/fermeture du texte de l'include
Mais, pour te convaincre que je continue à adorer l'action "include", j'aimerais lui voir attacher une petite (!!??) action sous forme d'un bouton (!!???!!) : Fermer/ouvrir l'include. Clic et je lis le texte inséré, clic je le referme. Il suffit de (ah aha ah !) changer le style de l'include te dirait yakataka ! --
FidelioEspoir
Il faut voir : cf.
http://www.meyerweb.com/eric/css/edge/popups/demo.html. Je trouve le challenge assez amusant, mais je ne vois pas encore beaucoup d'applications (des idées ?). --
CharlesNepote
Ce site est superbe d'intelligence que... je n'ai pas. J'utilise le css pour seulement changer les couleurs de mon site. Utiliser les CSS au lieu d'un javascript est certainement l'avenir pour le développeur. Mais j'écris toujours ici en tant qu'utilisateur. L'avantage d'une seconde fenêtre est de permettre de continuer à écrire sur une page,
tout en continuant à lire l'autre. Mes remarques "informatiques" essayent de me faire mieux comprendre plus vite et surtout de vous convaincre que je partage vos difficultés de prog. Que tu y trouves aussi un plaisir, un amusant challenge me ravit au plus haut point !
En débutant mon site, j'avais mis à gauche une colonne menu permettant à chacun d'aller directement là où il le désire. (idée trouvée ici du côté de l'Afrique ;-) voir
ContributionsAvancees ) . Cette solution s'avère éminemment utile pour des sites où les pages se suivent à la queue leu leu. Mon site utilisant une pléthore de liens entre pages, elle s'avère finalement moins nécessaire et surtout elle prenait de la place dans chaque page. J'ai bien essayé de la faire disparaître avec le fameux bouton clic-clac, jour-nuit, en dédoublant mes wakka.css (bleu, jaune vert, marron...) avec leurs sosies où la table-column deviendrait width=0, où le texte serait invisible...J'ai abouti à un carnage : tout était sens dessus dessous, et les liens invisibles fonctionnaient toujours...Je l'ai donc abandonnée au profit d'un include en première page. A moins qu'un malicieux s'empare d'un bouton magique et s'y amuse... tant mieux pour tous !! ;-) --
FidelioEspoir
MenuDuHaut suite : création d'un menu personnalisé
Vous avez installé un menu "include". il est possible maintenant d'y ajouter une ligne "menupersonnel" :
Création d'une action menuutilisateur.php que l'on installe dans une page
MenuUtilisateur
<?php
/*...
licence GPL...
*/
if ($phrase = $_REQUEST["phrase"])
{
$phrase = trim($phrase);
$this->SetPersistentCookie("menu",$phrase,1);
$this->Redirect($this->href());
}
echo $this->FormOpen("", "", "get") ;
?>
<table border="0" cellspacing="0" cellpadding="0">
<tr>
<td>NomWiki uniquement </td>
<td><input name="phrase" size="40" value="<?php echo htmlentities($this->Getcookie("menu")) ?>" /> <input type="submit" value="Menu choisi" /></td>
</tr>
</table>
<?php echo $this->FormClose(); ?>
puis dans header.php
....<?php echo $this->config["navigation_links"] ? $this->Format($this->config["navigation_links"])." \n" : "" ?>
////
<br />
<a href="<?php echo $this->config["base_url"]?> menuduhaut" ">Menu</a> :
<?php
//pm
$menu = htmlentities($_COOKIE["menu"]);
$menu = explode(" ",$menu);
$menupersonel = "";
foreach ($menu as $nom){
$menupersonel = $menupersonel . $this->Link($nom)." ";
}
$menupersonel = rtrim($menupersonel);
if (!empty($menupersonel)) echo $menupersonel ;
?>
<br />
////
.....
et le menupersonel s'inscrit juste après le menuduhaut
Toute amélioration du script est fortement encouragée !
Chaque utillisateur enregistré ou non peut ainsi construire un menu contenant les cartes qu'il fréquente le plus. A l'usage, vous ne pourrez plus vous en passer ! 2004-05-22 -- 18 : 24 --
FidelioEspoir
Question: Pourquoi les images incluses dans une page pointée par un include ne sont pas visibles?
StephaneCvr
- Réponse: en principe elles devraient être visible, cela peut dépendre de la manière dont tu as inclus l'image. Par exemple, via l'action {{attach}} cela devrait effectivement planter(mais pas sur, je sais plus trop comment j'ai codé l'action include), mais si tu met l'url complète de l'image il ne devrait pas y avoir de problème. Aurais tu une page exemple ? --GarfieldFr