Niouzes

< Avril 2021 >
Lu Ma Me Je Ve Sa Di
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30    

Citation

Attention

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.

2014-08-06 à 17:05:56 par Patrick Boens

Table Of Contents

  1. Template with patterns, Swipe Simply, cahing pages for bots, … (06/08/2014)
  2. Gestion de redirections, Accept-Language, extrapolation de la langue et du pays, LSContainer et le génome, LSInput et les gènes, utilisation de LSCacheDir, création de propriétés dynamiques de LSPage dans le géorama, … (11/10/2013)
  3. Statistiques d'accès, Site Manager, prefetch, prerender, File Explorer, interactions Ajax … (17/06/2013)
  4. LSTag, LSContentsDatetime, LSContentsCountdown, LSContentsStopwatch, threshold et score, configuration vhosts Apache, génération automatique, LSVStrings.js, LSVDates.js, tracing sur XML des îles, Free User Input Zones, multiple credentials, cookie de dernière visite, LSInput et datalist (10/04/2013)
  5. Tour d'horizon des filtres (23/09/2013)
  6. Messages de service (07/01/2014)
  7. Accès aux propriétés des îles, halt.sem, cookies positionnés dans les îles, filtre 'browsertype', contenus alternatifs, expressions PHP sur les href, gestion de l'expiration, filtre de visite, ... (22/09/2013)
  8. Messages de service, ... (30/10/2012)
  9. Config Apache, LSInput, LSForm, ... (13/03/2013)
  10. LSContentsBooking, Browser Danger Rating, User Agent vides (non spécifiés), filtres sur les paramètres, LSBrowser, ... (11/06/2013)
  11. LSTag('img'), auto pages, nouveaux filtres, audio/video, ... (02/11/2013)
  12. LSGeo, LSFootnotes, LSSourceFile, LSPublication, onfail avec codes de retour HTTP (301, 302, ...), ... (27/06/2013)
  13. LSCache, microformat (lupdate), multicontent, LSContentsTagCloud, LSContentsImageGallery, HTML5 (input zones), ... (15/09/2013)
  14. Check Spamhaus, vos settings dans le géorama, LSContentsMicronews, Switch dans le géorama, LSCursor: des records dans les records, ... (04/12/2012)
  15. Campagnes de pub, TODO list (04/12/2012)
  16. Debugging de page, LSTimeline, le fichier de géorama, LSTag, Glossaire IT, Named colors, Codes langue, ... (23/03/2013)
  17. LSCursor: une revue complète de la classe (12/03/2013)
  18. LSForm, LSInput, … (28/01/2013)
  19. LSContentsBusinessCoordinates, redirection de pages, LSTwitterPost, LSContentsTwitterFollowers, LSContentsShare, calendrier, LSContentsContactForm, LSContentsReview et LSReview, droits sur une page, URLs canoniques, LSPaymentOptions et LSContentsPaymentOptions, Offres d'emploi, LSContentsImageTransition, ... (20/09/2013)
  20. Galerie avec vignettes, RSS, partage d'offres d'emploi, partage de citations, diaporama dewslider, horloge flash, footnotes, ... (01/10/2012)
  21. îles préfixées de texte standard, le paramètre 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)
  22. LSContentsLoginLogoff, Utilisation de && dans les conditions des îles, LSWidgetOpeningHours et LSContentsBusinessOpeningHours, inclusion de snippets, image bouton de login/logoff, LSContentsBusinessCoordinates, commentaires dans les îles, doctypes, LSImageTrans, calcul de dates, LSWidgetEmailForm, LSContentsMedia, LSContentsIFrame, onload et onunload d'une page, Page settings, ... (22/09/2013)
  23. Dates et heures de publication et/ou d'expiration, PHP expressions, Blocs XHTML avant et après une île, suite de pages, îles valables par domaine, substitutions, envoyer des fichiers au serveur, templates dynamiques, contenus distants, contenus générés en Java, LSCalculator, Gérer des signets (bookmarks), Pages conditionnelles, îles conditionnelles, désactivations, LSContentsMedia, taille du géorama, partager une page entre sites, LSXHtmlImg, île dans la section …, textes latins, Dublin Core, Utilisation de caches, corrections automatiques, In-Place Editing, LSContentsCitation (03/11/2013)

Tester une adresse IP avec Spamhaus 2011-11-14

Depuis l'opus "4.5.0004"

Dans un nombre incalculable de cas les sites web doivent se protéger comme les indélicats. Qu'il s'agisse d'éviter (autant que possible) des commentaires indésirables ou de bloquer des pages pour ces intrus vous pourriez avoir besoin de vérifier l'adresse IP de vos visiteurs.

Vae Soli! fournit une méthode simple et efficace qui appel à Spamhaus pour ce faire. Par ailleurs, Lato Sensu Management fournit d'ailleurs une page de test qui se base sur la même solution : test d'adresse IP avec Spamhaus.

Voici comment faire :

$oSpam = new LSSpamhaus();
if ( $oSpam->Check( '88.198.96.252' ) )
{
    echo "<p>L'adresse IP n'est pas blacklistée par Spamhaus</p>";
}
else
{
    echo "<p>Nous avons affaire à un spammeur! Méfiance!</p>";
}

Il vous est même possible de concevoir des pages où le test spamhaus est réalisé immédiatement dans la condition de la page :

<Land id="/mypage.php"
    condition=".php= $oSH = new LSSpamhaus(); return ( $oSH->Check( $_SERVER['REMOTE_ADDR'] ) );"
    onfail="http://www.spamhaus.org/">
    … la définition du contenu de votre page
</Land>

Ajouter vos propres paramètres dans le géorama 2011-11-10

Depuis l'opus "2.0.0000"

Pour ajouter vos propres paramètres il suffit de les insérer dans la section des Settings du géorama. Ainsi, dans l'exemple qui suit, nous avons ajouté le paramètre MyParam :

<Defaults>
    <Settings>
        <!-- Overwrites the default settings of a page -->
        <LSGuid><![CDATA[PRMC-d15daddb-597b-4efa-987a-878a0f71cad8]]></LSGuid>
        <LSTemplate><![CDATA[/template/club.html]]></LSTemplate>
        <MyParam><![CDATA[login-page]]></MyParam>
    </Settings>
</Defaults>

Par la suite, pour avoir accès à votre paramètre, vous devrez passer par l'objet géorama comme le montre le code qui suit :

echo $GLOBALS['oApp']->oGeorama->GetPageSetting( 'MyParam' );

Utilisation de la classe LSContentsMicronews 2011-11-10

Depuis l'opus "4.5.0004"

La classe LSContentsMicronews vous permet de montrer des micro-nouvelles sur votre site. Les nouvelles sont stockées en XML à un endroit de votre choix. La structure du XML est la suivante (voici un court extrait de nouvelles provenant du site de Lato Sensu Management:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Micronews>
    <Microniouze id="c096bad0-2c1d-4ee0-b808-ae977d923829" expiry="" active="true"
                 pubdate="20111024" creation="20111024" intranet="true"
                 lupdate="20111024142231" qver="0.1.8000">
        <Text><![CDATA[Le module de micro-niouze est presque terminé. Il permet
                       pour l'instant de sauver des micro-niouzes mais pas encore
                       de modifier des micro-niouzes existantes ni de BROWSER
                       les microniouzes encodées (du moins ... à ce stade, on ne
                       peut pas garantir que le BROWSE fonctionne sans problème)]]></Text>
    </Microniouze>
    <!-- <… d'autres microniouzes/micronews> -->
</Micronews>

Cette microniouze (ou micro-niouzz ou micronews) concerne … les micronews !

Maintenant que vous savez comment ces micronews doivent être formatées (on ne fournit à ce stade aucun moyen de les encoder), il nous reste à vous montrer comment les afficher. Rien de plus simple !

Concevez une île dans votre géorama qui soit de classe LSContentsMicronews et Vae Soli! fera le reste :

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
</Island>

C'est aussi simple que cela. Miantenant … vous pouvez aussi vouloir un peu plus de contrôle sur la manière dont les choses s'affichent. Par exemple vous souhaitez que le contenu des micronews soit inséré dans une division bien précise. Ici, il va falloir utiliser une fonctionnalité commune à toutes les îles de Vae Soli! : les paramètres pre- xhtml et post-xhtml. Voici comment :

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
</Island>

Dans le cas présent, nous avons inséré du code XHTML AVANT le rendu de l'île et APRES le rendu de l'île. Cette fonctionnalité nous permet donc d'insérer notre île dans une division complètement à notre main.

Continuons et demandons cette fois de n'afficher que les 5 dernières nouvelles encodées dans le fichier.

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
    <param name="count">5</param>
</Island>

Parfait! Mais je souhaite aussi mettre une marque "Nouveau!" lorsque les nouvelles ne sont pas plus vieilles que 2 jours.

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
    <param name="count">5</param>
    <param name="emphasis">2</param>
    <param name="emphasis-mark"><![CDATA[ <strong>Nouveau!</strong>]]></param>
</Island>

Ce que nous venons de faire c'est de dire que nous souhaiterions mettre en exergue les nouvelles pas plus vieilles que deux jours et que cette mise en exergue se fera avec la marque <strong>Nouveau!</strong>.

Imaginons à présent que vous souhaitiez limiter le texte de la nouvelle à 140 caractères (un peu comme les tweets de Twitter). Rien de plus simple :

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
    <param name="count">5</param>
    <param name="emphasis">2</param>
    <param name="emphasis-mark"><![CDATA[ <strong>Nouveau!</strong>]]></param>
    <param name="maxlength"><![CDATA[140]]></param>
</Island>

Et dès lors survient l'inévitable question de savoir comment vous pouvez brancher l'utilisateur sur la visualisation de la nouvelle entière. Réponse : en utilisant le paramètre more :

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
    <param name="count">5</param>
    <param name="emphasis">2</param>
    <param name="emphasis-mark"><![CDATA[ <strong>Nouveau!</strong>]]></param>
    <param name="maxlength"><![CDATA[140]]></param>
    <param name="more"><![CDATA[/mapage.php]]></param>
</Island>

Dans le but de concevoir des îles complètement génériques et qui pourraient s'adapter à n'importe quelle page, vous pouvez utiliser le mot-clé self dans le paramètre more. De cette manière, le renvoi se fait vers la page courante, à charge pour elle d'anticiper le fait qu'il est demandé de visualiser une nouvelle bien précise. L'utilisation de self est illustrée ci-dessous :

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
    <param name="count">5</param>
    <param name="emphasis">2</param>
    <param name="emphasis-mark"><![CDATA[ <strong>Nouveau!</strong>]]></param>
    <param name="maxlength"><![CDATA[140]]></param>
    <param name="more"><![CDATA[self]]></param>
</Island>

Vous pouvez encore décider de numéroter les nouvelles ou non. Cela se fait par le paramètre numbered. Par défaut, les nouvelles sont numérotées. Si donc vous souhaitez vous passer de la numérotation, il vous appartient de le mentionner comme l'illustre le code ci-dessous :

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
    <param name="count">5</param>
    <param name="emphasis">2</param>
    <param name="emphasis-mark"><![CDATA[ <strong>Nouveau!</strong>]]></param>
    <param name="maxlength"><![CDATA[140]]></param>
    <param name="more"><![CDATA[self]]></param>
    <param name="numbered">no</param>
</Island>

Par défaut les nouvelles sont présentées de telle manière que la nouvelle la plus récente apparaisse en tête (nous nous basons sur sa date de publication). Ceci est dû au fait que nous appliquons la valeur descending à l'ordre de présentation. Vous pourriez par contre modifier la chose en adoptant une autre stratégie : ascending par exemple…

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
    <param name="count">5</param>
    <param name="emphasis">2</param>
    <param name="emphasis-mark"><![CDATA[ <strong>Nouveau!</strong>]]></param>
    <param name="maxlength"><![CDATA[140]]></param>
    <param name="more"><![CDATA[self]]></param>
    <param name="numbered">no</param>
    <param name="orderdir"><![CDATA[ascending]]></param>
</Island>

Le dernier paramètre avec lequel vous pouvez vous exercer est le paramètre orderby qui, lui, active finalement le champ (ou attribut) sur lequel le tri s'effectue. par défaut le tri est actif sur la date de publication, pubdate. Voici à quoi cela correspond de notre XML :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<Micronews>
    <Microniouze id="c096bad0-2c1d-4ee0-b808-ae977d923829" expiry="" active="true"
                 pubdate="20111024" creation="20111024" intranet="true"
                 lupdate="20111024142231" qver="0.1.8000">
        <Text><![CDATA[Le module de micro-niouze est presque terminé. Il permet
                       pour l'instant de sauver des micro-niouzes mais pas encore
                       de modifier des micro-niouzes existantes ni de BROWSER
                       les microniouzes encodées (du moins ... à ce stade, on ne
                       peut pas garantir que le BROWSE fonctionne sans problème)]]></Text>
    </Microniouze>
    <!-- <… d'autres microniouzes/micronews> -->
</Micronews>

S'il vous prenait l'envie d'afficher les nouvelles sur base de leur date de création, voilà ce qu'il vous faudrait faire :

<Island id="latest-news" active="yes" class="LSContentsMicronews">
    <param name="storage"><![CDATA[/../databases/micronews.xml]]></param>
    <param name="pre-xhtml"><![CDATA[<div class="content-box latest-news">]]></param>
    <param name="post-xhtml"><![CDATA[</div> <!-- End of div.content-box -->]]></param>
    <param name="count">5</param>
    <param name="emphasis">2</param>
    <param name="emphasis-mark"><![CDATA[ <strong>Nouveau!</strong>]]></param>
    <param name="maxlength"><![CDATA[140]]></param>
    <param name="more"><![CDATA[self]]></param>
    <param name="numbered">no</param>
    <param name="orderdir"><![CDATA[descending]]></param>
    <param name="orderby"><![CDATA[@creation]]></param>
</Island>

… on fait préfixer le champ par @ pour indiquer qu'on se base sur un attribut de la nouvelle.

Utilisation de constructions <Switch>...</Switch> dans le georama 2011-06-29

Depuis l'opus "2.0.0000"

Savez-vous que le géorama vous permet de prendre des décisions sur base de paramètres. En effet, ceci est possible depuis longtemps grâce à la construction <Switch>...</Switch>. Un petit exemple vaut mieux qu'un long discours :

Line 001: <Contents>
Line 002:     <Archipelago id="body" active="yes" category="body">
Line 003:         <Switch test=".php= return 'salut';">
Line 004:             <Case value='salut'>
Line 005:                 <Island id="salut" active="yes" xhtml="yes">
Line 006:                     <p>On a retourné la valeur 'salut'</p>
Line 007:                 </Island>
Line 008:             </Case>
Line 009:             <Default>
Line 010:                 <Island id="default" active="yes" xhtml="yes">
Line 011:                     <p>On a retourné une autre valeur que 'salut'</p>
Line 012:                 </Island>
Line 013:             </Default>
Line 014:         </Switch>
Line 015:     </Archipelago>
Line 016: </Contents>

La structure <Switch>...</Switch> s'étend des lignes 003 à 014. Pour l'exemple, cette structure contient seulement deux cases : des lignes 004 à 008 et des lignes 009 à 013 (cas par défaut). Chaque case contient une île. Par exemple, la première structure <Case>…</Case> (lignes 004 à 008) s'occupe de la valeur de retour 'salut' (ce qui est toujours le cas puisque le test — partie bleue de l'exemple — retourne toujours la valeur 'salut'.

Au fond, en modifiant les lignes 006 ou 011, vous pouvez dès lors contrôler ce qui sera affiché sur votre site.

Le test — partie bleue de l'exemple — peut faire usage de toute fonction PHP que vous aurez choisie … puisque c'est finalement du code PHP qui s'exécute. Voyez d'ailleurs à ce titre l'exemple qui suit :

Line 001: <Contents>
Line 002:     <Archipelago id="body" active="yes" category="body">
Line 003:         <Switch test=".php= return ( isset( $_GET['qm'] ) ? $_GET['qm'] : 'empty' );">
Line 004:             <Case value='empty'>
Line 005:                 <Island id="all-modules" active="yes" class="LSContents">
Line 006:                     <param name="storage"><![CDATA[/islands/index.php]]></param>
Line 007:                 </Island>
Line 008:             </Case>
Line 009:             <Default>
Line 010:                 <Island id="specific-module" active="yes" class="LSContents">
Line 011:                     <param name="storage"><![CDATA[/islands/{get=qm}.php]]></param>
Line 012:                 </Island>
Line 013:             </Default>
Line 014:         </Switch>
Line 015:     </Archipelago>
Line 016: </Contents>

Dans l'exemple ci-dessus, on teste le paramètre 'qm' ($_GET['qm']). S'il n'est pas positionné, alors on retourne la valeur 'empty'; s'il l'est, on se dirige tout droit vers le cas par défaut (lignes 009 à 013). C'est bien le cas par défaut qui nous intéresse puisqu'apparemment, ce qui sera affiché est lui-même dépendant du paramètre (c'est le sens de la macro {get=qm} qui sera transformée en la valeur du paramètre ($_GET['qm']). Ainsi, si la page appelée se fait avec http://www.mondomaine.com/?qm=module1, alors le contenu de l'île specific-module proviendra de la ressource (fichier) /islands/module1.php.

Variation sur les constructions <Switch>...</Switch> dans le georama 2011-06-29

Depuis l'opus "4.5.0004"

Une variation intéressante du Case est le Case inlist="…"

Line 001: <Contents>
Line 002:     <Archipelago id="body" active="yes" category="body">
Line 003:         <Switch test=".php= return ( isset( $_GET['qm'] ) ? $_GET['qm'] : 'empty' );">
Line 004:             <Case value='empty'>
Line 005:                 <Island id="all-modules" active="yes" class="LSContents">
Line 006:                     <param name="storage"><![CDATA[/islands/index.php]]></param>
Line 007:                 </Island>
Line 008:             </Case>
Line 009:             <Case inlist='guest;partial'>
Line 010:                 <Island id="modules-extract" active="yes" class="LSContents">
Line 011:                     <param name="storage"><![CDATA[/islands/extract.php]]></param>
Line 012:                 </Island>
Line 013:             </Case>
Line 014:             <Default>
Line 015:                 <Island id="specific-module" active="yes" class="LSContents">
Line 016:                     <param name="storage"><![CDATA[/islands/{get=qm}.php]]></param>
Line 017:                 </Island>
Line 018:             </Default>
Line 019:         </Switch>
Line 020:     </Archipelago>
Line 021: </Contents>

Dans l'exemple ci-dessus, on teste le paramètre 'qm' ($_GET['qm']). S'il n'est pas positionné, alors on retourne la valeur 'empty'; s'il l'est, alors il se pourrait qu'il vaille 'guest' ou 'partial'. Dans pareil cas, on ne présente qu'un extrait des modules (lignes 009 à 013). Sinon, c'est le cas par défaut qui est appelé (lignes 014 à 018) en appelant LE module adéquat.

Multiples records dans des records : une possibilité de la classe LSCursor grâce à la méthode DetailCount() 2011-06-29

Depuis l'opus "4.1.0001"

Lorsque vous travaillez avec un curseur de type XML, il est possible d'avoir de multiples enregistrements dans le même enregistrement. Par exemple, dans un fichier de factures (enregistrements) le corps de la facture est composé de multiples lignes de détail (autres enregistrements). Nous allons vous montrer comment réaliser la chose avec la classe LSCursor:

Mettons le décor en place : il nous faut un fichier de données. Nous allons prendre pour l'exemple une équipe informatique qui s'occupe de faire des installations de logiciels et qui décrit, militairement, le cours de l'installation. Voilà le fichier de données :

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<MilitaryMinutes xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:xi="http://www.w3.org/2001/XInclude"
                 xmlns:vae="urn:lato-sensu-management/Vaesoli"
                 xmlns:quitus="urn:lato-sensu-management/Quitus">
    <Operation date="20110629">
        <Name><![CDATA[Defect resolution operation at Flexible Systems]]></Name>
        <Description><![CDATA[In the context of the XYZ project, a visit to Paris
                              was planned as to be able to solve the remaining
                              defects of the project]]></Description>
        <Events>
            <Event time="09:02"><![CDATA[Arrival at Gare du nord]]></Event>
            <Event time="09:07"><![CDATA[Buying metro tickets]]></Event>
            <Event time="09:14"><![CDATA[Metro, line 5 and then line 3]]></Event>
            <Event time="09:37"><![CDATA[Arrival at Flexible Systems]]></Event>
            <Event time="09:39"><![CDATA[Ersan Komescu pick us up]]></Event>
            <Event time="09:43"><![CDATA[Network connection tentative by Paulo]]></Event>
            <Event time="09:44"><![CDATA[Network connection failure]]></Event>
            <Event time="09:46"><![CDATA[Paulo attempts to reconnect]]></Event>
            <Event time="09:59"><![CDATA[Paulo got a weir identification error]]></Event>
            <Event time="10:00"><![CDATA[Cannot connect to the network of Brussels. Consequence is that Paulo cannot
                                         reach his sources]]></Event>
            <Event time="10:00"><![CDATA[Ersan and Paulo work together on wrong dispatch pattern (defect 500)]]></Event>
            <Event time="10:30"><![CDATA[Paulo instructed Ivan to work on defect 500: he gave explanations]]></Event>
            <Event time="11:18"><![CDATA[Speak with Andrea via phone. Andrea informed Greg that he didn't
                                         received the 407 and 503 patches. On the other hand, the environment
                                         will be available until 2pm or 2:30pm at the max]]></Event>
            <Event time="11:22"><![CDATA[Speak with Koen to ask him to send the patches to Andrea]]></Event>
            <Event time="11:49"><![CDATA[Verification with Andrea that he got the patches: the patches were
                                         relayed by Ersan actually]]></Event>
            <Event time="11:50"><![CDATA[Ersan and Paulo keep on working on the comprehension of the defects,
                                         more precisely 503 and 539]]></Event>
            <Event time="13:15"><![CDATA[Lunch]]></Event>
            <Event time="14:17"><![CDATA[Return from lunch]]></Event>
            <Event time="14:19"><![CDATA[Ersan and Paulo back to defects solving]]></Event>
            <Event time="15:00"><![CDATA[Network falls]]></Event>
            <Event time="15:19"><![CDATA[Network's back]]></Event>
            <Event time="15:25"><![CDATA[Defect 407 is reopened in Presentation Layer;
                                         Defects 503 and 539 cannot be solved today because
                                         no access to code]]></Event>
            <Event time="15:47"><![CDATA[Portal down]]></Event>
            <Event time="16:05"><![CDATA[Portal up again]]></Event>
            <Event time="16:15"><![CDATA[Paulo has access to his code: he starts working on the defects]]></Event>
            <Event time="16:25"><![CDATA[Paulo has no longer access to his code: he's blocked]]></Event>
            <Event time="16:26"><![CDATA[Ivan sends bug fix for 539. Ersan to forward the fix to Andrea]]></Event>
            <Event time="16:48"><![CDATA[Paulo has access to his code: resumes defect solving]]></Event>
            <Event time="17:01"><![CDATA[Defects 503 and 539 are fixed. They now have to be tested by final
                                         customer (deployment cannot be done now: foreseen for tomorrow morning)]]></Event>
            <Event time="17:09"><![CDATA[Paulo and Greg leave the offices of Flexible Systems]]></Event>
            <Event time="17:13"><![CDATA[Metro to return to Gare du nord]]></Event>
            <Event time="17:42"><![CDATA[Arrival at Gare du nord]]></Event>
            <Event time="18:01"><![CDATA[Train to Brussels]]></Event>
        </Events>
    </Operation>
</MilitaryMinutes>

Ce fichier nous donne le détail d'une opération d'installation : <Operation>…</Operation>. Au sein d'une opération, plusieurs événements sont recensés : <Events>…</Events>. Chaque événement est noté dans un tag <Event>…</Event>!

Line 001: <?php
Line 002: $oCursor = new LSCursor( "Data","military-minutes.xml" );
Line 003:
Line 004: if ( $oCursor->Open() )
Line 005: {
Line 006:     while( ! $oCursor->EOF() )       // Tant que pas fin de fichier
Line 007:     {
Line 008:         // Extraction des données (Name = field; @date = attribut)
Line 009:         $szName = utf8_decode(    $oCursor->Field( "Name"  ) );
Line 010:         $szDate = $oCursor->stod( $oCursor->Field( "@date" ) );
Line 011:
Line 012:         // Echo à l'écran
Line 013:         echo "<p>{$szDate}: {$szName}</p>";
Line 014:
Line 015:         // Accès à la série Event ... au sortir DetailCount()
Line 016:         // est positionné et retourne le nombre de sous-records
Line 017:         $oCursor->Field( "Events/Event" );
Line 018:         $k = max( $oCursor->DetailCount(),1 );
Line 019:
Line 020:         // On a k sous-records
Line 021:         for ( $i=1;$i<=$k;$i++ )
Line 022:         {
Line 023:             $szTime     =              $oCursor->Field( "Events/Event[{$i}]/@time" );
Line 024:             $szEvent    = utf8_decode( $oCursor->Field( "Events/Event[{$i}]"       ) );
Line 025:
Line 026:             echo "<p>{$szTime} ... {$szEvent}</p>\n";
Line 027:         }
Line 028:
Line 029:         $oCursor->Skip();        // Record suivant
Line 030:     }
Line 031:
Line 032:     $oCursor->Close();           // Fermeture du fichier
Line 033:     echo "<p>Done!</p>\n";
Line 034: }
Line 035: ?>

Et voilà ! La prise de notes militaires est d'ailleurs une des possibilités de Quitus, suite de Gestion d'Entreprise de la société Lato Sensu Management, dans la gestion de projets.

Sauver de multiples records dans des records 2011-10-06

Depuis l'opus "4.1.0001"

Le problème qu'on se propose de résoudre est d'ajouter des sous-records dans un record. Reprenons l'exemple des minutes militaires : il s'agit d'ajouter des tags XML entre les lignes 003 et 005.

Line 001: <Events>
Line 002:     <Event time="09:02"><![CDATA[Arrival at Gare du nord]]></Event>
Line 003:     <Event time="09:07"><![CDATA[Buying metro tickets]]></Event>
Line 004:     <...>
Line 005: </Events>

Voyons d'abord comment on peut compter le nombre de sous-records (même si on a déjà discouru sur le sujet) :

Line 001: ini_set('error_reporting', E_ALL | E_NOTICE );
Line 002: error_reporting( E_ALL | E_NOTICE );
Line 003: ini_set( 'display_errors','On' );
Line 004:
Line 005: $szRoot = $_SERVER['DOCUMENT_ROOT'];                            /* Racine du site */
Line 006: require_once( $szRoot . '/vaesoli/include/LSVfc.class.php');    /* Foundation Classes */
Line 007:
Line 008: $oCursor = new LSCursor( "Data","events.xml" );                 /* Create cursor object */
Line 009:
Line 010: if ( $oCursor->Open() )                                         /* If cursor can be opened */
Line 011: {
Line 012:     $oCursor->GoTop();                                          /* Go to first record */
Line 013:     $oCursor->Field( "Events/Event" );                          /* Access the subrecords */
Line 014:     $iCount = $oCursor->DetailCount();                          /* Count how many we have */
Line 015:
Line 016:     /* Show this to the user */
Line 017:     echo "<p>Il y a {$iCount} sous-records 'Event' dans 'Events' du record #" . $oCursor->Recno() . "</p>\n";
Line 018:
Line 019:     $oCursor->Close();                                          /* Close the file when no longer need */
Line 020: }

Ce qui devrait donner :

Il y a 33 sous-records 'Event' dans 'Events' du record #1

Ajouter un sous-record se fera de la manière suivante :

Line 001: ini_set('error_reporting', E_ALL | E_NOTICE );
Line 002: error_reporting( E_ALL | E_NOTICE );
Line 003: ini_set( 'display_errors','On' );
Line 004:
Line 005: $szRoot = $_SERVER['DOCUMENT_ROOT'];                            /* Racine du site */
Line 006: require_once( $szRoot . '/vaesoli/include/LSVfc.class.php');    /* Foundation Classes */
Line 007:
Line 008: $oCursor = new LSCursor( "Data","events.xml" );                 /* Create cursor object */
Line 009:
Line 010: if ( $oCursor->Open() )                                         /* If cursor can be opened */
Line 011: {
Line 012:     $oCursor->GoTop();                                          /* Go to first record */
Line 013:
Line 014:     $oCursor->Replace( "Events/Event[new]/@time",date('H:i') ); /* Add a sub-record */
Line 015:
Line 016:     $oCursor->Field( "Events/Event" );                          /* Access the subrecords */
Line 017:     $iCount = $oCursor->DetailCount();                          /* Count how many we have */
Line 018:
Line 019:     /* Place some text in the newly created subrecord */
Line 020:     $oCursor->Replace( "Events/Event[{$iCount}]",'New event inserted at ' . time() );
Line 021:
Line 022:     $iCount = $oCursor->DetailCount();                          /* Count how many we have now */
Line 023:     echo "<p>Il y a {$iCount} sous-records 'Event' dans 'Events' du record #" . $oCursor->Recno() . "</p>\n";
Line 024:
Line 025:     $oCursor->Save();
Line 026:     $oCursor->Close();                                          /* Close the file when no longer need */
Line 027: }

Îles et archipels visibles en fonction du media 2011-02-19

Depuis l'opus "3.6.0001"

Depuis l'opus 3.6.0001 vous pouvez spécifier si oui ou non une île est visible sur un media donné. Ainsi, il devient plus facile de dire quelle île (mais c'est aussi vrai pour les archipels) sera visible sur un appareil mobile.

<Island id="mon-ile" active="yes" class="LSContents" media="screen;robot">
    <param name="storage"><![CDATA[/islands/contenu.php]]></param>
</Island>

Dans le cas indiqué ci-dessus, l'île ne sera visible que pour les media de type "screen" ou pour les "robots" (comme Google par exemple).

Voilà un autre cas utile dans la situation d'appareils mobiles :

<Island id="mon-ile" active="yes" class="LSContents" media="handheld">
    <param name="storage"><![CDATA[/islands/contenu.php]]></param>
</Island>

Précédent Suivant