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)

La classe LSCursor 2010-11-15

Depuis l'opus "3.5.0017"

La classe LSCursor est probablement la classe la plus importante de la version 3.5.0017 de Vae Soli!. Cette classe fait désormais le lien entre les formulaires et TOUTES les classes de type contenu (LSContents*) puisqu'elle permet, de manière générique, de pratiquer les mises à jour de données indispensables. C'est aussi pour l'équipe de Vae Soli! le signal d'un changement en profondeur de toutes ces classes pour îles.

Le premier exemple que nous allons créer est basé sur un fichier de données existant. Le fichier en question est un fichier XML qui contient la liste des couleurs nommées en (X)HTML : red, blue, green, cyan, yellow, etc. Ce fichier est livré en standard dans la nouvelle version de Vae Soli!. Il est localisé dans le répertoire de ressources XML: vaesoli/resources/XML/colors.xml. Veuillez noter que les fichiers de données sont pour Vae Soli! des fichiers XML par défaut.

L'exemple en question nous permettra d'entrer en contact avec les fonctions/méthodes de base de la classe LSCursor.

Créer l'object 'curseur'

Pour créer un objet 'curseur', il suffit de charger le code de la classe LSCursor et de créer l'obejt en question :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );               // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';  // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile ); // Créer le curseur (on lui donne un nom et on spécifie le fichier)
Line 005: ?>

Voilà qui ne fait pas grand-chose mais au moins avons-nous vu comment charger le code de la classe (ligne 002) et comment créer un curseur (ligne 004).

Ouvrir et fermer le curseur

Avant de pouvoir accéder aux données du curseur, il faut l'ouvrir. cela se fait grâce à la méthode Open() qui retourne un booléen : vrai ou faux (true or false). Si l'ouverture du curseur est courronée de succès, la méthode renvoie un true.

Lorsque vous n'avez plus besoin du curseur, pensez à le fermer grâce à la méthode Close(). Cette méthode également vous renseigne sur le bon déroulement de l'opération: vrai si le curesur a été fermé correctement; faux dans le cas contraire.

Le code qui suit illustre ces deux opérations de base :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );               // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';  // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile ); // Créer le curseur
Line 005: if ( $oCursor->Open() )                             // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     echo "<p>L'ouverture du curseur s'est bien déroulée</p>\n";
Line 008:
Line 009:     if ( $oCursor->Close() )                        // Si le curseur a été fermé avec succès
Line 010:     {
Line 011:         echo "<p>La fermeture du curseur s'est bien déroulée</p>\n";
Line 012:     }
Line 013: }
Line 014: else
Line 015: {
Line 016:     echo "<p>Le curseur n'a pas pu être ouvert</p>\n";
Line 017: }
Line 018: ?>

Ce n'est toujours pas exceptionnel mais cela fait ce qu'on attend de ce type de code.

Parcourir le curseur

Pour parcourir le curseur, vous devez positionner le pointeur d'enregistrement sur le premier enregistrement contenu dans le fichier de données puis, tant que la fin du curseur n'est pas atteinte, vous devez passer à l'enregistrement suivant.

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );               // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';  // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile ); // Créer le curseur
Line 005: if ( $oCursor->Open() )                             // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     $oCursor->GoTop();                              // Aller au premier enregistrement
Line 008:
Line 009:     while( !  $oCursor->EOF() )                     // Tant que pas fin du curseur (EOF = End Of File)
Line 010:     {
Line 011:         echo '.';                                   // Afficher un '.'
Line 012:         $oCursor->Skip();                           // Aller à l'enregistrement suivant
Line 013:     }
Line 014:
Line 015:     $oCursor->Close();
Line 016: }
Line 017: else
Line 018: {
Line 019:     echo "<p>Le curseur n'a pas pu être ouvert</p>\n";
Line 020: }
Line 021: ?>

Extraire la valeur d'un champ

Pour extraire la valeur d'un champ du curseur, vous devez utiliser la méthode Field. À ce stade, il nous faut vous rappeler que pour Vae Soli! les fichiers de données sont des fichiers XML par défaut. Cela a effectivement son importance pour comprendre comment fonctionne l'extraction des champs.

Pour vous aider à comprendre, nous vous fournissons ici un petit extrait du fichier XML des couleurs :

Line 001: <?xml version="1.0" encoding="iso-8859-1"?>
Line 002: <Colors xmlns:xi="http://www.w3.org/2001/XInclude" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
Line 003:     <Color id="aliceblue" active="yes">
Line 004:         <RGB><![CDATA[rgb(240,248,255)]]></RGB>
Line 005:         <Hex><![CDATA[f0f8ff]]></Hex>
Line 006:     </Color>
Line 007:     <Color id="antiquewhite" active="yes">
Line 008:         <RGB><![CDATA[rgb(250,235,215)]]></RGB>
Line 009:         <Hex><![CDATA[faebd7]]></Hex>
Line 010:     </Color>
Line 011:     <Color id="aqua" active="yes">
Line 012:         <RGB><![CDATA[rgb(0,255,255)]]></RGB>
Line 013:         <Hex><![CDATA[00ffff]]></Hex>
Line 014:     </Color>
Line 015:     <...>
Line 016: </Colors>

L'extrait ci-dessus indique 3 des couleurs contenues dans le fichier : aliceblue, antiquewhite et aqua.

Vae Soli! vous permet d'extraire la valeur des attributs (id et active) ou des sous-tags (RGB et Hex) et cela simplement par l'utilisation de la méthode Field(). Voyons comment :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 008:
Line 009:     while( !  $oCursor->EOF() )                             // Tant que pas fin du curseur (EOF = End Of File)
Line 010:     {
Line 011:         echo "<p>" . $oCursor->Field( '@id' ) . "</p>";     // Afficher la valeur de l'attribut 'id'
Line 012:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
Line 013:     }
Line 014:
Line 015:     $oCursor->Close();                                      // Fermer le curseur
Line 016: }
Line 017: else
Line 018: {
Line 019:     echo "<p>Le curseur n'a pas pu être ouvert</p>\n";
Line 020: }
Line 021: ?>

Vous aurez noté que pour afficher la valeur d'un attribut il faut faire précéder le nom de l'attribut d'un '@', ce qui est finalement très courant pour qui gère des données XML. Voyons maintenant comment extraire la valeur d'un sous-tag :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 008:
Line 009:     while( !  $oCursor->EOF() )                             // Tant que pas fin du curseur (EOF = End Of File)
Line 010:     {
Line 011:         echo "<p>" . $oCursor->Field( 'RGB' ) . "</p>";     // Afficher la valeur du tag 'RGB'
Line 012:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
Line 013:     }
Line 014:
Line 015:     $oCursor->Close();                                      // Fermer le curseur
Line 016: }
Line 017: else
Line 018: {
Line 019:     echo "<p>Le curseur n'a pas pu être ouvert</p>\n";
Line 020: }
Line 021: ?>

La valeur d'un champ multiple

Le cas que nous cherchons à adresser est celui d'un champ qui peut apparaître plusieurs fois. C'est évidemment le cas lorsque les fichiers de données sont des fichiers XML. Voyez ci-dessous le cas de figure en question :

Line 001: <Phones>
Line 002:     <Tel><![CDATA[+32 2 738 80 27]]></Tel>
Line 003:     <Tel><![CDATA[+32 2 738 40 69]]></Tel>
Line 004:     <Mobile><![CDATA[]]></Mobile>
Line 005: </Phones>

Dans ce cas particulier comment pouvons-nous extraire la valeur de la première occurrence du champ Tel et comment pouvons-nous extraire sa deuxième occurrence par exemple. C'est de ce cas concret dont il faut nous occuper.

En fait, c'est hyper simple: il suffit qu'on dise à la méthode Field qu'on souhaite extraire le premier ou le second. Dans l'exemple ci-dessous, nous extrayons la deuxième occurrence :

Line 001: $oCursor = new LSCursor( "Staff","/staff.xml" );
Line 002: if ( $oCursor->Open()  )
Line 003: {
Line 004:     echo "<p>" . $oCursor->Field( "Phones/Tel[2]" ) . "</p>\n";
Line 005:     $oCursor->Close();
Line 006: }
Line 007: else
Line 008: {
Line 009:     echo "<p>Cannot open '{$oCursor->szDataSource}'</p>\n";
Line 010: }

… ce qui donne :

+32 2 738 40 69

Mettons le tout ensemble…

Vous venez de passer en revue les opérations de base sur un curseur. Globalisons le tout et affichons une liste des couleurs contenues dans le fichier des couleurs :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 008:
Line 009:     echo "<ul>";                                            // Début d'une liste non ordonnée
Line 010:     while( !  $oCursor->EOF() )                             // Tant que pas fin du curseur (EOF = End Of File)
Line 011:     {
Line 012:         $szID   = $oCursor->Field( '@id' );                 // Extraction de l'id
Line 013:         $szHex  = $oCursor->Field( 'Hex' );                 // Extraction de la valeur hexadécimale
Line 014:         $szRGB  = $oCursor->Field( 'RGB' );                 // Extraction de la valeur RGB
Line 015:
Line 016:         // Composons une ligne avec les valeurs extraites et un
Line 017:         // peu de layout...
Line 018:         echo "<li><span style=\"display:inline-block;width:200px;\">{$szID}</span>";
Line 019:         echo "<span style=\"display:inline-block;width:250px;\">{$szHex} ... {$szRGB}</span> ";
Line 020:         echo "<span style=\"background:{$szRGB};display:inline-block;width:100px;\">&#160;</span></li>\n";
Line 021:
Line 022:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
Line 023:     }
Line 024:     echo "</ul>";                                           // Fin de la liste non ordonnée
Line 025:
Line 026:     $oCursor->Close();                                      // Fermer le curseur
Line 027: }
Line 028: else
Line 029: {
Line 030:     echo "<p>Le curseur n'a pas pu être ouvert</p>\n";
Line 031: }
Line 032: ?>

Et voyons immédiatement le résultat de ce code :

  • alicebluef0f8ff ... rgb(240,248,255)  
  • antiquewhitefaebd7 ... rgb(250,235,215)  
  • aqua00ffff ... rgb(0,255,255)  
  • aquamarine7fffd4 ... rgb(127,255,212)  
  • azuref0ffff ... rgb(240,255,255)  
  • beigef5f5dc ... rgb(245,245,220)  
  • bisqueffe4c4 ... rgb(255,228,196)  
  • black000000 ... rgb(0,0,0)  
  • blanchedalmondffebcd ... rgb(255,235,205)  
  • blue0000ff ... rgb(0,0,255)  
  • blueviolet8a2be2 ... rgb(138,43,226)  
  • browna52a2a ... rgb(165,42,42)  
  • burlywooddeb887 ... rgb(222,184,135)  
  • cadetblue5f9ea0 ... rgb(95,158,160)  
  • chartreuse7fff00 ... rgb(127,255,0)  
  • chocolated2691e ... rgb(210,105,30)  
  • coralff7f50 ... rgb(255,127,80)  
  • cornflowerblue6495ed ... rgb(100,149,237)  
  • cornsilkfff8dc ... rgb(255,248,220)  
  • crimsondc143c ... rgb(220,20,60)  
  • cyan00ffff ... rgb(0,255,255)  
  • darkblue00008b ... rgb(0,0,139)  
  • darkcyan008b8b ... rgb(0,139,139)  
  • darkgoldenrodb8860b ... rgb(184,134,11)  
  • darkgraya9a9a9 ... rgb(169,169,169)  
  • darkgreya9a9a9 ... rgb(169,169,169)  
  • darkgreen006400 ... rgb(0,100,0)  
  • darkkhakibdb76b ... rgb(189,183,107)  
  • darkmagenta8b008b ... rgb(139,0,139)  
  • darkolivegreen556b2f ... rgb(85,107,47)  
  • darkorangeff8c00 ... rgb(255,140,0)  
  • darkorchid9932cc ... rgb(153,50,204)  
  • darkred8b0000 ... rgb(139,0,0)  
  • darksalmone9967a ... rgb(233,150,122)  
  • darkseagreen8fbc8f ... rgb(143,188,143)  
  • darkslateblue483d8b ... rgb(72,61,139)  
  • darkslategray2f4f4f ... rgb(47,79,79)  
  • darkslategrey2f4f4f ... rgb(47,79,79)  
  • darkturquoise00ced1 ... rgb(0,206,209)  
  • darkviolet9400d3 ... rgb(148,0,211)  
  • deeppinkff1493 ... rgb(255,20,147)  
  • deepskyblue00bfff ... rgb(0,191,255)  
  • dimgray696969 ... rgb(105,105,105)  
  • dimgrey696969 ... rgb(105,105,105)  
  • dodgerblue1e90ff ... rgb(30,144,255)  
  • firebrickb22222 ... rgb(178,34,34)  
  • floralwhitefffaf0 ... rgb(255,250,240)  
  • forestgreen228b22 ... rgb(34,139,34)  
  • fuchsiaff00ff ... rgb(255,0,255)  
  • gainsborodcdcdc ... rgb(220,220,220)  
  • ghostwhitef8f8ff ... rgb(248,248,255)  
  • goldffd700 ... rgb(255,215,0)  
  • goldenroddaa520 ... rgb(218,165,32)  
  • gray808080 ... rgb(128,128,128)  
  • grey808080 ... rgb(128,128,128)  
  • green008000 ... rgb(0,128,0)  
  • greenyellowadff2f ... rgb(173,255,47)  
  • honeydewf0fff0 ... rgb(240,255,240)  
  • hotpinkff69b4 ... rgb(255,105,180)  
  • indianredcd5c5c ... rgb(205,92,92)  
  • indigo4b0082 ... rgb(75,0,130)  
  • ivoryfffff0 ... rgb(255,255,240)  
  • khakif0e68c ... rgb(240,230,140)  
  • lavendere6e6fa ... rgb(230,230,250)  
  • lavenderblushfff0f5 ... rgb(255,240,245)  
  • lawngreen7cfc00 ... rgb(124,252,0)  
  • lemonchiffonfffacd ... rgb(255,250,205)  
  • lightblueadd8e6 ... rgb(173,216,230)  
  • lightcoralf08080 ... rgb(240,128,128)  
  • lightcyane0ffff ... rgb(224,255,255)  
  • lightgoldenrodyellowfafad2 ... rgb(250,250,210)  
  • lightgrayd3d3d3 ... rgb(211,211,211)  
  • lightgreyd3d3d3 ... rgb(211,211,211)  
  • lightgreen90ee90 ... rgb(144,238,144)  
  • lightpinkffb6c1 ... rgb(255,182,193)  
  • lightsalmonffa07a ... rgb(255,160,122)  
  • lightseagreen20b2aa ... rgb(32,178,170)  
  • lightskyblue87cefa ... rgb(135,206,250)  
  • lightslategray778899 ... rgb(119,136,153)  
  • lightslategrey778899 ... rgb(119,136,153)  
  • lightsteelblueb0c4de ... rgb(176,196,222)  
  • lightyellowffffe0 ... rgb(255,255,224)  
  • lime00ff00 ... rgb(0,255,0)  
  • limegreen32cd32 ... rgb(50,205,50)  
  • linenfaf0e6 ... rgb(250,240,230)  
  • magentaff00ff ... rgb(255,0,255)  
  • maroon800000 ... rgb(128,0,0)  
  • mediumaquamarine66cdaa ... rgb(102,205,170)  
  • mediumblue0000cd ... rgb(0,0,205)  
  • mediumorchidba55d3 ... rgb(186,85,211)  
  • mediumpurple9370d8 ... rgb(147,112,216)  
  • mediumseagreen3cb371 ... rgb(60,179,113)  
  • mediumslateblue7b68ee ... rgb(123,104,238)  
  • mediumspringgreen00fa9a ... rgb(0,250,154)  
  • mediumturquoise48d1cc ... rgb(72,209,204)  
  • mediumvioletredc71585 ... rgb(199,21,133)  
  • midnightblue191970 ... rgb(25,25,112)  
  • mintcreamf5fffa ... rgb(245,255,250)  
  • mistyroseffe4e1 ... rgb(255,228,225)  
  • moccasinffe4b5 ... rgb(255,228,181)  
  • navajowhiteffdead ... rgb(255,222,173)  
  • navy000080 ... rgb(0,0,128)  
  • oldlacefdf5e6 ... rgb(253,245,230)  
  • olive808000 ... rgb(128,128,0)  
  • olivedrab6b8e23 ... rgb(107,142,35)  
  • orangeffa500 ... rgb(255,165,0)  
  • orangeredff4500 ... rgb(255,69,0)  
  • orchidda70d6 ... rgb(218,112,214)  
  • palegoldenrodeee8aa ... rgb(238,232,170)  
  • palegreen98fb98 ... rgb(152,251,152)  
  • paleturquoiseafeeee ... rgb(175,238,238)  
  • palevioletredd87093 ... rgb(216,112,147)  
  • papayawhipffefd5 ... rgb(255,239,213)  
  • peachpuffffdab9 ... rgb(255,218,185)  
  • perucd853f ... rgb(205,133,63)  
  • pinkffc0cb ... rgb(255,192,203)  
  • plumdda0dd ... rgb(221,160,221)  
  • powderblueb0e0e6 ... rgb(176,224,230)  
  • purple800080 ... rgb(128,0,128)  
  • redff0000 ... rgb(255,0,0)  
  • rosybrownbc8f8f ... rgb(188,143,143)  
  • royalblue4169e1 ... rgb(65,105,225)  
  • saddlebrown8b4513 ... rgb(139,69,19)  
  • salmonfa8072 ... rgb(250,128,114)  
  • sandybrownf4a460 ... rgb(244,164,96)  
  • seagreen2e8b57 ... rgb(46,139,87)  
  • seashellfff5ee ... rgb(255,245,238)  
  • siennaa0522d ... rgb(160,82,45)  
  • silverc0c0c0 ... rgb(192,192,192)  
  • skyblue87ceeb ... rgb(135,206,235)  
  • slateblue6a5acd ... rgb(106,90,205)  
  • slategray708090 ... rgb(112,128,144)  
  • slategrey708090 ... rgb(112,128,144)  
  • snowfffafa ... rgb(255,250,250)  
  • springgreen00ff7f ... rgb(0,255,127)  
  • steelblue4682b4 ... rgb(70,130,180)  
  • tand2b48c ... rgb(210,180,140)  
  • teal008080 ... rgb(0,128,128)  
  • thistled8bfd8 ... rgb(216,191,216)  
  • tomatoff6347 ... rgb(255,99,71)  
  • turquoise40e0d0 ... rgb(64,224,208)  
  • violetee82ee ... rgb(238,130,238)  
  • wheatf5deb3 ... rgb(245,222,179)  
  • whiteffffff ... rgb(255,255,255)  
  • whitesmokef5f5f5 ... rgb(245,245,245)  
  • yellowffff00 ... rgb(255,255,0)  
  • yellowgreen9acd32 ... rgb(154,205,50)  

Le résultat est assez intéressant, nous espérons que vous en conviendrez.

Nombre d'enregistrements et position du pointeur d'enregistrement

Connaître le nombre d'enregistrements contenus dans le curseur se fait grâce à la méthode Reccount(). Connaître la position du pointeur d'enregistrement se fait grâce à la méthode Recno(). Voyons cela avec un exemple :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 008:
Line 009:     echo "<p>Il y a <strong>" . $oCursor->Reccount() . "</strong> enregistrements dans le curseur. " .
Line 010:          "Le pointeur d'enregistrement est positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 011:
Line 012:     $oCursor->Skip( 10 );                                   // Sauter 10 enregistrements
Line 013:
Line 014:     echo "<p>Le pointeur d'enregistrement est maintenant positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 015:
Line 016:     $oCursor->Close();                                      // Fermer le curseur
Line 017: }
Line 018: ?>

Aller à un enregistrement précis

Plusieurs méthodes vous permettent de vous déplacer dans le curseur. Tout d'abord la méthode GoTop() qui permet d'aller au premier enregistrement du curseur, tout en respectant l'ordre courant. Vous pouvez aussi aller au dernier enregistrement avec la méthode GoBottom(). Ceci est illustré dans l'exemple qui suit :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 008:     echo "<p>Le pointeur d'enregistrement est positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 009:
Line 010:     $oCursor->GoBottom();                                   // Aller au dernier enregistrement
Line 011:     echo "<p>Le pointeur d'enregistrement est maintenant positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 012:
Line 013:     $oCursor->Close();                                      // Fermer le curseur
Line 014: }
Line 015: ?>

Déjà aperçu antérieurement, la méthode Skip() vous permet de vous déplacer dans le curseur à partir de la position courante, en avant ou en arrière. Illustrons ces possibilités :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 008:     echo "<p>Le pointeur d'enregistrement est positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 009:
Line 010:     $oCursor->GoBottom();                                   // Aller au dernier enregistrement
Line 011:     echo "<p>Le pointeur d'enregistrement est maintenant positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 012:
Line 013:     $oCursor->Skip( -100 );                                 // Déplacement de 100 enregistrements en arrière
Line 014:     echo "<p>Le pointeur d'enregistrement est maintenant positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 015:
Line 016:     $oCursor->Skip( 50 );                                   // Déplacement de 50 enregistrements en arrière
Line 017:     echo "<p>Le pointeur d'enregistrement est maintenant positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 018:
Line 019:     $oCursor->Close();                                      // Fermer le curseur
Line 020: }
Line 021: ?>

Et voilà le résultat que cela provoque :

Le pointeur d'enregistrement est positionné en #1.

Le pointeur d'enregistrement est maintenant positionné en #147.

Le pointeur d'enregistrement est maintenant positionné en #47.

Le pointeur d'enregistrement est maintenant positionné en #97.

Enfin, vous pouvez aller à un enregistrement bien précis avec la méthode Go() :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 006: {
Line 007:     $oCursor->Go( $oCursor->Reccount() / 2 );               // Aller à l'enregistrement qui se trouve au milieu
Line 008:     echo "<p>Le pointeur d'enregistrement est positionné en #<strong>" . $oCursor->Recno() . "</strong>.</p>\n";
Line 009:     echo "<p>Il s'agit de la couleur <strong>" . $oCursor->Field( '@id' ) . "</strong>.</p>\n";
Line 010:
Line 011:     $oCursor->Close();                                      // Fermer le curseur
Line 012: }
Line 013: ?>

Cela donne le résultat suivant :

Le pointeur d'enregistrement est positionné en #73.

Il s'agit de la couleur lightgrey.

Extraire une partie du curseur

Pensons maintenant à n'extraire que les 10 premiers enregistrements. La méthode Recno() permet de déterminer le numéro de l'enregistrement courant :

line 001: <?php
line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
line 005: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
line 006: {
line 007:     $oCursor->GoTop();                                      // Aller au premier enregistrement
line 008:
line 009:     echo "<ul>";                                            // Début d'une liste non ordonnée
line 010:     while( !  $oCursor->EOF() && $oCursor->Recno() <= 10 )  // Tant que pas fin du curseur et n° record <= 10
line 011:     {
line 012:         $szID   = $oCursor->Field( '@id' );                 // Extraction de l'id
line 013:         $szHex  = $oCursor->Field( 'Hex' );                 // Extraction de la valeur hexadécimale
line 014:         $szRGB  = $oCursor->Field( 'RGB' );                 // Extraction de la valeur RGB
line 015:
line 016:         // Composons une ligne avec les valeurs extraites et un
line 017:         // peu de layout...
line 018:         echo "<li><span style=\"display:inline-block;width:200px;\">{$szID}</span>";
line 019:         echo "<span style=\"display:inline-block;width:250px;\">{$szHex} ... {$szRGB}</span> ";
line 020:         echo "<span style=\"background:{$szRGB};display:inline-block;width:100px;\">&#160;</span></li>\n";
line 021:
line 022:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
line 023:     }
line 024:     echo "</ul>";                                           // Fin de la liste non ordonnée
line 025:
line 026:     $oCursor->Close();                                      // Fermer le curseur
line 027: }
line 028: else
line 029: {
line 030:     echo "<p>Le curseur n'a pas pu être ouvert</p>\n";
line 031: }
line 032?>

… ce qui donne…

  • alicebluef0f8ff ... rgb(240,248,255)  
  • antiquewhitefaebd7 ... rgb(250,235,215)  
  • aqua00ffff ... rgb(0,255,255)  
  • aquamarine7fffd4 ... rgb(127,255,212)  
  • azuref0ffff ... rgb(240,255,255)  
  • beigef5f5dc ... rgb(245,245,220)  
  • bisqueffe4c4 ... rgb(255,228,196)  
  • black000000 ... rgb(0,0,0)  
  • blanchedalmondffebcd ... rgb(255,235,205)  
  • blue0000ff ... rgb(0,0,255)  

Appliquer un filtre sur le curseur

Ce que nous cherchons à faire, c'est de filtrer le curseur sur base d'un critère bien spécifique. L'exemple qui suit va extraire toutes les couleurs qui commencent par 'a' :

line 001: <?php
line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
line 005: $oCursor->szFilter = "starts-with( @id,'a' )";              // Filtre
line 006: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
line 007: {
line 008:     $oCursor->GoTop();                                      // Aller au premier enregistrement
line 009:
line 010:     echo "<ul>";                                            // Début d'une liste non ordonnée
line 011:     while( !  $oCursor->EOF() )                             // Tant que pas fin du curseur (EOF = End Of File)
line 012:     {
line 013:         $szID   = $oCursor->Field( '@id' );                 // Extraction de l'id
line 014:         $szHex  = $oCursor->Field( 'Hex' );                 // Extraction de la valeur hexadécimale
line 015:         $szRGB  = $oCursor->Field( 'RGB' );                 // Extraction de la valeur RGB
line 016:
line 017:         // Composons une ligne avec les valeurs extraites et un
line 018:         // peu de layout...
line 019:         echo "<li><span style=\"display:inline-block;width:200px;\">{$szID}</span>";
line 020:         echo "<span style=\"display:inline-block;width:250px;\">{$szHex} ... {$szRGB}</span> ";
line 021:         echo "<span style=\"background:{$szRGB};display:inline-block;width:100px;\">&#160;</span></li>\n";
line 022:
line 023:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
line 024:     }
line 025:     echo "</ul>";                                           // Fin de la liste non ordonnée
line 026:
line 027:     $oCursor->Close();                                      // Fermer le curseur
line 028: }
line 029: ?>

 

  • alicebluef0f8ff ... rgb(240,248,255)  
  • antiquewhitefaebd7 ... rgb(250,235,215)  
  • aqua00ffff ... rgb(0,255,255)  
  • aquamarine7fffd4 ... rgb(127,255,212)  
  • azuref0ffff ... rgb(240,255,255)  

Si vous modifiez le filtre APRÈS l'ouverture du curseur grâce à la méthode Open(), vous devez faire appel à la méthode Requery() pour actualiser le curseur.

line 001: <?php
line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
line 005: $oCursor->szFilter = "starts-with( @id,'a' )";              // Filtre
line 006: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
line 007: {
line 008:     $oCursor->szFilter = "starts-with( @id,'b' )";          // Nouveau filtre
line 009:     $oCursor->Requery();                                    // Requery des données avec le nouveau filtre
line 010:     $oCursor->GoTop();                                      // Aller au premier enregistrement
line 011:
line 012:     echo "<ul>";                                            // Début d'une liste non ordonnée
line 013:     while( !  $oCursor->EOF() )                             // Tant que pas fin du curseur (EOF = End Of File)
line 014:     {
line 015:         $szID   = $oCursor->Field( '@id' );                 // Extraction de l'id
line 016:         $szHex  = $oCursor->Field( 'Hex' );                 // Extraction de la valeur hexadécimale
line 017:         $szRGB  = $oCursor->Field( 'RGB' );                 // Extraction de la valeur RGB
line 018:
line 019:         // Composons une ligne avec les valeurs extraites et un
line 020:         // peu de layout...
line 021:         echo "<li><span style=\"display:inline-block;width:200px;\">{$szID}</span>";
line 022:         echo "<span style=\"display:inline-block;width:250px;\">{$szHex} ... {$szRGB}</span> ";
line 023:         echo "<span style=\"background:{$szRGB};display:inline-block;width:100px;\">&#160;</span></li>\n";
line 024:
line 025:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
line 026:     }
line 027:     echo "</ul>";                                           // Fin de la liste non ordonnée
line 028:
line 029:     $oCursor->Close();                                      // Fermer le curseur
line 030: }
line 031: ?>

 

  • beigef5f5dc ... rgb(245,245,220)  
  • bisqueffe4c4 ... rgb(255,228,196)  
  • black000000 ... rgb(0,0,0)  
  • blanchedalmondffebcd ... rgb(255,235,205)  
  • blue0000ff ... rgb(0,0,255)  
  • blueviolet8a2be2 ... rgb(138,43,226)  
  • browna52a2a ... rgb(165,42,42)  
  • burlywooddeb887 ... rgb(222,184,135)  

Trier un curseur

L'exemple vaut ce qu'il vaut mais il démontre parfaitement l'effet de la propriété szOrderBy : nous allons trier les couleurs sur base de leur valeur hexadécimale. Au demeurant, pour limiter la taille de l'output produit, nous allons aussi réduire notre tri aux 5 premiers enregistrements.

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: $oCursor->szOrderBy = 'Hex';                                // Trié sur la couleur hexadécimale (le champ 'Hex')
Line 006: $oCursor->szFilter  = 'position()<=5';                      // 5 premiers enregistrements
Line 007: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 008: {
Line 009:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 010:
Line 011:     echo "<ol>";                                            // Début d'une liste ordonnée
Line 012:     while( ! $oCursor->EOF() )                              // Tant que pas fin du curseur (EOF = End Of File)
Line 013:     {
Line 014:         $szID   = $oCursor->Field( '@id' );                 // Extraction de l'id
Line 015:         $szHex  = $oCursor->Field( 'Hex' );                 // Extraction de la valeur hexadécimale
Line 016:         $szRGB  = $oCursor->Field( 'RGB' );                 // Extraction de la valeur RGB
Line 017:
Line 018:         // Composons une ligne avec les valeurs extraites et un
Line 019:         // peu de layout...
Line 020:         echo "<li><span style=\"display:inline-block;width:200px;\">{$szID}</span>";
Line 021:         echo "<span style=\"display:inline-block;width:250px;\">{$szHex} ... {$szRGB}</span> ";
Line 022:         echo "<span style=\"background:{$szRGB};display:inline-block;width:100px;\">&#160;</span></li>\n";
Line 023:
Line 024:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
Line 025:     }
Line 026:     echo "</ol>";                                           // Fin de la liste ordonnée
Line 027:
Line 028:     $oCursor->Close();                                      // Fermer le curseur
Line 029: }
Line 030: ?>

Intéressons nous au résultat :

  1. black000000 ... rgb(0,0,0)  
  2. navy000080 ... rgb(0,0,128)  
  3. darkblue00008b ... rgb(0,0,139)  
  4. mediumblue0000cd ... rgb(0,0,205)  
  5. blue0000ff ... rgb(0,0,255)  

Sans autre indication, le curseur est trié dans l'ordre ascendant. Mais vous pouvez modifier ce comportement grâce à la propriété szOrderDir comme vous le suggère l'exemple suivant :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: $oCursor->szOrderBy  = 'Hex';                               // Trié sur la couleur hexadécimale
Line 006: $oCursor->szOrderDir = 'descending';                        // Trié de manière descendante
Line 007: $oCursor->szFilter   = 'position()<=5';                     // 5 premiers enregistrements
Line 008: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 009: {
Line 010:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 011:
Line 012:     echo "<ol>";                                            // Début d'une liste ordonnée
Line 013:     while( !  $oCursor->EOF() )                             // Tant que pas fin du curseur (EOF = End Of File)
Line 014:     {
Line 015:         $szID   = $oCursor->Field( '@id' );                 // Extraction de l'id
Line 016:         $szHex  = $oCursor->Field( 'Hex' );                 // Extraction de la valeur hexadécimale
Line 017:         $szRGB  = $oCursor->Field( 'RGB' );                 // Extraction de la valeur RGB
Line 018:
Line 019:         // Composons une ligne avec les valeurs extraites et un
Line 020:         // peu de layout...
Line 021:         echo "<li><span style=\"display:inline-block;width:200px;\">{$szID}</span>";
Line 022:         echo "<span style=\"display:inline-block;width:250px;\">{$szHex} ... {$szRGB}</span> ";
Line 023:         echo "<span style=\"background:{$szRGB};display:inline-block;width:100px;\">&#160;</span></li>\n";
Line 024:
Line 025:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
Line 026:     }
Line 027:     echo "</ol>";                                           // Fin de la liste ordonnée
Line 028:
Line 029:     $oCursor->Close();                                      // Fermer le curseur
Line 030: }
Line 031: ?>

 

  1. whiteffffff ... rgb(255,255,255)  
  2. ivoryfffff0 ... rgb(255,255,240)  
  3. lightyellowffffe0 ... rgb(255,255,224)  
  4. yellowffff00 ... rgb(255,255,0)  
  5. snowfffafa ... rgb(255,250,250)  

Attention, si vous changez l'ordre APRÈS l'ouverture du curseur vous devez fermer le curseur et le réouvrir pour que le nouvel ordre soit pris en compte. C'est également valable si vous changez la direction du tri (szOrderDir, ascending ou descending) :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                       // Charger le code de la classe
Line 003: $szColorFile = 'vaesoli/resources/XML/colors.xml';          // Spécifier le fichier de données
Line 004: $oCursor = new LSCursor( 'Couleurs',$szColorFile );         // Créer le curseur
Line 005: $oCursor->szOrderBy  = 'Hex';                               // Trié sur la couleur hexadécimale
Line 006: $oCursor->szOrderDir = 'descending';                        // Trié de manière descendante
Line 007: $oCursor->szFilter   = 'position()<=5';                     // 5 premiers enregistrements
Line 008: if ( $oCursor->Open() )                                     // Si le curseur a été ouvert correctement
Line 009: {
Line 010:     $oCursor->szOrderDir = 'ascending';                     // Trié de manière ascendante (changement)
Line 011:     $oCursor->Close();                                      // Fermer le curseur
Line 012:     $oCursor->Open();                                       // Le réouvrir pour que le nouveau tri soit actif
Line 013:     $oCursor->GoTop();                                      // Aller au premier enregistrement
Line 014:
Line 015:     echo "<ol>";                                            // Début d'une liste ordonnée
Line 016:     while( ! $oCursor->EOF() )                              // Tant que pas fin du curseur (EOF = End Of File)
Line 017:     {
Line 018:         $szID   = $oCursor->Field( '@id' );                 // Extraction de l'id
Line 019:         $szHex  = $oCursor->Field( 'Hex' );                 // Extraction de la valeur hexadécimale
Line 020:         $szRGB  = $oCursor->Field( 'RGB' );                 // Extraction de la valeur RGB
Line 021:
Line 022:         // Composons une ligne avec les valeurs extraites et un
Line 023:         // peu de layout...
Line 024:         echo "<li><span style=\"display:inline-block;width:200px;\">{$szID}</span>";
Line 025:         echo "<span style=\"display:inline-block;width:250px;\">{$szHex} ... {$szRGB}</span> ";
Line 026:         echo "<span style=\"background:{$szRGB};display:inline-block;width:100px;\">&#160;</span></li>\n";
Line 027:
Line 028:         $oCursor->Skip();                                   // Aller à l'enregistrement suivant
Line 029:     }
Line 030:     echo "</ol>";                                           // Fin de la liste ordonnée
Line 031:
Line 032:     $oCursor->Close();                                      // Fermer le curseur
Line 033: }
Line 034: ?>

 

  1. black000000 ... rgb(0,0,0)  
  2. navy000080 ... rgb(0,0,128)  
  3. darkblue00008b ... rgb(0,0,139)  
  4. mediumblue0000cd ... rgb(0,0,205)  
  5. blue0000ff ... rgb(0,0,255)  

À ce stade (20/11/2010), quand le curseur est sauvé, il est sauvé dans l'ordre de son tri. Cela peut évidemment avoir des conséquences sur l'ordre physique dans lequel les enregistrements sont sauvés dans le fichier de données. L'équipe de Vae Soli! travaille sur une autre méthode de tri qui serait un SetOrder() avec le maintien d'index différents qui pourraient être activés sans modifier l'ordre physique des enregistrements.

Chercher un enregistrement qui correspond à un critère donné

Pour l'exemple, recherchons les valeurs RGB et Hex de la couleur 'blueviolet'. Pour ce faire, utilisons la méthode Seek() qui renvoie vrai si la valeur a été trouvée, faux autrement. :

line 001: <?php
line 002: require_once( "LSCursor.class.php" );
line 003: $oCursor = new LSCursor( "Couleurs","vaesoli/resources/XML/colors.xml" );
line 004:
line 005: if ( $oCursor->Open() )
line 006: {
line 007:     if ( $oCursor->Seek( '@id','blueviolet' ) )
line 008:     {
line 009:         $szRGB = $oCursor->Field( 'RGB' );
line 010:         $szHex = $oCursor->Field( 'Hex' );
line 011:         echo "<p>blueviolet: {$szRGB} ({$szHex})</p>\n";
line 012:     }
line 013:     $oCursor->Close();
line 014: }
line 015: ?>

Et cela donne :

blueviolet: rgb(138,43,226) (8a2be2)

Remplacer des données dans un curseur

Commençons par utiliser un nouveau curseur basé sur un nouveau fichier de données dont voici le contenu :

line 001: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
line 002: <Members xmlns:xi="http://www.w3.org/2001/XInclude"
line 003:         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
line 004: 	<Person>
line 005:         <ID><![CDATA[STF-000001]]></ID>
line 006:         <Name>
line 007:             <Firstname><![CDATA[Alain]]></Firstname>
line 008:             <Lastname><![CDATA[Duchêne]]></Lastname>
line 009:             <Middle><![CDATA[]]></Middle>
line 010:             <Initials><![CDATA[ADU]]></Initials>
line 011:         </Name>
line 012:         <Email><![CDATA[alain.duchene@zenzoiti.be]]></Email>
line 013:         <Status><![CDATA[internal]]></Status>
line 014:         <Gender><![CDATA[M]]></Gender>
line 015:         <Phones>
line 016:             <Tel><![CDATA[+32 2 461 42 53]]></Tel>
line 017:             <Tel><![CDATA[+32 2 461 42 55]]></Tel>
line 018:             <Mobile><![CDATA[+32 484 17 18 19]]></Mobile>
line 019:         </Phones>
line 020:     </Person>
line 021:
line 022:     <Person>
line 023:         <ID><![CDATA[STF-000002]]></ID>
line 024:         <Name>
line 025:             <Firstname><![CDATA[Kevin]]></Firstname>
line 026:             <Lastname><![CDATA[Malbrune]]></Lastname>
line 027:             <Middle><![CDATA[]]></Middle>
line 028:             <Initials><![CDATA[KMA]]></Initials>
line 029:         </Name>
line 030:         <Email><![CDATA[k.malbrune@popi.com]]></Email>
line 031:         <Status><![CDATA[external]]></Status>
line 032:         <Gender><![CDATA[M]]></Gender>
line 033:         <Phones>
line 034:             <Tel><![CDATA[+32 2 461 42 89]]></Tel>
line 035:             <Mobile><![CDATA[+32 488 75 68 92]]></Mobile>
line 036:         </Phones>
line 037:     </Person>
line 038: </Members>

 

  1. Alain Duchêne (STF-000001)
  2. Kevin Malbrune (STF-000002)

Il n'y a donc que deux membres contenus dans le fichier XML : toutes les affaires commencent de manière modeste!!!

Voyons comment les données ont été extraites :

line 001: <?php
line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
line 004: if ( $oCursor->Open() )                                                 // Si le curseur a été ouvert correctement
line 005: {
line 006:     $oCursor->GoTop();                                                  // Aller au premier enregistrement
line 007:
line 008:     echo "<ol>";                                                        // Début d'une liste non ordonnée
line 009:     while( !  $oCursor->EOF() )                                         // Tant que pas fin du curseur (EOF = End Of File)
line 010:     {
line 011:         $szID    = $oCursor->Field( 'ID' );                             // Extraction de l'id
line 012:         $szFName = utf8_decode( $oCursor->Field( 'Name/Firstname' ) );  // Extraction du prénom
line 013:         $szLName = utf8_decode( $oCursor->Field( 'Name/Lastname'  ) );  // Extraction du nom
line 014:         $szName  = trim( $szFName . ' ' . $szLName );                   // Prénom + Nom
line 015:
line 016:         echo "<li>{$szName}</li>\n";
line 017:
line 018:         $oCursor->Skip();                                               // Aller à l'enregistrement suivant
line 019:     }
line 020:     echo "</ol>";                                                       // Fin de la liste non ordonnée
line 021:
line 022:     $oCursor->Close();                                                  // Fermer le curseur
line 023: }
line 024: ?>

Que constatez-vous ? La première chose à observer est qu'il est possible d'extraire des champs qui sont constitués de sous-tags. C'est ce qui se passe avec $oCursor->Field( 'Name/Firstname' ) ) par exemple. La seconde est que lorsque vous extrayez des données qui sont susceptibles de contenir des caractères accentués, il faut faire appel à la fonction utf8_decode().

Imaginons à présent que nous ayons fait écorché le nom d'Alain Duchêne qui devrait plutôt être écrit "Alain Duchesnes". Il nous faut remplacer le nom dans le fichier de données. Comment faire ? D'abord, il nous faut rechercher l'enregistrement approprié ce que le code ci-dessous nous permet de réaliser :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )
Line 005: {
Line 006:     if ( $oCursor->Seek( 'Name/Lastname','Duchêne' ) )                  // Cherchons l'enregistrement à modifier
Line 007:     {
Line 008:         $szID    = $oCursor->Field( 'ID' );                             // Extraction de l'id
Line 009:         $szFName = utf8_decode( $oCursor->Field( 'Name/Firstname' ) );  // Extraction du prénom
Line 010:         $szLName = utf8_decode( $oCursor->Field( 'Name/Lastname'  ) );  // Extraction du nom
Line 011:         $szName  = trim( $szFName . ' ' . $szLName );                   // Prénom + Nom
Line 012:
Line 013:         echo "<p>Nous avons trouvé la valeur recherchée: <strong>{$szName}</strong> ({$szID})</p>\n";
Line 014:     }
Line 015:     else
Line 016:     {
Line 017:         echo "Pas trouvé";
Line 018:     }
Line 019:     $oCursor->Close();
Line 020: }
Line 021: ?>

Maintenant que le bon enregistrement a été localisé, voyons comment remplacer la valeur erronée :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )
Line 005: {
Line 006:     if ( $oCursor->Seek( 'Name/Lastname','Duchêne' ) )                  // Cherchons l'enregistrement à remplacer
Line 007:     {
Line 008:         if ( $oCursor->Replace( 'Name/Lastname','Duchesnes' ) )         // Remplaçons le champ 'Lastname'
Line 009:         {
Line 010:             echo "<p>Remplacement effectué par <strong>" .              // Faisons savoir que le remplacement a eu lieu
Line 011:                  $oCursor->Field( 'Name/Lastname' ) . "</strong>.</p>\n";
Line 012:         }
Line 013:         else
Line 014:         {
Line 015:             echo "<p>Le remplacement n'a pas eu lieu</p>\n";
Line 016:         }
Line 017:     }
Line 018:     else
Line 019:     {
Line 020:         echo "Enregistrement non trouvé";
Line 021:     }
Line 022:     $oCursor->Close();
Line 023: }
Line 024: ?>

Le remplacement a bel et bien eu lieu mais il nous reste encore à sauver les données pour que ce remplacement soit acté dans le fichier :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )
Line 005: {
Line 006:     if ( $oCursor->Seek( 'Name/Lastname','Duchêne' ) )                  // Cherchons l'enregistrement à remplacer
Line 007:     {
Line 008:         if ( $oCursor->Replace( 'Name/Lastname','Duchesnes' ) )         // Remplaçons le champ 'Lastname'
Line 009:         {
Line 010:             echo "<p>Remplacement effectué par <strong>" .              // Faisons savoir que le remplacement a eu lieu
Line 011:                  $oCursor->Field( 'Name/Lastname' ) . "</strong>.</p>\n";
Line 012:         }
Line 013:         else
Line 014:         {
Line 015:             echo "<p>Le remplacement n'a pas eu lieu</p>\n";
Line 016:         }
Line 017:
Line 018:         if ( $oCursor->Dirty() )                                        // Si des données sont en attente de sauvetage
Line 019:         {
Line 020:             $oCursor->Save();                                           // Sauver le curseur
Line 021:         }
Line 022:     }
Line 023:     else
Line 024:     {
Line 025:         echo "Enregistrement non trouvé";
Line 026:     }
Line 027:     $oCursor->Close();
Line 028: }
Line 029: ?>

Ajouter des données dans un curseur

Bien, maintenant que nous savons comment remplacer des données dans un curseur, voyons comment en ajouter ! Finalement, c'est assez simple car il suffit de faire appel à la méthode Append() (alias Insert()) qui ajoute un enregistrement dans le fichier et ensuite faire appel à la méthode Replace() (alias Update()) pour remplacer les champs. Voyons cela dans le détail.

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )                                                 // Si le curseur a pu être ouvert
Line 005: {
Line 006:     if ( $oCursor->Append() )                                           // Ajoutons un enregistrement
Line 007:     {
Line 008:         echo "<p>L'enregistrement a été ajouté</p>";
Line 009:     }
Line 010:     else
Line 011:     {
Line 012:         echo "<p>Les enregistrements n'ont pas pu être ajoutés</p>";
Line 013:     }
Line 014:     $oCursor->Close();
Line 015: }
Line 016: ?>

Remplaçons les champs nécessaires :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )
Line 005: {
Line 006:     if ( $oCursor->Append() )                                           // Ajoutons un enregistrement
Line 007:     {
Line 008:         // Maintenant remplaçons les champs par de nouvelles valeurs
Line 009:         $oCursor->Replace( 'ID'             ,'STF-000003' );
Line 010:         $oCursor->Replace( 'Name/Firstname' ,'Jean' );
Line 011:         $oCursor->Replace( 'Name/Lastname'  ,'Dupuis' );
Line 012:         $oCursor->Replace( 'Name/Middle'    ,'' );
Line 013:         $oCursor->Replace( 'Name/Initials'  ,'JDU' );
Line 014:         $oCursor->Replace( 'Email'          ,'jean.dupuis@philozen.com' );
Line 015:         $oCursor->Replace( 'Status'         ,'external' );
Line 016:         $oCursor->Replace( 'Gender'         ,'M' );
Line 017:
Line 018:         if ( $oCursor->Dirty() )                                        // Si des données sont en attente
Line 019:         {
Line 020:             $oCursor->Save();                                           // Sauvons le fichier
Line 021:         }
Line 022:     }
Line 023:
Line 024:     $oCursor->Close();                                                  // Fermons le curseur
Line 025: }
Line 026: ?>

La ligne 006 nous a permis d'ajouter un enregistrement. Cette ligne a déplacé le pointeur d'enregistrement sur l'enregistrement fraîchement créé. Les lignes 008 à 017 permettent de remplacer les champs du nouvel enregistrement. Enfin, des lignes 018 à 021, nous sauvons le fichier.

Comme vous pourrez le constater dans l'échantillon que nous avons fourni, les données sont encodeés dans des sections CDATA. Pour faire en sorte que lesdites sections soient sauvées dans le fichier de données, il faut encore adapter légèrement notre code : à chaque appel de la méthode Replace(), il faudra passer un 3ème argument : true pour indiquer que vous souhaitez un CDATA. Considérez l'exemple ci-dessous :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )
Line 005: {
Line 006:     if ( $oCursor->Append() )                                           // Ajoutons un enregistrement
Line 007:     {
Line 008:         // Maintenant remplaçons les champs par de nouvelles valeurs
Line 009:         $oCursor->Replace( 'ID'             ,'STF-000003'               ,true );
Line 010:         $oCursor->Replace( 'Name/Firstname' ,'Jean'                     ,true );
Line 011:         $oCursor->Replace( 'Name/Lastname'  ,'Dupuis'                   ,true );
Line 012:         $oCursor->Replace( 'Name/Middle'    ,''                         ,true );
Line 013:         $oCursor->Replace( 'Name/Initials'  ,'JDU'                      ,true );
Line 014:         $oCursor->Replace( 'Email'          ,'jean.dupuis@philozen.com' ,true );
Line 015:         $oCursor->Replace( 'Status'         ,'external'                 ,true );
Line 016:         $oCursor->Replace( 'Gender'         ,'M'                        ,true );
Line 017:
Line 018:         if ( $oCursor->Dirty() )                                        // Si des données sont en attente
Line 019:         {
Line 020:             $oCursor->Save();                                           // Sauvons le fichier
Line 021:         }
Line 022:     }
Line 023:
Line 024:     $oCursor->Close();                                                  // Fermons le curseur
Line 025: }
Line 026: ?>

Soyez de la plus grande prudence avec la méthode Replace() car en effet, sur des fichiers XML, cette méthode crée les champs si ceux-ci n'existent pas. Cela peut s'avérer un grand avantage mais cela pourrait aussi nuire à la structure générale de votre fichier.

Mapper des champs

Un curseur XML est toujours verbeux : le nom des champs est répété d'enregistrement à enregistrement, certaines valeurs sont stockées dans des sections CDATA, etc. C'est le côté verbeux de ce genre de curseur qui donne aussi sa grande flexibilité.

Vae Soli! fournit au moins une facilité qui peut s'avérer très utile : le mapping de champ. Il s'agit simplement de pouvoir accéder un champ abrégé au départ d'un nom plus complet. Par exemple, vous avez un gros fichier de contacts où vous souhaiteriez benéficier des champs suivants : firstname, lastname, company et phone. Si vous avez 1000 enregistrements, rien que les noms des champs prendra 58000 bytes (l'ensemble des champs prend 58 bytes pour chaque record). On peut donc comprendre que raccourcir le nom des champs puisse donner un gain substantiel. Imaginez que chaque champ ne prenne que 2 bytes (4 au total pour compter le début et la du tag), on aura alors 4000 bytes au lieu de 58000 ! Intéressant ! La solution … c'est le mapping de champ.

$oCursor->Map( 'firstname','fi' );
$oCursor->Map( 'lastname' ,'la' );
$oCursor->Map( 'company'  ,'co' );
$oCursor->Map( 'phone'    ,'ph' );

Ensuite, votre code source peut rester lisible et vous pouvez utiliser les mappings comme dans l'exemple suivant :

$oCursor->Replace( 'firstname','Mon prénom' );
$oCursor->Replace( 'lastname' ,'Mon nom' );
$oCursor->Replace( 'company'  ,'Ma société' );
$oCursor->Replace( 'phone'    ,'+32 2 701 00 00' );

Sauver vos données

Bien que nous l'ayons vu à de multiples reprises dans les exemples qui ont été fournis, il ne suffit pas de remplacer vos données ou de les ajouter … il faut encore s'assurer de sauver le fichier pour que vos données soient prises en compte.

Pour ce faire il nous faudra utiliser la méthode Save() du curseur. Répétons simplement le code précédent et mettons cela en lumière de manière précise :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )
Line 005: {
Line 006:     if ( $oCursor->Append() )                                           // Ajoutons un enregistrement
Line 007:     {
Line 008:         // Maintenant remplaçons les champs par de nouvelles valeurs
Line 009:         $oCursor->Replace( 'ID'             ,'STF-000003'               ,true );
Line 010:         $oCursor->Replace( 'Name/Firstname' ,'Jean'                     ,true );
Line 011:         $oCursor->Replace( 'Name/Lastname'  ,'Dupuis'                   ,true );
Line 012:         $oCursor->Replace( 'Name/Middle'    ,''                         ,true );
Line 013:         $oCursor->Replace( 'Name/Initials'  ,'JDU'                      ,true );
Line 014:         $oCursor->Replace( 'Email'          ,'jean.dupuis@philozen.com' ,true );
Line 015:         $oCursor->Replace( 'Status'         ,'external'                 ,true );
Line 016:         $oCursor->Replace( 'Gender'         ,'M'                        ,true );
Line 017:
Line 018:         if ( $oCursor->Dirty() )                                        // Si des données sont en attente
Line 019:         {
Line 020:             $oCursor->Save();                                           // Sauvons le fichier
Line 021:         }
Line 022:     }
Line 023:
Line 024:     $oCursor->Close();                                                  // Fermons le curseur
Line 025: }
Line 026: ?>

Comme ce code nous l'apprend, nous testons si le curseur contient des changements qui n'ont pas encore été sauvés. C'est le sens de la la ligne 018. Si la méthode Dirty() nous renvoit true alors c'est que des données devraient être sauvées. C'est alors que nous exécutons la méthode Save() (ligne 020).

Notez au passage que la méthode Save() peut prendre un argument qui est le nom du fichier dans lequel les données peuvent être sauvées. Sans cet argument, c'est le fichier physique original du curseur qui est sauvé.

Un mot encore sur la méthode Save() : elle renvoit une valeur logique pour vous informer de ce que le sauvetage s'est bien déroulé ou non. A la lumière de ce qui vient d'être dit nous pouvosn dès lors transformer le code précédent en :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )
Line 005: {
Line 006:     if ( $oCursor->Append() )                                           // Ajoutons un enregistrement
Line 007:     {
Line 008:         // Maintenant remplaçons les champs par de nouvelles valeurs
Line 009:         $oCursor->Replace( 'ID'             ,'STF-000003'               ,true );
Line 010:         $oCursor->Replace( 'Name/Firstname' ,'Jean'                     ,true );
Line 011:         $oCursor->Replace( 'Name/Lastname'  ,'Dupuis'                   ,true );
Line 012:         $oCursor->Replace( 'Name/Middle'    ,''                         ,true );
Line 013:         $oCursor->Replace( 'Name/Initials'  ,'JDU'                      ,true );
Line 014:         $oCursor->Replace( 'Email'          ,'jean.dupuis@philozen.com' ,true );
Line 015:         $oCursor->Replace( 'Status'         ,'external'                 ,true );
Line 016:         $oCursor->Replace( 'Gender'         ,'M'                        ,true );
Line 017:
Line 018:         if ( $oCursor->Dirty() )                                        // Si des données sont en attente
Line 019:         {
Line 020:             if ( ! $oCursor->Save() )                                   // Sauvons le fichier
Line 021:             {
Line 022:                 echo "<p>Le fichier n'a pas pu être sauvé</p>";
Line 023:             }
Line 024:         }
Line 025:     }
Line 026:
Line 027:     $oCursor->Close();                                                  // Fermons le curseur
Line 028: }
Line 026: ?>

Créer un curseur dynamiquement (programmatiquement)

Bien entendu, vous pouvez composer vos fichiers de données à la main. C'est d'ailleurs ce qu'on fait régulièrement chez Vae Soli!. Ceci dit, vous pouvez aussi les créer programmatiquement en faisant appel à la méthode Create(). Pour l'instant, cette fonctionnalité n'est disponible qu'avec des fichiers XML.

Imaginons que nous souhaitions créer un fichier de statistiques. Les statistiques en questions vont rassembler, par date, 3 compteurs : le nombre d'alertes rouges, d'alertes jaunes, d'alertes vertes (vertes A et vertes B).

Line 001: <?php
Line 002: $szFile  = 'statistics.xml';                                            // Fichier XML de données
Line 003: $oCursor = new LSCursor( 'Stats',$szFile );                             // Création d'un nouveau curseur
Line 004:
Line 005: if ( ! is_file( $szFile ) )                                             // Si le fichier XML n'existe pas
Line 006: {
Line 007:     $oCursor->Create( 'Statistics',$szFile );                           // Créer le fichier
Line 008: }
Line 009: else                                                                    // Sinon ...
Line 010: {
Line 011:     $oCursor->Open();                                                   // Ouvrir le curseur
Line 012: }
Line 013:
Line 014: if ( $oCursor->IsOpen() )                                               // Si le curseur a été ouvert avec succès
Line 015: {
Line 016:     $aData = array( array( "20100406",  0, 13,  1,  0 ),                // Créons les données à mettre dans le fichier
Line 017:                     array( "20100415",  0, 13,  1,  1 ),
Line 018:                     array( "20100504",  0, 13,  1,  1 ),
Line 019:                     array( "20100511",  0, 14, 15,  5 ),
Line 020:                     array( "20100514",  0,  6, 11,  2 ),
Line 021:                     array( "20100518",  0,  7, 11,  2 ),
Line 022:                     array( "20100525",  1,  7, 13,  3 ),
Line 023:                     array( "20100601",  1,  7, 13,  3 ),
Line 024:                     array( "20100616",  3,  7, 19,  4 ),
Line 025:                     array( "20100622",  3, 10, 23,  5 ),
Line 026:                     array( "20100629",  3, 20, 15,  6 ),
Line 027:                     array( "20100810",  8, 18, 11, 11 ),
Line 028:                     array( "20100817", 10, 20, 17, 10 ),
Line 029:                     array( "20100824",  9, 22, 10, 12 ),
Line 030:                     array( "20100831",  9, 24,  9, 13 ),
Line 031:                     array( "20100928", 19, 37, 21, 30 ),
Line 032:                     array( "20101012", 26, 82, 20, 41 ),
Line 033:                     array( "20101021", 26,  0,119, 49 ),
Line 034:                     array( "20101026", 28,  1,116, 50 ),
Line 035:                     array( "20101102", 18, 12,126, 52 ),
Line 036:                     array( "20101109", 18,  0,138, 56 )
Line 037:                   );
Line 038:
Line 039:     uasort( $aData,"Compare" );                                         // Trions les données sur base de la date
Line 040:
Line 041:     foreach ( $aData as $aStat )                                        // Pour chaque donnée
Line 042:     {
Line 043:         if ( ! $oCursor->Seek( '@date',$aStat[0] ) )                    // Si donnée non trouvée dans le curseur
Line 044:         {
Line 045:             /* == [Ajouter un nouvel enregistrement] ==============================*/
Line 046:             $oCursor->Append( "Entry" );                                // Ajouter un noeud 'Entry'
Line 047:
Line 048:             $oCursor->Replace( "@active" ,"yes"            );           // Changer l'attribut 'active' du noeud
Line 049:             $oCursor->Replace( "@lupdate",date( "YmdHis" ) );           // Changer l'attribut 'lupdate' du noeud
Line 050:             $oCursor->Replace( "@date"   ,$aStat[0],true   );           // Changer l'attribut 'date' du noeud
Line 051:             $oCursor->Replace( "Red"     ,$aStat[1],true   );           // Changer le champ 'Red' du noeud
Line 052:             $oCursor->Replace( "Yellow"  ,$aStat[2],true   );           // Changer le champ 'Yellow' du noeud
Line 053:             $oCursor->Replace( "Green-A" ,$aStat[3],true   );           // Changer le champ 'Green-A' du noeud
Line 054:             $oCursor->Replace( "Green-B" ,$aStat[4],true   );           // Changer le champ 'Green-B' du noeud
Line 055:             /* == [Fin de l'ajout d'un nouvel enregistrement] =====================*/
Line 056:         }
Line 057:     }
Line 058:
Line 059:     if ( $oCursor->Dirty() )                                            // Si des données doivent être sauvées
Line 060:     {
Line 061:         $oCursor->Save();                                               // Sauver le curseur
Line 062:     }
Line 063:
Line 064:     $oCursor->Close();                                                  // Fermer le curseur quand on n'en a plus besoin
Line 065: }
Line 066:
Line 067: function Compare( $a,$b )
Line 068: /*---------------------*/
Line 069: {
Line 070:     if ( $a[0] == $b[0] )                                               // Comparons les dates
Line 071:     {
Line 072:         return ( 0 );                                                   // Si deux dates identiques
Line 073:     }
Line 074:
Line 075:     return ( ( $a[0] < $b[0] ) ? -1 : 1 );
Line 076: }
Line 077: ?>

C'est à la ligne 007 que tout se passe pour la création du curseur. Cette ligne permet de créer un fichier de données en XML et de lui attribuer le tag Statistics comme élément principal (le tag dans lequel tous les autres sont contenus).

Des lignes 016 à 037, nous créons un tableau de valeurs à sauver dans le nouveau curseur.

À la ligne 039, nous trions les données sur base de la date. Pour réaliser le tri, nous faisons appel à une fonction que nous avons définie nous-mêmes. Celle-ci se trouve aux lignes 067 à 076.

Des lignes 041 à 057, nous parcourons le tableaux de données. Si la donnée se trouvant dans le tableau n'est pas déjà trouvée dans le curseur, nous l'ajoutons. Nous nous basons pour ce faire sur la date de la statistique, date stockée dans l'attribut date (@date).

Entre les lignes 059 et 062, nous cherchons à savoir si des données sont en attente de sauvetage. Si c'est le cas, nous sauvons le curseur (ligne 061).

À la ligne 064, pour toute sécurité, nous fermons le curseur.

Et voilà … le curseur est créé … et le fichier sauvé. Maintenant, nous allons parcourir le curseur et afficher les valeurs. Nous allons faire cela grâce à la transformation d'un curseur en une simple grille :

Transformer un curseur en une grille

Une des fonctionnalités les plus utiles est de pouvoir afficher un curseur sous forme de table (<table>...</table>). Voyons comment faire.

Line 001: <?php
Line 002: require_once( 'LSInput.class.php' );
Line 003: $grdStats                   = new LSInput( 'grid','grdStats','grdStats' );
Line 004: $grdStats->szRecordSource   = 'statistics.xml';
Line 005: $grdStats->szOrderBy        = '@date';
Line 006: $grdStats->szClass          = 'stats';
Line 007: $grdStats->szCaption        = 'Statistiques';
Line 008:
Line 009: $grdStats->AddColumn( new LSColumn( '@date'     ,'Date'     ,'DateToFrench' ) );
Line 010: $grdStats->AddColumn( new LSColumn( 'Red'       ,'Rouges'   ) );
Line 011: $grdStats->AddColumn( new LSColumn( 'Yellow'    ,'Jaunes'   ) );
Line 012: $grdStats->AddColumn( new LSColumn( 'Green-A'   ,'Vertes A' ) );
Line 013: $grdStats->AddColumn( new LSColumn( 'Green-B'   ,'Vertes B' ) );
Line 014: $grdStats->AddColumn( new LSColumn( array( 'Green-A','Green-B' ),'Vertes<br />Somme','GreenSum' ) );
Line 015: $grdStats->AddColumn( new LSColumn( array( 'Red','Yellow','Green-A','Green-B' ),'Total','AllSum' ) );
Line 016:
Line 017: echo $grdStats;
Line 018:
Line 019: function DateToFrench( $x )
Line 020: /*----------------------*/
Line 021: {
Line 022:     return ( date( 'd-m-Y',mktime( 0,0,0,(int) substr( $x,4,2 ),
Line 023:                                          (int) substr( $x,6,2 ),
Line 024:                                          (int) substr( $x,0,4 ) ) ) );
Line 025: }
Line 026:
Line 027: function GreenSum( $aGreens )
Line 028: /*-------------------------*/
Line 029: {
Line 030:     return ( $aGreens[0] + $aGreens[1] );
Line 031: }
Line 032:
Line 033: function AllSum( $aAlerts )
Line 034: /*-------------------------*/
Line 035: {
Line 036:     return ( array_sum( $aAlerts ) );
Line 037: }
Line 038: ?>

À la ligne 002, on indique qu'on a besoin de la classe LSInput. On crée un objet LSInput de type 'grid' à la ligne 003. À la ligne 004, on donne le nom du fichier 'curseur' que nous souhaitons afficher dans la grille. On indique également (ligne 005) sur quel champ le curseur doit être trié.

Les lignes 006 et 007 permettent de définir un certain layout. On donne une classe CSS (ligne 006) et on spécifie le titre de la grille (ligne 007).

Ensuite, des lignes 009 à 015, on crée les colonnes de la grille, les colonnes du tableau en quelque sorte. On crée 7 colonnes. Des lignes 010 à 013, on ne fait qu'indiquer quel champ du curseur il faut prendre en considération et quel titre donner à la colonne.

Ce qui est un peu plus compliqué, ce sont les lignes 009, 014 et 015 car ce sont des colonnes calculées. Ce sont des fonctions de 'callback' qui vont nous fournir les données à afficher.

À la ligne 010, on voit qu'on fait appel à la fonction DateToFrench. Cette fonction reçoit un champ formaté en YYYYMMDD (e.g. 20100405) et présente cette information sous la forme d'une belle date. À la ligne 014, on fait appel à la fonction GreenSum qui calcule le total du champ Green-A et Green-B. La ligne 015, quant à elle, permet de calculer le nombre total d'alertes : Red + Yellow + Green-A + Green-B.

Et cela nous donne la table suivante :

Attention, les valeurs par défaut de l'array ne semblent pas bien sauvées dans le curseur que l'on crée s'il n'existe pas!!! C'EST UN BUG!!!

Statistiques
Date Rouges Jaunes Vertes A Vertes B Vertes
Somme
Total
06-04-2010 0 0 0
15-04-2010 0 0 0
04-05-2010 0 0 0
11-05-2010 0 0 0
14-05-2010 0 0 0
18-05-2010 0 0 0
25-05-2010 1 0 1
01-06-2010 1 0 1
16-06-2010 3 0 3
22-06-2010 3 0 3
29-06-2010 3 0 3
10-08-2010 8 0 8
17-08-2010 10 0 10
24-08-2010 9 0 9
31-08-2010 9 0 9
07-09-2010 16 0 16
14-09-2010 17 0 17
21-09-2010 15 0 15
28-09-2010 19 0 19
12-10-2010 26 0 26
21-10-2010 26 0 26
26-10-2010 28 0 28
02-11-2010 18 0 18
09-11-2010 18 0 18
16-11-2010 11 1 143 57 200 212
23-11-2010 12 0 12
30-11-2010 13 0 13
07-12-2010 17 0 17
14-12-2010 18 0 18
21-12-2010 13 0 13
04-01-2011 27 0 27

Pour que cette grille/table se présente de belle façon, nous avons conçu des définitions CSS. C'est d'ailleurs la raison pour laquelle nous avons affublé notre grille de la classe stats à la ligne 006.

Somme et moyenne

Si vous souhaitez connaître la somme des valeurs contenues dans un curseur, vous pouvez vous fier à la méthode Sum(). Voyez par exemple comment on peut calculer la somme des alertes vertes A contenues dans le curseur que nous avons créé tout à l'heure.

Line 001: <?php
Line 002: $szFile  = 'statistics.xml';                                            // Fichier XML de données
Line 003: $oCursor = new LSCursor( 'Stats',$szFile );                             // Création d'un nouveau curseur
Line 004:
Line 005: if ( $oCursor->Open() )                                                 // Ouvrir le curseur
Line 006: {
Line 007:     $iSum = $oCursor->Sum( 'Green-A' );                                 // Somme des valeurs contenues dans ce champ
Line 008:     $iAvg = $oCursor->Average( 'Green-A' );                             // Moyenne des valeurs contenues dans ce champ
Line 009:
Line 010:     echo "<p>Nous avons eu <strong>{$iSum}</strong> alertes A, soit une moyenne de <strong>{$iAvg}</strong>.</p>\n";
Line 011:     $oCursor->Close();                                                  // Fermer le curseur
Line 012: }
Line 013: ?>

 

Nous avons eu 143 alertes A, soit une moyenne de 4.6129032258065.

Minimum et maximum

Trouver le maximum de la valeur d'un champ (pensez en termes d'attribut ou de tag lorsque vous fonctionnez avec des fichiers XML) est d'une grande utilité. Pensez simplement à la fonctionnalité qui consiste à incrémenter une clef unique, un ID par exemple.

Line 001: <?php
Line 002: $szFile  = 'statistics.xml';                                            // Fichier XML de données
Line 003: $oCursor = new LSCursor( 'Stats',$szFile );                             // Création d'un nouveau curseur
Line 004:
Line 005: if ( $oCursor->Open() )                                                 // Ouvrir le curseur
Line 006: {
Line 007:     $iMax = (int) $oCursor->Max( 'Red' );                               // Valeur maximale
Line 008:     $iMin = (int) $oCursor->Min( 'Red' );                               // Valeur minimale
Line 009:
Line 010:     echo "<p>Le nombre maximal d'alertes rouges est <strong>{$iMax}</strong>; " .
Line 011:          "Le nombre minimal d'alertes rouges est <strong>{$iMin}</strong>.</p>\n";
Line 012:
Line 013:     $iMax = (int) $oCursor->Max( 'Green-A' );                           // Valeur maximale
Line 014:     $iMin = (int) $oCursor->Min( 'Green-A' );                           // Valeur minimale
Line 015:
Line 016:     echo "<p>Le nombre maximal d'alertes Vertes A est <strong>{$iMax}</strong>; " .
Line 017:          "Le nombre minimal d'alertes Vertes A est <strong>{$iMin}</strong>.</p>\n";
Line 018:
Line 019:     $oCursor->Close();                                                  // Fermer le curseur
Line 020: }
Line 021: ?>

 

Le nombre maximal d'alertes rouges est 28; Le nombre minimal d'alertes rouges est 0.

Le nombre maximal d'alertes Vertes A est 143; Le nombre minimal d'alertes Vertes A est 0.

Déterminer les champs d'un curseur

Il s'agit de déterminer la liste des champs existants d'un record spécifique. Si tous les enregistrements ont exactement la même structure, le resultat sera évidemment identique pour chacun d'entre eux. Dans le cas de fchiers de données en XML, les enregistrements pourraient avoir des structures différentes. Voyons le cas suivant :

line 001: <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
line 002: <Members xmlns:xi="http://www.w3.org/2001/XInclude"
line 003:         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
line 004: 	<Person>
line 005:         <ID><![CDATA[STF-000001]]></ID>
line 006:         <Name>
line 007:             <Firstname><![CDATA[Alain]]></Firstname>
line 008:             <Lastname><![CDATA[Duchêne]]></Lastname>
line 009:             <Middle><![CDATA[]]></Middle>
line 010:             <Initials><![CDATA[ADU]]></Initials>
line 011:         </Name>
line 012:         <Email><![CDATA[alain.duchene@zenzoiti.be]]></Email>
line 013:         <Status><![CDATA[internal]]></Status>
line 014:         <Gender><![CDATA[M]]></Gender>
line 015:         <Phones>
line 016:             <Tel><![CDATA[+32 2 461 42 53]]></Tel>
line 017:             <Tel><![CDATA[+32 2 461 42 55]]></Tel>
line 018:             <Mobile><![CDATA[+32 484 17 18 19]]></Mobile>
line 019:         </Phones>
line 020:     </Person>
line 021:
line 022:     <Person>
line 023:         <ID><![CDATA[STF-000002]]></ID>
line 024:         <Name>
line 025:             <Firstname><![CDATA[Kevin]]></Firstname>
line 026:             <Lastname><![CDATA[Malbrune]]></Lastname>
line 027:             <Middle><![CDATA[]]></Middle>
line 028:             <Initials><![CDATA[KMA]]></Initials>
line 029:         </Name>
line 030:         <Email><![CDATA[k.malbrune@popi.com]]></Email>
line 031:         <Status><![CDATA[external]]></Status>
line 032:         <Gender><![CDATA[M]]></Gender>
line 033:         <Phones>
line 034:             <Tel><![CDATA[+32 2 461 42 89]]></Tel>
line 035:             <Mobile><![CDATA[+32 488 75 68 92]]></Mobile>
line 036:         </Phones>
line 037:     </Person>
line 038: </Members>

Vous aurez remarqué que chaque enregistrement possède exactement la même structure. Dès lors, déterminer les champs du premier enregistrement ou du deuxième revient à la même chose. C'est donc ce que nous allons faire avec la méthode aFields() qui retourne un tableau avec tous les champs disponibles.

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )                                                 // Si le curseur a été ouvert correctement
Line 005: {
Line 006:     $oCursor->GoTop();                                                  // Aller au premier enregistrement
Line 007:     $aFields = $oCursor->aFields();                                     // Déterminer les champs
Line 008:
Line 009:     if ( count( $aFields > 0 ) )                                        // Si on a trouvé des champs
Line 010:     {
Line 011:         echo "<ol>";                                                    // Commencer une liste ordonnée
Line 012:         foreach ( $aFields as $szField )                                // Pour chaque champ trouvé
Line 013:         {
Line 014:             echo "<li>{$szField}</li>";                                 // Indiquer le champ trouvé
Line 015:         }
Line 016:         echo "</ol>";                                                   // Terminer la liste ordonnée
Line 017:     }
Line 018:     else                                                                // Si on n'a pas trouvé de champ
Line 019:     {
Line 020:         echo "<p>La structure du curseur n'a pas pu être déterminée.</p>\n";
Line 021:     }
Line 022:
Line 023:     $oCursor->Close();                                                  // Fermer le curseur
Line 024: }
Line 025: ?>

… ce qui donne :

  1. ID
  2. Name/Firstname
  3. Name/Lastname
  4. Name/Middle
  5. Name/Initials
  6. Email
  7. Status
  8. Gender
  9. Phones/Tel
  10. Phones/Mobile

Créer un formulaire automatique pour un curseur

Grâce à la possibilité de déterminer les champs disponibles dans un enregistrement d'un curseur, il est aussi possible de créer des formulaires automatiques. C'est une fonctionnalité extrêmement puissante car elle permet, à moindres frais, de créer des mises à jour quasi automatisées des données. Vous devrez certainement enjoliver la présentation, l'adapter à vos besoins, mais le code générique du formulaire est néanmoins réalisé :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );     // Créer l'objet curseur
Line 004: if ( $oCursor->Open() )                                 // Si le curseur a été ouvert correctement
Line 005: {
Line 006:     $oCursor->GoTop();                                  // Aller au premier enregistrement
Line 007:     $szForm = $oCursor->ToForm();                       // Créer un formulaire standard
Line 008:
Line 009:     if ( ! is_null( $szForm ) && is_string( $szForm ) ) // Si on a bien un formulaire
Line 010:     {
Line 011:         echo $szForm;
Line 012:     }
Line 013:     else                                                // Si on n'a pas trouvé de champ
Line 014:     {
Line 015:         echo "<p>Nous n'avons pas pu créer de formulaire.</p>\n";
Line 016:     }
Line 017:
Line 018:     $oCursor->Close();                                  // Fermer le curseur
Line 019: }
Line 020: ?>

Ce qui nous donne le résultat qui suit :

[ Automatic form ]

Brrrrr! À ce stade, vous obtiendrez bien un formulaire quoique ce dernier vous semblera si peu avenant que vous déciderez peut-être de vous en passer. Mais dès lors, pourquoi ne pas mettre un peu d'ordre vous-même comme vous le propose l'exemple suivant :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );               // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' ); // Créer le curseur
Line 004: if ( $oCursor->Open() )                             // Si le curseur a été ouvert correctement
Line 005: {
Line 006:     $oCursor->GoTop();                              // Aller au premier enregistrement
Line 007:     // Créer un formulaire avec data + 2 classes CSS
Line 008:     $oForm = $oCursor->ToForm( null,true,'myLabel','myText','object' );
Line 009:     if ( $oForm instanceof LSForm )                 // Si on a bien un formulaire
Line 010:     {
Line 011:         /* On donne un style aux étiquettes */
Line 012:         $oForm->SetAll( 'label'  ,'szStyle','display:inline-block;width:100px;' );
Line 013:         /* On donne un style aux zones de saisie */
Line 014:         $oForm->SetAll( 'textbox','szStyle','width:150px;' );
Line 015:         /* On passe à la ligne après chaque zone de saisie */
Line 016:         $oForm->SetAll( 'textbox','szTrailer','<br />' );
Line 017:         /* On ajoute un bouton submit (valeur = 'Send'; légende = 'Envoyer') */
Line 018:         $oForm->AddObject( new LSInput( 'submit',null,'cmdSubmit',array( 'Send','Envoyer' ) ) );
Line 019:         echo $oForm;
Line 020:     }
Line 021:     else                                            // Si on n'a pas trouvé de champ
Line 022:     {
Line 023:         echo "<p>Nous n'avons pas pu créer de formulaire.</p>\n";
Line 024:     }
Line 025:
Line 026:     $oCursor->Close();                              // Fermer le curseur
Line 027: }
Line 028: ?>

Remarquez les lignes 008 et 009 où nous demandons cette fois, de manière très explicite, qu'un OBJET soit généré et retourné par la méthode ToForm(). Grâce à cette utilisation, il nous est encore possible de modifier le formulaire dans la foulée.

[ Automatic form ]









Le résultat est, vous en conviendrez, beaucoup plus engageant, et ce, avec un minimum d'efforts.

Extraire des champs d'un record distant

Nous allons vous montrer comment atteindre un enregistrement distant grâce à la méthode Field(), c'est-à-dire un enregistrement qui se trouve avant ou après l'enregistrement courant. Qui plus est, nous allons également vous montrer comment faire appel à une fonction de callback pour formater la valeur renvoyée. Prêt ?

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: if ( $oCursor->Open() )                                                 // Si le curseur a été ouvert correctement
Line 005: {
Line 006:     $oCursor->Go( 2 );                                                  // Aller au 2ème enregistrement
Line 007:
Line 008:     echo "<p>" . utf8_decode( $oCursor->Field( 'Name/Lastname'               ) ) . "</p>\n";
Line 009:     echo "<p>" . utf8_decode( $oCursor->Field( 'Name/Lastname',null     ,-1  ) ) . "</p>\n";
Line 010:     echo "<p>" . utf8_decode( $oCursor->Field( 'Name/Lastname','myupper'     ) ) . "</p>\n";
Line 011:     echo "<p>" . utf8_decode( $oCursor->Field( 'Name/Lastname','myupper',-1  ) ) . "</p>\n";
Line 012:
Line 013:     $oCursor->Close();                                                  // Fermer le curseur
Line 014: }
Line 015:
Line 016: function myupper( $szStr,$cursor )
Line 017: /*------------------------------*/
Line 018: {
Line 019:     return ( strtoupper( $szStr ) );
Line 020: }
Line 021: ?>

dont voici le résultat :

Malbrune

Duchêne

MALBRUNE

DUCHêNE

Expliquons un peu ce qui se passe dans ce code qui pourrait sembler bizarre.

Dès la ligne 006, nous allons au deuxième enregistrement du curseur dont nous avons donné un aperçu ci-avant. Le premier enregistrement est "Alain Duchêne" tandis que le second est "Kevin Malbrune". Dès lors, en positionnant le pointeur sur le deuxième enregistrement, de facto, nous le positionnons sur "Kevin Malbrune". C'est la raison pour laquelle la ligne 008 provoque l'affichage de "Malbrune".

La ligne 009 est plus bizarre car effectivement la méthode Field() prend deux arguments supplémentaires, des arguments auxquels nous n'étions pas habitués. null est passé comme deuxième argument pour indiquer qu'on ne souhaite pas intercepter la valeur de retour du champ pour la formater à notre guise (pas de callback). -1 indique qu'on souhaite reculer d'un enregistrement … et donc pointer sur "Alain Duchêne". Et de fait, on affiche bel et bien le nom "Duchêne".

Les lignes 010 et 011 vous montrent comment appliquer une callback sur le retour de la méthode Field(). Rappelez-vous que vous devez spécifier une de vos propres fonctions car la méthode Field() du curseur envoie et la donnée et le curseur. L'utilisation de callback est d'ailleurs particulièrement intéressante lorsque des tableaux sont passés à la méthode Field() comme cela peut être le cas lorsqu'on travaille avec des grilles (LSInput de type grid).

Les événements sur un curseur

Certaines méthodes de la classe LSCursor génèrent des événements que vous pouvez intercepter. Voyons d'abord un petit exemple simplissime, sans aucun événement  :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: $oCursor->szOrderBy     = 'Name/Lastname';                              // Tri sur le nom
Line 005: $oCursor->szOrderDir    = 'descending';                                 // Tri descendant
Line 006: if ( $oCursor->Open() )                                                 // Si le curseur a été ouvert correctement
Line 007: {
Line 008:     echo "<ol>";                                                        // Début d'une liste ordonnée
Line 009:     while ( ! $oCursor->EOF() )                                         // Tant que pas fin de curseur
Line 010:     {
Line 011:         $szName = utf8_decode(
Line 012:                     trim( $oCursor->Field( 'Name/Firstname' ) . ' ' .   // Former le nom complet
Line 013:                           $oCursor->Field( 'Name/Lastname' ) ) );
Line 014:         echo "<li>{$szName}</li>";                                      // Afficher prénom et nom
Line 015:         $oCursor->Skip();                                               // Aller au prochain enregistrement
Line 016:     }   /* while ( ! $oCursor->EOF() ) */
Line 017:     echo "</ol>";                                                       // Fin d'une liste ordonnée
Line 018:     $oCursor->Close();                                                  // Fermer le curseur
Line 019: }
Line 020: ?>

Et cela donne :

  1. Kevin Malbrune
  2. Jean Dupuis
  3. Alain Duchêne

Voyons quasiment le même exemple mais cette fois enregistrons deux événements et créons les fonctions associées :

Line 001: <?php
Line 002: require_once( 'LSCursor.class.php' );                                   // Charger le code de la classe
Line 003: $oCursor = new LSCursor( 'Membres','members.xml' );                     // Créer le curseur
Line 004: $oCursor->szOrderBy     = 'Name/Lastname';                              // Tri sur le nom
Line 005: $oCursor->szOrderDir    = 'descending';                                 // Tri descendant
Line 006:
Line 007: $oCursor->RegisterEvent( 'open' ,'myEventHandler' );                    // Enregistrer l'événement "open"
Line 008: $oCursor->RegisterEvent( 'close','myEventHandler' );                    // Enregistrer l'événement "close"
Line 009:
Line 010: if ( $oCursor->Open() )                                                 // Si le curseur a été ouvert correctement
Line 011: {
Line 012:     echo "<ol>";                                                        // Début d'une liste ordonnée
Line 013:     while ( ! $oCursor->EOF() )                                         // Tant que pas fin de curseur
Line 014:     {
Line 015:         $szName = utf8_decode(
Line 016:                     trim( $oCursor->Field( 'Name/Firstname' ) . ' ' .   // Former le nom complet
Line 017:                           $oCursor->Field( 'Name/Lastname' ) ) );
Line 018:         echo "<li>{$szName}</li>";                                      // Afficher prénom et nom
Line 019:         $oCursor->Skip();                                               // Aller au prochain enregistrement
Line 020:     }   /* while ( ! $oCursor->EOF() ) */
Line 021:     echo "</ol>";                                                       // Fin d'une liste ordonnée
Line 022:     $oCursor->Close();                                                  // Fermer le curseur
Line 023: }
Line 024: $oCursor->RegisterEvent( 'open'  );                                     // Dés-enregistrer l'événement "open"
Line 025: $oCursor->RegisterEvent( 'close' );                                     // Dés-enregistrer l'événement "close"
Line 026:
Line 027: function myEventHandler( $oCursor,$szEvent )
Line 028: /*----------------------------------------*/
Line 029: {
Line 030:     switch ( $szEvent )
Line 031:     {
Line 032:         case 'open'     :   echo "<p>On ouvre le curseur '{$oCursor->szName}'</p>\n";
Line 033:                             break;
Line 034:         case 'close'    :   echo "<p>On ferme le curseur '{$oCursor->szName}'</p>\n";
Line 035:                             break;
Line 036:     }
Line 037: }
Line 038: ?>

On ouvre le curseur 'Membres'

  1. Kevin Malbrune
  2. Jean Dupuis
  3. Alain Duchêne

On ferme le curseur 'Membres'

La liste d'événements suivante est gérée par Vae Soli! :

  • append
  • save
  • create
  • sort
  • open
  • replace
  • requery
  • close

La classe LSCursor s'enrichit de type SQLite3 2012-12-04

Depuis l'opus "5.0.0010"

Attention le type SQLite3 n'est pas encore complètement opérationnel dans la version 5.0.0010 de Vae Soli!. Ce qui suit sont des notes préliminaires.

Avec l'opus 5.0.0007, l'équipe de Vae Soli! a commencé à développer les interactions avec SQLite3 au sein de la classe curseur : LSCursor. L'objectif étant de faire en sorte que les interactions avec SQLite3 soient identiques [1] à celles qui sont définies pour interagir avec les fichiers XML.

Comparons dès lors, pas à pas, différentes fonctions et méthodes :

require_once( $_SERVER['DOCUMENT_ROOT'] . '/vaesoli/include/LSFiles.functions.php'  );
require_once( $_SERVER['DOCUMENT_ROOT'] . '/vaesoli/include/LSCursor.class.php'     );


$szFileSQL      = 'c:\\db\\uikey.db';
$szFileXML      = 'c:\\db\\uikey.xml';
$szFileSQLReal  = '';
$szFileXMLReal  = '';

$oCursorSQL = new LSCursor( 'uikey',$szFileSQL,DATA_SOURCE_TYPE_SQLITE3,'UIKeys' );  // A cursor in SQLite3
$oCursorXML = new LSCursor( 'uikey',$szFileXML,DATA_SOURCE_TYPE_XML    ,'UIKeys' );  // A cursor in XML

$iToAdd     = 10;

echo "<h2>Curseur de type SQLite3</h2>";

/****************************************************************************************/
/* SQLite3                                                                              */
/****************************************************************************************/
if ( ! FIL_Exists( $szFileSQL,null,$szFileSQLReal ) )
{
    echo "<p>Il faut créer {$szFileSQL}</p>";
    /* Avec une base de données SQL3 ... il faut mentionnet la table
       qu'il faut créer et la structure de cette table */
    if ( $oCursorSQL->Create( 'UIKeys',
                              array( 'ID'        => 'INTEGER',
                                     'KEY'       => 'TEXT'   ,
                                     'URL'       => 'BLOB'   ,
                                     'ACTIVE'    => 'INTEGER',
                                     'PARENTID'  => 'INTEGER',
                                     'DESC'      => 'BLOB'   ,
                                     'RECYCLE'   => 'INTEGER',
                                     'CAT'       => 'INTEGER',
                                     'UTC'       => 'INTEGER',
                                     'IP'        => 'TEXT'   ,
                                     'TTL'       => 'INTEGER',
                                     'OWNER'     => 'TEXT'   ,
                                     'EMAIL'     => 'TEXT'   ,
                                     'COUNTRY'   => 'TEXT'   ,
                                     'LANG'      => 'TEXT'   ,
                                     'PRIVATE'   => 'INTEGER',
                                     'PERMALINK' => 'INTEGER',
                                     'FCOUNT'    => 'INTEGER',
                                     'WCOUNT'    => 'INTEGER',
                                     'RCOUNT'    => 'INTEGER',
                                     'CCOUNT'    => 'INTEGER',
                                     'CONFIRMED' => 'INTEGER',
                                     'PWD'       => 'TEXT'   ,
                                     'LUPDATE'   => 'INTEGER',
                                     'IMG'       => 'BLOB'   ,
                                     'KEYWORDS'  => 'BLOB' ) ) )
    {
        echo "<p>{$szFileSQL} créée avec succès</p>";
    }   /* if ( $oCursorSQL->Create( 'UIKeys', ... */
    else   /* Else of ... if ( $oCursorSQL->Create( 'UIKeys', ... */
    {
        echo "<p>ERROR: {$szFileSQL} ne peut pas être créée</p>";
    }   /* End of ... Else of ... if ( $oCursorSQL->Create( 'UIKeys', ... */
}   /* if ( ! FIL_Exists( $szFileSQL,null,$szFileSQLReal ) ) */
else   /* Else of ... if ( ! FIL_Exists( $szFileSQL,null,$szFileSQLReal ) ) */
{
    echo "<p>{$szFileSQL} existe</p>";
}   /* End of ... Else of ... if ( ! FIL_Exists( $szFileSQL,null,$szFileSQLReal ) ) */

if ( ! $oCursorSQL->IsOpen() )
{
    echo "<p>{$szFileSQL} PAS ouvert</p>";
    echo "<p>{$szFileSQL} doit être ouvert avec la méthode Open()</p>";
    $oCursorSQL->Open();
}   /* if ( ! $oCursorSQL->IsOpen() ) */
else   /* Else of ... if ( ! $oCursorSQL->IsOpen() ) */
{
    echo "<p>{$szFileSQL} est ouvert</p>\n";
}    /* End of ... Else of ... if ( ! $oCursorSQL->IsOpen() ) */

if ( $oCursorSQL->IsOpen() )
{
    echo "<p>{$szFileSQL} est ouvert à présent.</p>";
    echo "<p>{$szFileSQL} possède " . $oCursorXML->Reccount() . " enregistrements.</p>";
    echo "<p>Ajoutons {$iToAdd} enregistrements !</p>\n";

    $fStart     = microtime( true);
    $bAtFault   = false;
    for ( $i = 1; $i <= $iToAdd;$i++ )
    {
        $bRetVal = $oCursorSQL->Insert( 'UIKeys',
                                        array( 'id'     => $i              ,
                                               'key'    => 'This is a key' ,
                                               'url'    => 'C\'est l\'été qui commence disait "Martial"',
                                               'active' => 1 ) );

        if ( ! $bRetVal )
        {
            break;
        }
    }   /* for ( $i = 1; $i <= 1000;$i++ ) */
    $fStop = microtime( true);

    if ( $bAtFault )                                                /* If at fault */
    {
        echo "<p>Nous avons rencontré l'erreur suivante: " . $oCursorSQL->LastErrorMsg() . "</p>";
        echo "<p>" .  ($i-1) . " enregistrements ajoutés en " . ( $fStop - $fStart ) . " sec</p>";
    }   /* if ( $bAtFault ) */
    else   /* Else of ... if ( $bAtFault ) */
    {
        echo "<p>" . ($i-1) . " enregistrements ajoutés en " . ( $fStop - $fStart ) . " sec</p>";
    }   /* End of ... Else of ... if ( $bAtFault ) */

    echo "<p>{$szFileSQL} possède à present " . $oCursorSQL->Reccount() . " enregistrements</p>";

    echo "<p>Ajoutons 3 enregistrements manuellement</p>\n";

    $oCursorSQL->Insert( 'UIKeys','key','une nouvelle clef' );
    $oCursorSQL->Insert( 'UIKeys','key','Le bel été du carême nous fait penser au "C\'est l\'été de Balzac"' );
    $oCursorSQL->Insert( 'UIKeys','id' ,78 );

    echo "<p>{$szFileSQL} possède à present " . $oCursorSQL->Reccount() . " enregistrements</p>";

    echo "<p>Maintenant, nous allons utiliser une instruction fautive: un champ qui n'existe pas</p>";

    if ( ! $oCursorSQL->Insert( 'UIKeys','id---','un nouvel ID' ) )
    {
        echo "<p>ERROR: " . $oCursorSQL->LastErrorMsg() . "</p>\n";
    }   /* if ( ! $oCursorSQL->Insert( 'UIKeys','id---','un nouvel ID' ) ) */

}   /* if ( $oCursorSQL->IsOpen() ) */

echo "<hr />";

/****************************************************************************************/
/* XML cursor                                                                           */
/****************************************************************************************/
echo "<h2>Curseur XML</h2>";

if ( ! FIL_Exists( $szFileXML,null,$szFileXMLReal ) )
{
    echo "<p>On doit créer {$szFileXML}</p>\n";
    /* Avec une base de données XML ... il ne faut mentionner QUE 
       l'élément racine. Mais si vous aviez utilisé la
       même notation que celle utilisée avec SQLite3 cela n'aurait
       eu aucune conséquence fâcheuse */
    if ( $oCursorXML->Create( 'UIKeys' ) )
    {
        echo "<p>{$szFileXML} successfully created</p>\n";
    }   /* if ( $oCursorXML->Create( 'UIKeys' ) ) */
    else   /* Else of ... if ( $oCursorXML->Create( 'UIKeys' ) ) */
    {
        echo "<p>ERROR: {$szFileXML} could NOT be created</p>\n";
    }   /* End of ... Else of ... if ( $oCursorXML->Create( 'UIKeys' ) )
}   /* if ( ! FIL_Exists( $szFileXML,null,$szFileXMLReal ) ) */
else   /* Else of ... if ( ! FIL_Exists( $szFileXML,null,$szFileXMLReal ) ) */
{
    echo "<p>{$szFileXML} existe</p>\n";
}   /* End of ... Else of ... if ( ! FIL_Exists( $szFileXML,null,$szFileXMLReal ) ) */

if ( ! $oCursorXML->IsOpen() )
{
    echo "<p>{$szFileXML} PAS ouvert</p>";
    echo "<p>{$szFileXML} doit être ouvert avec la méthode Open()</p>";
    $oCursorXML->Open();
}   /* if ( ! $oCursorXML->IsOpen() ) */
else   /* Else of ... if ( ! $oCursorXML->IsOpen() ) */
{
    echo "<p>{$szFileXML} est ouvert</p>";
}   /* End of ... Else of ... if ( ! $oCursorXML->IsOpen() ) */

if ( $oCursorXML->IsOpen() )
{
    echo "<p>{$szFileXML} est ouvert à présent.</p>";
    echo "<p>{$szFileXML} possède " . $oCursorXML->Reccount() . " enregistrements.</p>";
    echo "<p>Ajoutons {$iToAdd} enregistrements !</p>\n";

    $fStart     = microtime( true);
    $bAtFault   = false;
    for ( $i = 1; $i <= $iToAdd;$i++ )
    {
        $bRetVal = $oCursorXML->Insert( 'UIKeys',
                                        array( 'id'     => $i              ,
                                               'key'    => 'This is a key' ,
                                               'url'    => 'C\'est l\'été qui commence disait "Martial"',
                                               'active' => 1 ) );

        if ( ! $bRetVal )
        {
            break;
        }
    }   /* for ( $i = 1; $i <= 1000;$i++ ) */
    $fStop = microtime( true);

    if ( $bAtFault )                                                /* If at fault */
    {
        echo "<p>Nous avons rencontré l'erreur suivante: " . $oCursorSQL->LastErrorMsg() . "</p>";
        echo "<p>" .  ($i-1) . " enregistrements ajoutés en " . ( $fStop - $fStart ) . " sec</p>";
    }
    else
    {
        echo "<p>" . ($i-1) . " enregistrements ajoutés en " . ( $fStop - $fStart ) . " sec</p>";
    }

    echo "<p>{$szFileXML} possède à present " . $oCursorXML->Reccount() . " enregistrements</p>";

    echo "<p>Ajoutons 3 enregistrements manuellement</p>\n";

    $oCursorXML->Insert( 'UIKeys','key','une nouvelle clef' );
    $oCursorXML->Insert( 'UIKeys','key','Le bel été du carême nous fait penser au "C\'est l\'été de Balzac"' );
    $oCursorXML->Insert( 'UIKeys','id' ,78 );

    echo "<p>{$szFileSQL} possède à present " . $oCursorSQL->Reccount() . " enregistrements</p>";

    echo "<p>Maintenant, nous allons utiliser une instruction fautive: un champ qui n'existe pas</p>";

    // Ici, dans le cas présent un curseur XML ne renverrait pas d'erreur
    if ( ! $oCursorXML->Insert( 'UIKeys','id---','un nouvel ID' ) )
    {
        echo "<p>ERROR: " . $oCursorXML->LastErrorMsg() . "</p>\n";
    }   /* if ( ! $oCursorXML->Insert( 'UIKeys','id---','un nouvel ID' ) ) */


}

Notes de bas de page

[1] … ou extrêmement similaires

Précédent Suivant