Certains des exemples que nous fournissons ci-dessous ne sont pas complets. D'emblée, nous nous en excusons, bien sûr. Mais pourquoi diable sont-ils incomplets ?
Ils sont incomplets parce que nous y travaillons en ce moment et que plutôt que de vous faire patienter jusqu'à ce qu'ils soient tous terminés, nous avons préféré vous les livrer dans l'état où ils se trouvent pour que vous puissiez vous faire une idée de ce qu'ils illustrent.
Au fur et à mesure de notre avancement, nous ferons les mises à jour idoines. Nous espérons résorber notre retard au plus vite.
title
, le paramètre heading
, le paramètre text
, le paramètre xsl
, LSRegionSubtag, Language Switchers, LSFormEnroll, LSContentsLegal, sitemap, substitution de propriétés, LSSourceFile et LSContentsSourceFile, LSContentsComments, LSContentsCharter, ... (05/11/2013)onload
et onunload
d'une page, Page settings, ... (22/09/2013)Si votre contenu n'est valable qu'à partir d'une certaine date et heure, vous pouvez lui adjoindre des caractéristiques de publication. Dans l'exemple suivant, l'île ne sera affichée qu'au 1er janvier 2009, à partir de 3 heures du matin :
<Island id="promo" active="yes" pubdate="20090101030000"> <param name="storage">/islands/promo.php</param> </Island>
Si par contre ce contenu n'était plus valable à partir d'une autre date et
heure, il suffirait d'adjoindre à l'île un attribut expiry
.
Dans l'exemple qui suit, l'île n'est plus valable à partir du 31 janvier
2009, à 23:59:59 :
<Island id="promo" active="yes" expiry="20090131235959"> <param name="storage">/islands/promo.php</param> </Island>
Il est possible de mêler les deux attributs comme le démontre l'exemple suivant :
<Island id="promo" active="yes" pubdate="20090101030000" expiry="20090131235959"> <param name="storage">/islands/promo.php</param> </Island>
Il est aussi possible de mentionner des expressions PHP pour les attributs de publication et d'expiration. L'exemple qui suit illustre bien la manière qu'a Vae Soli! de traiter ces infos :
<Island id="promo" active="yes" pubdate=".php= return '20090701000000';"> <param name="storage">/islands/promo.php</param> </Island>
Pour l'exemple nous avons pris quelque chose de très simple mais vous pouvez bien évidemment appeler une de vos propres fonctions PHP qui prend en considération une série de paramètres pour finalement indiquer la date et heure de publication. Le même mécanisme existe pour la date et heure d'expiration.
Vous pourriez avoir besoin d'écrire du code XHTML avant l'inclusion d'une
île et après son inclusion. C'était déjà possible avec l'utilisation des
blocs pre-rendering-block
et post-rendering-block
mais c'est aujourd'hui encore plus facile avec les paramètres
pre-xhtml
et post-xhtml
comme le démontre l'exemple
suivant :
<Archipelago id="sidebar" active="yes" category="sidebar"> <Island id="citation" active="yes" class="LSContentsCitation"> <param name="storage">/citations/citations.xml</param> <param name="keyword"></param> <param name="recno">random</param> <param name="pre-xhtml"><![CDATA[<div id="MyCitations">]]></param> <param name="post-xhtml"><![CDATA[</div>]]></param> </Island> </Archipelago>
La balise <link>
possède un attribut qui est le plus
souvent ignoré : rel
. Un autre attribut, un attribut
miroir dirions-nous, existe également mais il est encore plus ignoré que
ne l'est l'attribut rel
. Il s'agit de l'attribut
rev
!
Pourtant, l'attribut rel
possède une réelle valeur qui peut
influencer favorablement le classement d'une page dans les moteurs de
recherche et également aider ceux-ci à rassembler du contenu qui est, d'une
manière ou d'une autre, lié.
Ainsi, l'écriture d'un didacticiel sur le web est un parfait candidat à
l'utilisation de la balise <link>
et à son attribut
rel
. La page courante peut dès lors être rattachée à la page
précédente et à la page suivante comme le montre l'exemple qui suit :
<head> … <title>Chapitre 5</title> <link rel="prev" href="/chapitre4.php" /> <link rel="next" href="/chapitre6.php" /> </head>
De cette manière, les moteurs de recherche (et même les navigateurs) peuvent proposer une navigation intelligente améliorant sensiblement le confort de lecture. À cet avantage s'ajoute un ordonnancement des pages permettant de mieux les regrouper.
Revenant à l'exemple du didacticiel, il est intéressant de mentionner à tout moment la première page … ce qui se fera de la manière suivante :
<head> … <title>Chapitre 5</title> <link rel="start" href="/intro.php" /> <link rel="prev" href="/chapitre4.php" /> <link rel="next" href="/chapitre6.php" /> </head>
Ces trois possibilités vous sont offertes dans Vae Soli!, version 2.0.0009,
sous les paramètres LSStartPage
, LSPreviousPage
et
LSNextPage
.
Ces fonctionnalités sont loin d'être des broutilles car elles autorisent un confort de navigation accru bien réel. Ainsi le navigateur Opera vous permet de sauter d'une page à l'autre directement. Par exemple, imaginons que nous soyons sur la page Paneb au pays des couleurs — Partie 1, alors l'enfoncement de la barre d'espace (avec Opera !) fait défiler la page. Arrivé au bout de la page, Opera nous fait automatiquement passer à la page suivante, soit Paneb au pays des couleurs — Partie 2 et ainsi de suite jusqu'à la fin de la série de pages liées. Voilà qui est éminemment pratique.
La mise en œuvre de ces paramètres se fait directement dans le géorama comme nous le montrons ci-dessous :
<Land> <Defaults> <Settings> <LSStartPage><![CDATA[http://www.latosensu.be/start.html]]></LSStartPage> <LSPreviousPage><![CDATA[http://www.latosensu.be/page1.html]]></LSPreviousPage> <LSNextPage><![CDATA[http://www.latosensu.be/page2.html]]></LSNextPage> </Settings> </Defaults> … </Land>
Vous pouvez également modifier ces propriétés directement dans la page. Voici par exemple une modification entreprise dans le contenu d'une île qui représente la partie 2 d'une suite de pages liées :
<?php $this->szStartPage = $this->Self; $this->szPreviousPage = $this->Self . '?part=1'; $this->szNextPage = $this->Self . '?part=3'; ?>
Lorsque plusieurs domaines sont résolus vers le même site, il est possible de n'afficher une île que si un domaine précis est visité. Par exemple, vous pourriez décider de n'afficher un contenu publicitaire que sur la version commerciale d'un site.
Comment vous y prendre ? Tout simplement en mentionnant un attribut
landscape
sur l'île comme dans l'exemple suivant :
<Archipelago id="sidebar" active="yes" category="sidebar"> <xi:include href="sidebar.xml" /> <Island id="citation" active="yes" landscape="www.vaesoli.org" class="LSContentsCitation"> <param name="storage">/citations/citations.xml</param> <param name="recno">random</param> </Island> <Island id="clock" active="yes" landscape="www.vaesoli.com" class="LSContentsMedia"> <param name="mediatype">swf</param> <param name="comment">This will be brought in the XHTML output</param> <param name="src">http://www.latosensu.be/media/clock.swf</param> <param name="autoplay">true</param> <param name="loop">true</param> <param name="width">200</param> <param name="height">200</param> <param name="showcontrols">false</param> <param name="embed">true</param> <param name="scale">scale"</param> <param name="wmode">opaque</param> </Island> </Archipelago>
La première île, citation
, ne sera affichée que pour le domaine
www.vaesoli.org
tandis que la seconde île,
clock
, sera affichée quant à elle pour le domaine
www.vaesoli.com
.
Juste avant que la page ne soit rendue, Vae Soli! est capable de transformer toute une série de mots par d'autres grâce au jeu des « substitutions ».
Ces dernières sont en fait une des fonctionnalités les plus étonnantes de Vae Soli!. Pour que ce soit possible, il faut charger un fichier de substitutions. Cela se fait en mentionnant ledit fichier dans le géorama :
<Georama xmlns:xi="http://www.w3.org/2001/XInclude" version="3.0"> … <Pangaea> <Defaults> <Settings> <LSSubstitutions><![CDATA[/substitutions.xml]]></LSSubstitutions> … </Settings> </Defaults> </Pangea> </Georama>
Par exemple, sur le site de Vae Soli!, chaque fois que « Vae Soli! » est écrit, on fait jouer une substitution pour nous éviter d'écrire le mot en entier. On a en fait écrit "{{{VAE}}}".
Un fichier de substitutions est un fichier XML au format semblable à celui-ci :
<?xml version="1.0" encoding="utf-8"?> <Dictionary active="yes"> <Data key="{{{VAE}}}" active="yes" editable="yes"> <Value><![CDATA[Vae Soli!]]></Value> </Data> <Data key="{{{LS}}}" active="yes" editable="yes"> <Value><![CDATA[Lato Sensu Management]]></Value> </Data> … </Dictionary>
Vae Soli! prévoir également des substitutions variables en fonction de
la langue de la page. C'est l'intérêt de l'attribut lang
d'une substitution :
<?xml version="1.0" encoding="utf-8"?> <Dictionary active="yes"> <Data key="{{{ADRESSE}}}" active="yes" editable="yes"> <Value lang="fr"><![CDATA[Rue Amédé Bracke, 9 - 1950 Crainhem]]></Value> <Value lang="nl"><![CDATA[Amédé Brackestraat, 9 - 1950 Kraainem]]></Value> </Data> … </Dictionary>
Il est même possible de prévoir des substitutions qui ne sont valables qu'à partir d'une certaine date :
<?xml version="1.0" encoding="utf-8"?> <Dictionary active="yes"> <Data key="{{{ADRESSE}}}" active="yes" editable="yes"> <Value pubdate="20090615"><![CDATA[Rue Amédé Bracke, 9 - 1950 Crainhem]]></Value> </Data> … </Dictionary>
Semblable à la date de publication d'une substitution, on trouve la date et heure d'expiration :
<?xml version="1.0" encoding="utf-8"?> <Dictionary active="yes"> <Data key="{{{ADRESSE}}}" active="yes" editable="yes"> <Value expiry="20081231"><![CDATA[Rue Amédé Bracke, 9 - 1950 Crainhem]]></Value> </Data> … </Dictionary>
<?xml version="1.0" encoding="utf-8"?> <Dictionary active="yes"> <Data key="{{{ADRESSE}}}" active="yes" editable="yes"> <Value expiry="20081231"><![CDATA[Rue Amédé Bracke, 9 - 1950 Kraainem]]></Value> <Value pubdate="20090101"><![CDATA[Avenue des fleurs, 44 - 1000 Bruxelles]]></Value> </Data> … </Dictionary>
Vous pouvez décider de l'activation d'une substitution en fonction du
domaine sur lequel le visiteur surfe. Par exemple, plusieurs domaines
peuvent être résolus par le même site (e.g. www.vaesoli.net
,
www.vaesoli.org
et www.vaesoli.com
). Dans ce
cas, certaines substitutions doivent être traitées d'une manière ou
d'une autre.
<?xml version="1.0" encoding="utf-8"?> <Dictionary active="yes"> <Data key="{{{COMPANY}}}" active="yes" editable="yes"> <Value landscape="www.domain.com"><![CDATA[Ma belle entreprise]]></Value> <Value landscape="www.domain.org"><![CDATA[Ma belle société]]></Value> </Data> … </Dictionary>
Depuis l'opus "4.5.0100"
Les substitutions peuvent également être applicables sur une adresse IP bien particulière. C'est bien pratique lorsque vous testez un site en mode local par rapport à un mode serveur par exemple.
<?xml version="1.0" encoding="utf-8"?> <Dictionary active="yes"> <Data key="{my-message}" active="yes" editable="yes"> <Value ip="127.0.0.1"><![CDATA[Hello, me!]]></Value> <Value><![CDATA[Hello, you!]]></Value> </Data> … </Dictionary>
Depuis l'opus "2.5.0018"
Il est possible de ne pas appliquer les substitutions via la propriété
MustSubstitute
. Cette propriété est mise à true
par défaut mais vous pouvez très bien, par code, la positionner à
false
et éviter ainsi que les substitutions prennent place lors
de la fin du rendu de la page. C'est particulièrement utile en cas de
debugging par exemple.
Code extrait du storage d'une île --------------------------------- $this->MustSubstitute = false; /* $this ... représentant la page */
Désormais, l'édition d'une île vous permet également d'envoyer un fichier au serveur. Vous ne devez rien faire : tout est automatique !
Cette fonctionnalité sera disponible avec la mise à disposition de la
version 2.0.0009
de Vae Soli!.
Voilà cette fonctionnalité en œuvre sur le site de Lato Sensu Management:
Désormais, il est possible de mentionner le template à appliquer de manière dynamique. Qu'est-ce que cela veut dire ? Et bien, plutôt que de mentionner le nom du template de manière statique, on mentionne le nom d'une fonction PHP dont l'objet est de retourner le template qu'il faut utiliser. La fonction peut bien entendu examiner un tas de conditions préalables et rendre son résultat sur base de multiples tests. Une des applications pratiques immédiates est de pouvoir appliquer un template bien précis en fonction du navigateur du client : particulièrement utile pour rendre, par exemple, des résultats différents sur des appareils mobiles comme les Blackberry, les iPhones et autres !
Au lieu de …
<LSTemplate><![CDATA[/template/calife.html]]></LSTemplate>
Vous pouvez avoir …
<LSTemplate><![CDATA[.php= return WhichTemplate();]]></LSTemplate>
La fonction WhichTemplate()
fournissant le résultat et devant,
bien entendu, être accessible dans un des fichiers de procédures/routines
indiqués dans :
<LSSetProceduresTo><![CDATA[/code/routines.php]]></LSSetProceduresTo>
La classe LSContents
vous permet d'utiliser des contenus
distants, c'est-à-dire des contenus ne se trouvant pas nécessairement sur
votre propre site. Ah oui ? Oui … et c'est tout simple :
<Island id="remote" active="yes" class="LSContents"> <param name="storage">http://www.monsite.com/mon-contenu-distant/</param> </Island>
L'utilisation d'un cache peut s'avérer un élément extrêmement précieux sur les contenus distants. Cela évite de nombreux va et vient entre votre site et le serveur déservant le site distant auquel vous tentez d'avoir accès.
<Island id="remote" active="yes" cacheTTL="3600" class="LSContents"> <param name="storage">http://www.monsite.com/mon-contenu-distant/</param> </Island>
En cela, le cache ne fonctionne pas autrement que sur une île dont le contenu est local.
Le contenu qui est intégré dans chaque île ne doit pas nécessairement être généré en PHP. Tout langage web fera l'affaire : Java, asp, …
<Island id="foreign" active="yes" class="LSContents"> <param name="storage">/islands/myscript.jsp</param> </Island>
Avec la version 2.0.0004 de Vae Soli!, il est désormais possible de disposer
d'une calculette. L'affichage de la calculette est réalisé par la classe
LSCalculator
. La présentation de la calculette est laissée aux
soins d'instructions CSS … que vous pouvez bien sûr personnaliser.
La gestion des boutons de la calculette est réalisée grâce à un javascript
qui implémente une petite classe Calc
et qui est disponible
dans le script LSVCalculator.js
. Pour que la
calculette fonctionne, il faut donc que les javascipt soient activés !
Pour en faciliter la mise en œuvre, nous avons également conçu une
classe qui implémente une île de ce type :
LSContentscCalculator
, qui se pratique de la manière
suivante…
<Archipelago id="body" active="yes" category="body"> <Island id="calc" active="yes" class="LSContentsCalculator"> <param name="name"><![CDATA[oCalc]]></param> </Island> </Archipelago>
Voilà, à titre d'illustration, comment cette calculette se présente :
0 | ||||
---|---|---|---|---|
(frac) | (int) | Back | CE | C |
7 | 8 | 9 | / | sqrt |
4 | 5 | 6 | * | x2 |
1 | 2 | 3 | - | 1/x |
0 | +/- | . | + | = |
La calculette ci-dessus a été affichée grâce au code suivant :
<?php $oCalc = new LSCalculator( 'myCalc' ); $this->EchoOB( $oCalc->Render() ); ?>
Tandis que sa présentation, dirigée par CSS, a été établie avec le code suivant :
table.LS_VAESOLI_CALCULATOR { border : 1px solid silver; color : #ccc; background : rgb(240,240,240); } table.LS_VAESOLI_CALCULATOR caption { border : 1px solid silver; border-bottom : none; color : #000; background : rgb(255,128,0); } table.LS_VAESOLI_CALCULATOR thead tr th { background : #eee; color : #000; } table.LS_VAESOLI_CALCULATOR tr td { border : 1px solid silver; background : #fff; color : #777; } table.LS_VAESOLI_CALCULATOR tr td.digit, table.LS_VAESOLI_CALCULATOR tr td.sign, table.LS_VAESOLI_CALCULATOR tr td.clean, table.LS_VAESOLI_CALCULATOR tr td.opera, table.LS_VAESOLI_CALCULATOR tr td.result, table.LS_VAESOLI_CALCULATOR tr td.frac { background : #fff; } table.LS_VAESOLI_CALCULATOR tr td.sign:hover, table.LS_VAESOLI_CALCULATOR tr td.clean:hover, table.LS_VAESOLI_CALCULATOR tr td.opera:hover, table.LS_VAESOLI_CALCULATOR tr td.frac:hover { background : #ddd; } table.LS_VAESOLI_CALCULATOR tr td.digit:hover { background : rgb(255,164,72); } table.LS_VAESOLI_CALCULATOR tr td.result:hover { background : #800; color : #fff; }
Il est possible d'offrir aux visiteurs des sites web que vous créez avec Vae Soli! la possibilité de stocker des signets vers leurs pages les plus prisées de votre site. Cette gestion est entièrement indépendante de celle que les navigateurs Internet offrent avec les "favoris". Dès lors, les signets sont TOUJOURS affichés, quel que soit le navigateur utilisé ce qui n'est pas le moindre des avantages.
La gestion des signets avec Vae Soli! est déclinée en deux temps :
Les signets sont sauvegardés dans un cookie : bookmarks
Vae Soli! ne fournit aucun service spécialisé (du moins à ce jour) pour
créer un signet. Par contre, l'affichage des signets déjà enregistrés est
pris en charge par une île de classe LSContentsBookmarks
.
Voici un code type qui vous permet de créer un signet :
<?php $szRef = '{page=' . base64_encode( $GLOBALS['oApp']->oPage->Self ) . '}' . '{title=' . base64_encode( $GLOBALS['oApp']->oPage->szTitle ) . '}' . '{desc=' . base64_encode( $GLOBALS['oApp']->oPage->szDescription ) . '}' . '{guid=' . base64_encode( $GLOBALS['oApp']->oPage->szGuid ) . '}'; if ( isset( $_COOKIE['bookmarks'] ) ) { if ( empty( $_COOKIE['bookmarks'] ) ) { $szBookmarks = $szRef; } else { $szBookmarks = $_COOKIE['bookmarks'] . '|' . $szRef; } } else { $szBookmarks = $szRef; } $szSelf = '{page=' . base64_encode( $GLOBALS['oApp']->oPage->Self ) . '}'; if ( ! strstr( $_COOKIE['bookmarks'],$szSelf ) ) { $this->EchoOB( "<a href=\"{$this->Self}\" class=\"ADD_BOOKMARK\" " . "onclick=\"setcookie( 'bookmarks','{$szBookmarks}' );\">" . "Ajouter un signet personnel vers cette page</a>\n" ); } ?>
L'affichage de la liste des signets est des plus simples. Il suffit de faire
appel à une île de classe LSContentsBookmarks
.
<Island id="bookmarks" active="yes" class="LSContentsBookmarks"> </Island>
Il faut disposer des fonctions javascript de cookies que fournit Vae Soli!
par le biais du fichier LSVCookies.js
:
function setcookie( szName,szValue,iDays,szPath,szDomain,bSecure ) /*--------------------------------------------------------------*/ { if ( iDays ) { var dDate = new Date(); dDate.setTime( dDate.getTime() + ( iDays * 24 * 60 * 60 * 1000 ) ); var szExpires = "; expires=" + dDate.toGMTString(); } else { var szExpires = ""; } if ( szPath ) { szPath = "; path=" + escape( szPath ); } else { szPath = "; path=/"; } if ( szDomain ) { szDomain = "; domain=" + escape( szDomain ); } else { szDomain = ""; } if ( bSecure != null ) { szSecure = ( bSecure == true ) ? "; secure" : ""; } else { szSecure = ""; } szCookie = szName + "=" + szValue + szExpires + szPath + szDomain + szSecure; document.cookie = szCookie; return ( true ) ; } /* function setcookie( szName,szValue,iDays,szPath,szDomain,bSecure ) */ function getcookie( szName ) /*------------------------*/ { var szNameEQ = szName + "="; var aCookies = document.cookie.split( ';' ); for ( var i=0;i < aCookies.length;i++ ) { var szCookie = aCookies[i]; while ( szCookie.charAt(0)== ' ' ) { szCookie = szCookie.substring( 1,szCookie.length ); } /* while ( szCookie.charAt(0)== ' ' ) */ if ( szCookie.indexOf( szNameEQ ) == 0 ) { return szCookie.substring( szNameEQ.length,szCookie.length ); } /* if ( szCookie.indexOf( szNameEQ ) == 0 ) */ } /* for ( var i=0;i < aCookies.length;i++ ) */ return null; } /* End of function getcookie( szName ) */ function delcookie( szName ) /*------------------------*/ { setcookie( szName,"",-1 ); return ( true ); } /* End of function delcookie( szName ) */
Il est possible d'indiquer que l'accès à une page est conditionnel. Voici
une page qui ne s'affichera que si la fonction
IsMember('admin')
est satisfaite :
<Land id="index.php" active="yes" editable="yes" group="main" condition=".php= return IsMember('admin');"> … </Land>
Voilà de quoi restreindre l'accès aux pages de votre site aisément, par exemple les pages de votre Intranet !
Vous pouvez aussi indiquer ce que le framework doit faire si la condition
n'est pas satisfaite : la clause onfail
…
<Land id="index.php" active="yes" editable="yes" group="main" condition=".php= return IsMember('admin');"> onfail="/not-authorized.php" … </Land>
Vous pouvez aisément protéger une page en vérifiant l'adresse IP du client qui requiert la page. Si l'adresse IP n'est pas dans la liste fournie, alors c'est la page d'erreur qui, si elle existe, est activée.
<Land id="index.php" active="yes" ip="127.0.0.1;217.130.75.42" > </Land>
L'exemple précédent ne donnera accès à la page que si le client fonctionne
sur la machine locale (127.0.0.1
) ou depuis l'adresse IP fixe
217.130.75.42
.
Ce qui est valable pour les pages est valable pour les îles : dans le cas où vous souhaitez n'afficher un contenu qu'en fonction de certaines conditions ...
<Island id="jamais" active="yes" condition=".php= return false;"> <param name="storage">/islands/promo.php</param> </Island>
Dans l'exemple ci-dessus, l'île n'est jamais affichée puisque la condition n'est jamais remplie.
Il est possible de mentionner le domaine auquel une page est liée. Ainsi, si
deux domaines sont hébergés physiquement sur le même site, par exemple
www.vaesoli.org
ou www.vaesoli.com
, il est
possible de dire qu'une page appartient à un domaine mais pas à un autre
… ou alors que les deux pages ont des définitions différentes. Voyez
l'exemple qui suit :
<Land id="/intranet/training.php" … landscape="www.vaesoli.org"> <… définition des archipels et îles> </Land> <Land id="/intranet/training.php" … landscape="www.vaesoli.com"> <… autre définition des archipels et îles> </Land>
Vous pouvez carrément désactiver une page en jouant sur l'attribut
active
. Dans l'exemple qui suit, la page n'est pas résolue car
elle est inactive :
<Land id="/intranet/training.php" active="no" … > <… définition des archipels et îles> </Land>
Dans le cas qui est mentionné, si aucune autre définition de page ne peut entrer en lice, alors Vae Soli! activera la page par défaut … s'il y en a une.
Vous pouvez faire la même chose avec une île en jouant sur le même attribut
active
. Dans l'exemple qui suit, l'île n'est pas affichée car
elle est inactive :
<Island id="jamais" active="no"> <param name="storage">/islands/promo.php</param> </Island>
Vae Soli! possède de nombreuses classes de contenu. L'une de ces classes est
de type media. Ce type permet d'avoir accès à de nombreux sous-
types, dont le type QuickTime (qt
). En voilà un exemple :
<Island id="video01" active="yes" class="LSContentsMedia"> <param name="mediatype">qt</param> <param name="comment">Endless road</param> <param name="src">media/vanishing_point.mov</param> <param name="autoplay">true</param> <param name="loop">true</param> <param name="width">468</param> <param name="height">350</param> <param name="showcontrols">true</param> </Island>
Il est tout également possible, en jouant des mêmes paramètres, d'afficher
un film wmv
:
<Island id="video02" active="no" class="LSContentsMedia"> <param name="mediatype">wmv</param> <param name="comment">Endless road</param> <param name="src">media/vanishing_point.wmv</param> <param name="autoplay">true</param> <param name="loop">true</param> <param name="width">468</param> <param name="height">350</param> <param name="showcontrols">true</param> </Island>
Toujours au rang des types de media gérés par la classe
LSContentsMedia
on retrouve le type mp3
. En voilà
un exemple :
<Island id="audio01" active="yes" class="LSContentsMedia"> <param name="mediatype">mp3</param> <param name="comment">Music - Bill Labounty</param> <param name="src">media/Bill Labounty-Livin'it up.mp3</param> <param name="autoplay">true</param> <param name="loop">true</param> <param name="width">475</param> <param name="height">45</param> <param name="showcontrols">true</param> </Island>
Dans le cas de sites importants, le fichier géorama peut rapidement avoir
une taille imposante. Dans ce cas, il est utile « d'éclater » le
géorama en plusieurs fichiers. Pour ce faire, utilisez l'attribut href
des pages comme le démontre l'exemple suivant :
<Pangaea> <Land id="/Index.php;/index.php" active="yes" editable="yes" group="main" href="/georama/index.xml"> <Sitemap priority="0.8" frequency="weekly" /> </Land> <!-- ************************************************************ --> … </Pangea>
Dans cet exemple la définition de la page index.php
est logée
dans un fichier externe, en l'occcurrence /georama/index.xml
.
L'utilisation de l'attribut href
permet également d'obtenir
la définition d'une page au départ d'un autre site. Voyez par exemple
comment la page index.php
référence une page provenant du
site un-autre-site.com
:
<Pangaea> <Land id="/Index.php;/index.php" active="yes" editable="yes" group="main" href="http://www.un-autre-site.com/syndication/news.xml"> <Sitemap priority="0.8" frequency="weekly" /> </Land> <!-- ************************************************************ --> … </Pangea>
Ne vous souciez plus des largeur et hauteur, ni même, quoique dans une
moindre mesure, de l'attribut alt
. Voyez l'exemple suivant :
$oImg = new LSXHtmlImg( "/images/WebLogo.jpg" ); echo $oImg;
Pour insérer une île dans la section
<head>…</head>
du (X)HTML de votre page,
vous pouvez utiliser le paramètre with-div
de la classe
LSIsland
dont dépend d'ailleurs la classe
LSContents
et toutes ses classes dérivées. Ce paramètre évite
l'insertion d'une division avant l'insertion de l'île … et nous
svaons qu'on ne peut pas retrouver de balise
<div>…</div>
dans la section
<head>…</head>
de la page ! Voyez
l'exemple suivant :
<Archipelago id="meta" active="yes" category="meta"> <Island id="meta-page" active="yes" class="LSContents"> <param name="storage">/template/meta.xml</param> <param name="with-div">false</param> </Island> </Archipelago>
<?php $oLatin = new LSLatin(); /* Créer un objet LSLatin */ $aPara = $oLatin->Get( 5 ); /* Générer 5 paragraphes au hasard */ foreach ( $aPara as $szPara ) /* Insérer chaque paragraphe généré */ echo "<p>{$szPara}</p>"; ?>
Voilà le cas qui se présente à vous : plusieurs domaines pointent vers le même site : www.monsite.com, www.monsite.org et www.monsite.net.
En fonction du domaine qui est requis, vous souhaitez charger des paramètres de page différents :
<Land id="/index.php" active="yes" editable="yes" group="main"> <Defaults> <Settings landscape="www.monsite.com;www.monsite.org"> <LSGuid><![CDATA[GUID 111]]></LSGuid> <LSKeyword><![CDATA[homepage]]></LSKeyword> </Settings> <Settings landscape="www.monsite.net"> <LSGuid><![CDATA[GUID 222]]></LSGuid> <LSKeyword><![CDATA[accueil]]></LSKeyword> </Settings> </Defaults> </Land>
À partir de la version 2.0.0000 de Vae Soli! l'intégration avec Dublin Core est encore plus grande. Voilà un exemple de metas qui, positionnées par Dublin Core, sont populées par des propriétés spécifiques d'une page. Le tout est programmé comme une île XHTML :
<Island id="meta-generic" active="yes" xhtml="yes"> <link rel="schema.DC" href="http://purl.org/dc/elements/1.1/" /> <link rel="schema.DCTERMS" href="http://purl.org/dc/terms/" /> <meta name="DC.title" xml:lang="{{{CUR-LANG}}}" content="{{{PAGE-TITLE}}}" /> <meta name="DC.description" xml:lang="{{{CUR-LANG}}}" content="{{{PAGE-DESC}}}" /> <meta name="DC.publisher" content="{{{COMPANY}}}" /> <meta name="DC.creator" content="{{{AUTHOR}}}" /> <meta name="DC.date" scheme="DCTERMS:W3CDTF" content="{{{PAGE-CREATED}}}" /> <meta name="DCTERMS.modified" scheme="DCTERMS:W3CDTF" content="{{{PAGE-LUPDATE}}}" /> <meta name="DC.language" scheme="DCTERMS:RFC3066" content="{{{CUR-LANG}}}" /> <meta name="DC.rights" xml:lang="{{{CUR-LANG}}}" content="{{{PAGE-RIGHTS}}}" /> <meta name="DC.subject" xml:lang="{{{CUR-LANG}}}" content="{{{PAGE-KEYWORDS}}}" /> </Island>
Comme vous le constatez, ce sont des substitutions qui se chargent de mettre à jour le document final renvoyé au navigateur du visiteur. Voyez comment le fichier de substitutions est réalisé :
<Dictionary active="yes"> <Data key="{{{AUTHOR}}}" active="yes" editable="yes"> <Value><![CDATA[John Doe]]></Value> </Data> <Data key="{{{CUR-LANG}}}" active="yes" editable="yes"> <Value><![CDATA[.php=return $GLOBALS['oApp']->oPage->szLanguage;]]></Value> </Data> <Data key="{{{PAGE-LUPDATE}}}" active="yes" editable="yes"> <Value><![CDATA[.php=return STR_left( $GLOBALS['oApp']->oPage->Date('lupdate','-'),10);]]></Value> </Data> <Data key="{{{PAGE-LUPDATE2}}}" active="yes" editable="yes"> <Value><![CDATA[.php=return STR_left( $GLOBALS['oApp']->oPage->Date('lupdate'),8);]]></Value> </Data> <Data key="{{{PAGE-CREATED}}}" active="yes" editable="yes"> <Value><![CDATA[.php=return STR_Left( $GLOBALS['oApp']->oPage->Date('creation','-'),10);]]></Value> </Data> <Data key="{{{PAGE-DESC}}}" active="yes" editable="yes"> <Value><![CDATA[.php=return $GLOBALS['oApp']->oPage->szDescription;]]></Value> </Data> <Data key="{{{PAGE-KEYWORDS}}}" active="yes" editable="yes"> <Value><![CDATA[.php=return $GLOBALS['oApp']->oPage->szKeywords;]]></Value> </Data> <Data key="{{{PAGE-RIGHTS}}}" active="yes" editable="yes"> <Value lang="fr"><![CDATA[.php=return empty( $GLOBALS['oApp']->oPage->szRights ) ? 'Tous les droits sur toutes nos pages sont décrits dans notre page de termes légaux' : $GLOBALS['oApp']->oPage->szRights;]]></Value> </Data> <Data key="{{{PAGE-TITLE}}}" active="yes" editable="yes"> <Value><![CDATA[.php=return $GLOBALS['oApp']->oPage->szTitle;]]></Value> </Data> <Data key="{{{COMPANY}}}" active="yes" editable="yes"> <Value><![CDATA[Lato Sensu Management]]></Value> </Data> <Data key="{{{VAE}}}" active="yes" editable="yes"> <Value><![CDATA[Vae Soli!]]></Value> </Data> </Dictionary>
Lorsque des pages sont complexes à construire, lorsqu'elles sont composées sur base de multiples requêtes de données par exemple, il peut être intéressant d'en stocker le résultat final. Un autre appel de la même page, dans les mêmes conditions d'accès, pourra dès lors récupérer le résultat directement plutôt que de le recomposer. C'est le système de cache.
Vae Soli! tient compte des conditions d'accès suivantes : liste de
paramètres ($_GET
), de variables ($_POST
), et de
cookies ($_COOKIE
) (mis à part le PHPSESSID
),
le nom du domaine et le protocole utilisé.
Pour activer le cache d'une page (notez que c'est bien la page entière qui
est mise en tampon), il suffit d'utiliser l'attribut cacheTTL
de la page dans le géorama :
<?xml version="1.0" encoding="iso-8859-1"?> <Georama xmlns:xi="http://www.w3.org/2001/XInclude" version="4.0"> <…> <Pangaea> <Land id="/index.php" active="yes" cacheTTL="3600"> <…> </Land> <…> </Pangaea> </Georama>
Le cache est exprimé en secondes. L'exemple ci-dessus provoque la mise en tampon de la page pour 3600 secondes, soit 1 heure.
Il est possible de mentionner des caches dynamiques sur les pages. Dans ce cas, le cache est calculé : sa valeur est le résultat d'une expression PHP comme dans l'exemple suivant :
<Pangaea> <Land id="/index.php" active="yes" cacheTTL=".php= return MyFunc();"> <…> </Land> <…> </Pangaea>
Ce qui est possible avec les pages est possible avec les îles … et c'est bien pratique car quelques fois il n'est pas possible de cacher TOUTE la page mais seulement une partie de la page : les îles qui la composent.
<Archipelago id="summary" active="yes" category="summary"> <Island id="core" active="yes" class="LSContents" cacheTTL="86400"> <param name="storage" lang="fr">/islands/home_core_summary_fr.php</param> <param name="storage" lang="en">/islands/home_core_summary_en.php</param> </Island> </Archipelago>
L'exemple ci-dessus cache une île pour une journée entière, 86400 secondes.
Veuillez noter que si deux îles différentes portent le même ID, même si
elles sont sur des pages différentes, elles auront le même
cache ! Ce n'est pas une erreur de conception :
c'est fait à dessein afin de permettre de créer le même cache pour des îles
qui doivent être reproduites sur des pages différentes. Si vous souhaitez
qu'une île ait un cache propre, alors utilisez l'attribut guid
et veillez à lui attribuer une valeur unique (ce qu'un GUID suppose) comme
l'exemple suivant le suggère :
<Archipelago id="summary" active="yes" category="summary"> <Island id="core" guid="UNIQUE" active="yes" class="LSContents" cacheTTL="86400"> <param name="storage" lang="fr">/islands/home_core_summary_fr.php</param> <param name="storage" lang="en">/islands/home_core_summary_en.php</param> </Island> </Archipelago>
Il est possible, grâce au système des substitutions, de mettre en oeuvre des corrections automatiques … un peu comme ce que propose MS-Word.
Composez un dictionnaire semblable à ce qui suit dans un fichier que
vous appelerez autocorrect.xml
:
<?xml version="1.0" encoding="utf-8"?> <Dictionary active="yes"> <Data key="coeur" active="yes" editable="yes"> <Value lang="fr"><![CDATA[cœur]]></Value> </Data> <Data key="oeuvre" active="yes" editable="yes"> <Value lang="fr"><![CDATA[œuvre]]></Value> </Data> <Data key="(c)" active="yes" editable="yes"> <Value><![CDATA[©]]></Value> </Data> <Data key="(r)" active="yes" editable="yes"> <Value><![CDATA[®]]></Value> </Data> <Data key="™" active="yes" editable="yes"> <Value><![CDATA[™]]></Value> </Data> <Data key="€" active="yes" editable="yes"> <Value><![CDATA[€]]></Value> </Data> </Dictionary>
Puis, indiquez que le dictionnaire de corrections automatiques doit être pris en compte sur votre site. Il suffit, pour ce faire, de modifier les paramètres par défaut de votre site de la manière suivante :
<Defaults> <Settings> <!-- Autres paramètres --> <…> <LSSubstitutions><![CDATA[%geo-path%/autocorrect.xml]]></LSSubstitutions> </Settings> </Defaults>
… et le tour est joué. Bon amusement.
Vous pouvez modifier, directement sur le site, les îles qui composent une page. Comme il est hors de question d'accepter que quiconque modifie votre site, il convient de vous logguer. Lorsque vous serez loggué, et pour peu que vous fassiez partie d'un groupe à qui sont dévolus des droits d'édition, Vae Soli! vous permettra de modifier les îles qui composent les pages.
<Island id="services" active="yes" class="LSContents"> <role-mapping role="editor" groups="admin" /> <param name="storage" lang="fr">/islands/services_core_fr.php</param> <param name="storage" lang="en">/islands/services_core_en.php</param> </Island>
Dès lors, Vae Soli! présente une petite interface de modification des
données. En appuyant sur le bouton submit
, votre
modification sera immédiatement prise en compte.
L'attribut history
permet d'activer un backup chaque fois
qu'une île est modifiée grâce à l'In-Place Editing.
<Island id="services" active="yes" class="LSContents" history="yes"> <role-mapping role="editor" groups="admin" /> <param name="storage" lang="fr">/islands/services_core_fr.php</param> <param name="storage" lang="en">/islands/services_core_en.php</param> </Island>
Vae Soli! possède une classe réservée à des citations. Bien évidemment, pour en bénéficier, vous devrez vous-même fournir à Vae Soli! un fichier de citations.
Et comme Vae Soli! adore le XML, c'est bien sûr dans le format XML que le fichier de citations devra être construit. Voilà, pour la petite histoire un bref aperçu d'un tel fichier :
<?xml version="1.0" encoding="utf-8"?> <Citations active="yes"> <Citation guid="b8b5c828-6175-4a1e-8ad1-36b10e6106a8" active="yes" editable="yes" lang="fr" author="Gallance" date="20090125" keywords="pensée,aphorisme"> <Value><![CDATA[Conscience est matière qui résonne, énergie qui vibre, qui réverbère.]]></Value> <Source href=""><![CDATA[<!-- Ici, on pourrait mettre la source de la citation, par exemple le livre, sa page, etc. -->]]></Source> </Citation> <Citation guid="99fcc43a-bf36-4b4b-aa88-eb2ebef0373e" active="yes" editable="yes" lang="fr" author="Gallance" date="20090125" keywords="pensée,aphorisme"> <Value><![CDATA[Mon corps est le grimoire de ma vie. Il a enregistré, filtré, digéré, transformé, additionné, mélangé, brûlé, infusé tout ce qui m'a été donné de vivre. Tout cela est imprimé en moi, dans ma chair, mes organes et mon sang. Tout cela est mémorisé dans ma forme, mes plis, des aspérités, mes maladies, mes expulsions et rejets, mes caillots d'émotions et je restitue au monde cette expérience unique dans toutes mes interactions, que ce soit souhaité — souhaitable — ou non, par devers conscience et volonté. C'est la vérité du monde, vu au travers du prisme que je suis. Un jour, il faudra bien nettoyer tout cela. D'autres énergies fulgurantes s'en chargeront.]]></Value> <Source href=""><![CDATA[<!-- Ici, on pourrait mettre la source de la citation, par exemple le livre, sa page, etc. -->]]></Source> </Citation> <Citation guid="798590c9-5c05-49e5-8259-2ea201c792bc" active="yes" editable="yes" lang="fr" author="Gallance" date="20090113" keywords="pensée,aphorisme"> <Value><![CDATA[Tout ce qui dépasse, tout ce qui forme aspérité est fragile, casse facilement sous la pression. Retirez ces éminences et vous perdrez l'art de l'ensemble, sa singularité, son caprice, son originalité, son détail ontologique.]]></Value> <Source href=""><![CDATA[<!-- Ici, on pourrait mettre la source de la citation, par exemple le livre, sa page, etc. -->]]></Source> </Citation> <Citation guid="8f0f4d56-18d3-42f6-a96b-62ace616812a" active="yes" editable="yes" lang="fr" author="Gallance" date="20081211" keywords="pensée,aphorisme"> <Value><![CDATA[Les rois appartiennent à la gravure, à la sculpture, à un monde matériel fixe; les ministres, les premiers ministres, sont eux de l'ère digitale, de tout temps en mouvement.]]></Value> <Source href=""><![CDATA[<!-- Ici, on pourrait mettre la source de la citation, par exemple le livre, sa page, etc. -->]]></Source> </Citation> </Citations>
L'affichage de la citation est incité par une île de classe
LSContentsCitation
comme le démontre l'exemple ci-dessous :
<Island id="citation" active="yes" class="LSContentsCitation"> <param name="storage">/citations/citations.xml</param> <param name="recno">random</param> </Island>
C'est tout ce qu'il vous faudra faire pour afficher une citation au hasard
provenant de votre fichier de citations. Le paramètre recno
dont la valeur ici est mise à random
, indique qu'il faut
extraire une citation au hasard … mais on pourrait tout aussi bien
indiquer QUELLE citation précise on veut afficher.
<Island id="citation" active="yes" class="LSContentsCitation"> <param name="storage">/citations/citations.xml</param> <param name="recno">random</param> <param name="guid">99fcc43a-bf36-4b4b-aa88-eb2ebef0373e</param> </Island>
Dans ce cas précis, le paramètre recno
est déconsidéré.
Si vous souhaitez afficher une citation au hasard répondant à un mot-clef
bien précis, vous pourrez utiliser le paramètre keyword
. Voyez
à ce titre l'élément suivant qui sélectionne parmi les citations toutes
celles qui contiennent le mot "travail" dans leurs mots-clefs et qui se pose
sur l'une d'entre elles :
<Island id="citation" active="yes" class="LSContentsCitation"> <param name="storage">/citations/citations.xml</param> <param name="recno">random</param> <param name="keyword">travail</param> </Island>