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)

LSVaesoli : toute conscience commence par se rendre compte de sa propre existence 2013-04-01

Depuis l'opus "5.2.0000"

La classe LSVaesoli est maintenant une de ces classes dont l'objectif est de donner à Vae Soli! une conscience de lui-même, pour l'instant, au plus bas de l'échelle. Vraiment au plus bas ! Et voici comment faire dire à Vae Soli! ce qu'il est :

<?php
$oV = new LSVaesoli();
echo '<p>',$oV->Speak( 'who-am-i' ),'</p>';
?>

Hi, I am Vae Soli! (Web) 7.1.0000 - Date: 20181106103900 - Build : PMO - Release type : beta

Voici maintenant comment savoir de quoi se compose Vae Soli!:

<?php
$oV = new LSVaesoli();
echo '<p>',$oV->Speak( 'anatomy' ),'</p>';
?>

LSAction.class.php ,LSAddress.class.php ,LSAdministrativeArea.class.php ,LSAjax.class.php ,LSAjax.class.ls-file-explorer.php ,LSAjax.class.ls-site-manager.php ,LSAjax.class.ls-file-uploader.php ,LSAnalytics.class.php ,LSAnalytics2.class.php ,LSApplication.class.php ,LSArchipelago.class.php ,LSArray.class.php ,LSArticle.class.php ,LSAudience.class.php ,LSAssertion.class.php ,LSAutoReference.class.php ,LSBag.class.php ,LSBBCodes.class.php ,LSBooking.class.php ,LSBookingForm.class.php ,LSBrowser.class.php ,LSBuilder.class.php ,LSCache.class.php ,LSCalculator.class.php ,LSCalendar.class.php ,LSCalendar2.class.php ,LSCameraSnapshot.class.php ,LSCapsule.class.php ,LSCitations.class.php ,LSCode.class.php ,LSColor.class.php ,LSConstant.class.php ,LSConsciousness.class.php ,LSContactForm.class.php ,LSContainer.class.php ,LSContents.class.php ,LSContentsAccounts.class.php ,LSContentsAjax.class.php ,LSContentsArticles.class.php ,LSContentsBooking.class.php ,LSContentsBookmarks.class.php ,LSContentsBreadcrumb.class.php ,LSContentsBugs.class.php ,LSContentsBusinessCoordinates.class.php ,LSContentsBusinessOpeningHours.class.php ,LSContentsBusinessOff.class.php ,LSContentsCalculator.class.php ,LSContentsCalendar.class.php ,LSContentsCampaign.class.php ,LSContentsCarousel.class.php ,LSContentsCatalogue.class.php ,LSContentsCharter.class.php ,LSContentsCitation.class.php ,LSContentsComments.class.php ,LSContentsCookieUsage.class.php ,LSContentsCountdown.class.php ,LSContentsDatetime.class.php ,LSContentsDoc.class.php ,LSContentsEmail.class.php ,LSContentsEmpty.class.php ,LSContentsFontSizer.class.php ,LSContentsGeolocation.class.php ,LSContentsHeartbeat.class.php ,LSContentsIFrame.class.php ,LSContentsImageGallery.class.php ,LSContentsImageTransition.class.php ,LSContentsInvoiceOUT.class.php ,LSContentsJobs.class.php ,LSContentsLanguageSwitchers.class.php ,LSContentsLegal.class.php ,LSContentsLoginLogoff.class.php ,LSContentsMedia.class.php ,LSContentsMenu.class.php ,LSContentsMicroblogAdd.class.php ,LSContentsMicronews.class.php ,LSContentsMyAccount.class.php ,LSContentsPageframe.class.php ,LSContentsParadeigmas.class.php ,LSContentsPaymentOptions.class.php ,LSContentsPinboard.class.php ,LSContentsPoll.class.php ,LSContentsPortfolio.class.php ,LSContentsPromos.class.php ,LSContentsRatesReviews.class.php ,LSContentsRememberPassword.class.php ,LSContentsRestaurantBookingForm.class.php ,LSContentsReview.class.php ,LSContentsRSS.class.php ,LSContentsSearch.class.php ,LSContentsShare.class.php ,LSContentsSiteManager.class.php ,LSContentsSitemap.class.php ,LSContentsSourceFile.class.php ,LSContentsStopwatch.class.php ,LSContentsTagCloud.class.php ,LSContentsTodoAdd.class.php ,LSContentsTodosOnPage.class.php ,LSContentsTweets.class.php ,LSContentsUIKey.class.php ,LSContentsW3C.class.php ,LSContentsWeather.class.php ,LSContentsWiki.class.php ,LSContentsXML.class.php ,LSControl.class.php ,LSCreativeWork.class.php ,LSCursor.class.php ,LSCustomer.class.php ,LSDataEnvironment.class.php ,LSDate.class.php ,LSDecision.class.php ,LSDictionary.class.php ,LSDoc.class.php ,LSDom.class.php ,LSEvalPHP.class.php ,LSExplorer.class.php ,LSException.class.php ,LSFieldset.class.php ,LSFile.class.php ,LSFileProperties.class.php ,LSFileUploader.class.php ,LSFontSizer.class.php ,LSFootnote.class.php ,LSFootnotes.class.php ,LSForm.class.php ,LSEmailForm.class.php ,LSEnrollForm.class.php ,LSFormPostTweet.class.php ,LSFormset.class.php ,LSFunction.class.php ,LSGeo.class.php ,LSGeolocation.class.php ,LSGeorama.class.php ,LSGeoramaVar.class.php ,LSGlossary.class.php ,LSGlossary.new.class.php ,LSGoogleMap.class.php ,LSGrid.class.php ,LSGroup.class.php ,LSHttp.class.php ,LSHttpResponseHeader.class.php ,LSImage.class.php ,LSImageGallery.class.php ,LSIni.class.php ,LSInput.class.php ,LSInvoice.class.php ,LSIPCheck.class.php ,LSIslandAbstract.class.php ,LSIslandAbstractForm.class.php ,LSIssue.class.php ,LSLabel.class.php ,LSLanguageSwitchers.class.php ,LSLatin.class.php ,LSLegalPerson.class.php ,LSLinkedList.class.php ,LSList.class.php ,LSLogin.class.php ,LSLoginIni.class.php ,LSLoginQuitus.class.php ,LSLoginVFP.class.php ,LSLoginXml.class.php ,LSMail.class.php ,LSMap.class.php ,LSMeeting.class.php ,LSMicronews.class.php ,LSMenu.class.php ,LSModuleAbstract.class.php ,LSModuleArticles.class.php ,LSModuleTestimonials.class.php ,LSNaturalPerson.class.php ,LSNewAnalytics.class.php ,LSNewsArticle.class.php ,LSNote.class.php ,LSOnfail.class.php ,LSPage.class.php ,LSPageframe.class.php ,LSPageEditor.class.php ,LSPageHeader.class.php ,LSParadeigma.class.php ,LSParameter.class.php ,LSPaymentOptions.class.php ,LSPeopleAudience.class.php ,LSPerson.class.php ,LSPlace.class.php ,LSProjectPhase.class.php ,LSPopup.class.php ,LSPorterStemmer.class.php ,LSPortfolio.class.php ,LSProject.class.php ,LSProperty.class.php ,LSPublication.class.php ,LSQueue.class.php ,LSRequirement.class.php ,LSReview.class.php ,LSReturn.class.php ,LSRisk.class.php ,LSSentanaiAbstract.class.php ,LSSentanaiInterface.class.php ,LSSequenceDiagram.class.php ,LSServiceMessage.class.php ,LSSession.class.php ,LSSiteManager.class.php ,LSSitemap.class.php ,LSSoftwareApplication.class.php ,LSSource.class.php ,LSSourceFile.class.php ,LSSpamhaus.class.php ,LSStack.class.php ,LSSubject.class.php ,LSTag.class.php ,LSTagCloud.class.php ,LSTagging.class.php ,LSTask.class.php ,LSTaxonomy.class.php ,LSTechArticle.class.php ,LSTextTrans.class.php ,LSThing.ds.class.php ,LSTimeline.class.php ,LSTimer.class.php ,LSTodoList.class.php ,LSTopic.class.php ,LSTracer.class.php ,LSTweetForm.class.php ,LSTwitter.class.php ,LSUIKey.class.php ,LSUIKeyPermalinkForm.class.php ,LSUIKeyRegisterForm.class.php ,LSUIKeySearchForm.class.php ,LSUnitTesting.class.php ,LSUser.class.php ,LSUserMgr.class.php ,LSVaesoli.class.php ,LSVersion.class.php ,LSVfc.class.php ,LSWebAnalytics.class.php ,LSWebPage.class.php ,LSWebSite.class.php ,LSWidgetBookingForm.class.php ,LSWidgetBusinessClosingPeriods.class.php ,LSWidgetEmailForm.class.php ,LSWidgetEnrollForm.class.php ,LSWidgetOpeningHours.class.php ,LSWiki.class.php ,LSWireTransferForm.class.php ,LSXMLSitemap.class.php ,LSColors.functions.php ,LSDate.functions.php ,LSFiles.functions.php ,LSFinance.functions.php ,LSHtml.functions.php ,LSHttp.functions.php ,LSImages.functions.php ,LSIP.functions.php ,LSMail.functions.php ,LSMath.functions.php ,LSMisc.functions.php ,LSOpenLabels.functions.php ,LSStrings.functions.php ,LSSys.functions.php ,LSUrl.functions.php ,LSV.functions.php ,LSXml.functions.php ,LSVaeSoli.js ,LSVAjax.js ,LSVAnalytics.js ,LSVAnimation.js ,LSVBase.functions.js ,LSVBase64.js ,LSVBattery.js ,LSVCalculator.js ,LSVCan.js ,LSVClock.js ,LSVCookies.js ,LSVCss.js ,LSVDates.js ,LSVDom.js ,LSVExplorer.js ,LSVFiles.js ,LSVMisc.js ,LSVPageframe.js ,LSVPerf.js ,LSVPerfReport.js ,LSVPopup.js ,LSVPosition.js ,LSVStorage.js ,LSVStrings.js ,LSVSwipe.js ,LSVUploader.js ,

La liste des href d'une page 2013-04-05

Depuis l'opus "5.2.0000"

Désormais quand les archipels, quand les îles, voire quand la page sont chargées et qu'elles sont résolues par des sources distantes (utilisation de href), vous pouvez aller repêcher toutes ces infos dans le tableau (array) aHrefs comme vous le montre l'exemple suivant :

<?php var_dump( $this->aHrefs ); ?> // $this being the page (LSPage)

LSTag : support pour <time>…</time> 2013-04-01

Depuis l'opus "5.2.0000"

Nous avons ajouté le support pour le tag <time>…</time> dans Vae Soli! … et nous en avons tiré parti immédiatement dans la classe LSContentsDatetime. Alors, pour s'en servir, rien de plus simple :

$oTime = new LSTag( 'time' );
$oTime->szText = "2012-45";
echo  $oTime;

Mais vous pouvez également être un peu plus ambitieux et vous permettre quelques calculs savants sur les dates en passant par la classe LSDate comme vous le démontre l'exemple qui suit :

$oTime = new LSTag( 'time' );
$oDate = new LSDate( time() );

$oTime->AddObject( $oDate );
echo  $oTime;

L'île de date et heure 2013-04-01

Depuis l'opus "5.1.0001"

Vous pouvez insérer une île de type date/time dans une page. Elle aura pour effet d'afficher la date et l'heure de manière dynamique dans la page en question. Rien de plus simple.

Le format d'affichage est libre et vous pouvez utiliser un sous-ensemble de formats PHP natifs sur date() : Y pour l'année, m pour le mois, d pour le jour, H pour l'heure, i pour les minutes et s pour les secondes.

<Island id="datetime" active="yes" class="LSContentsDatetime">
    <param name="format">d-m-Y H:i:s</param>
    <param name="CSSClass">datetime</param>
    <param name="hidden">false</param>
    <param name="tag">time</param>
    <param name="tooltip">Date et heure courante</param>
    <param name="timezone">Europe/Brussels</param>
</Island>

Si vous souhaitez imposer une limite, vous pouvez le faire grâce au paramètre limit. Dans ce cas n'oubliez pas d'informer Vae Soli! de ce qu'il faut faire quand la limite est atteinte (paramètre destination)  : soit vous souhaitez aller à une autre page, soit vous souhaitez boucler vers la même page (self), en ayant pris soin de définir un contenu différent pour le moment où la limite est atteinte (sous peine de boucler indéfiniment vers la même page), soit vous voulez brancher brancher l'exécution vers un signet de la page courante, soit encore vous voulez exécuter une fonction Javascript de votre cru.

<Island id="datetime" active="yes" class="LSContentsDatetime">
    <param name="format">d-m-Y H:i:s</param>
    <param name="limit">20130430235959</param>
    <param name="destination">/contest-over.php</param>
    <param name="CSSClass">datetime</param>
    <param name="hidden">false</param>
    <param name="tag">time</param>
    <param name="tooltip">Date et heure courante</param>
    <param name="timezone">Europe/Brussels</param>
</Island>

D'autres destinations possibles :

<param name="destination">#limit-reached</param>
<param name="destination">self</param>
<param name="destination">javascript:alert('Game over');</param>

L'île de compte à rebours 2013-04-01

Depuis l'opus "5.1.0001"

Vous pouvez insérer une île de type compte à rebours dans une page. Elle aura pour effet d'afficher un décompte de manière dynamique.

Lorsque la limite de 0 est atteinte, vous avez le choix d'indiquer à Vae Soli! ce qu'il faut faire. Sans surprise, les mêmes conventions s'appliquent à LSContentsCountdown qu'à LSContentsDatetime : soit vous souhaitez aller à une autre page, soit vous souhaitez boucler vers la même page (self), en ayant pris soin de définir un contenu différent pour le moment où la limite est atteinte (sous peine de boucler indéfiniment vers la même page), soit vous voulez brancher brancher l'exécution vers un signet de la page courante, soit encore vous voulez exécuter une fonction Javascript de votre cru.

<Island id="countdown" active="yes" class="LSContentsCountdown">
    <param name="CSSClass">datetime</param>
    <param name="hidden">false</param>
    <param name="tag">time</param>
    <param name="tooltip">Compte à rebours</param>
    <param name="start">300</param>
    <param name="destination">javascript:alert('Finished');</param>
</Island>

Cette île est idéale pour modifier des contenus après un certain temps (le temps du compte à rebours) : des bannières dynamiques positionnées en Ajax, des diaporamas, des réponses à des concours avec temps limité, même à l'écriture de petits agents qui entameront des actions à intervalle régulier sur votre serveur.

Vous pouvez aussi décider de faire en sorte que le compte à rebours ne soit pas visible grâce à :

<Island id="countdown" active="yes" class="LSContentsCountdown">
    <param name="CSSClass">datetime</param>
    <param name="hidden">true</param>
    <param name="tag">time</param>
    <param name="tooltip">Compte à rebours</param>
    <param name="start">300</param>
    <param name="destination">javascript:alert('Finished');</param>
</Island>

L'île chronomètre 2013-04-01

Depuis l'opus "5.1.0001"

C'est le contraire de LSContentsCountdown. Le compteur de chronomètre est incrémenté chaque seconde.

Lorsque la limite indiquée est atteinte, vous avez le choix d'indiquer à Vae Soli! ce qu'il faut faire. Sans surprise, les mêmes conventions s'appliquent qu'à LSContentsCountdown : soit vous souhaitez aller à une autre page, soit vous souhaitez boucler vers la même page (self), en ayant pris soin de définir un contenu différent pour le moment où la limite est atteinte (sous peine de boucler indéfiniment vers la même page), soit vous voulez brancher brancher l'exécution vers un signet de la page courante, soit encore vous voulez exécuter une fonction Javascript de votre cru.

<Island id="stopwatch" active="yes" class="LSContentsStopwatch">
    <param name="CSSClass">datetime</param>
    <param name="hidden">false</param>
    <param name="tag">time</param>
    <param name="tooltip">Chronomètre</param>
    <param name="start">0</param>
    <param name="limit">30</param>
    <param name="destination">javascript:alert('Over!');</param>
</Island>

La génération automatique de site en 5.1.0000 2013-02-23

Depuis l'opus "5.0.0011"

Lorsque vous composez un nouveau site, il vous faut non seulement créer les définitions de domaines dans le gestionnaire du serveur HTTP (par exemple Apache) mais il faut encore créer des répertoires dans lesquels vous aller dépeoser tous les fichiers du site. Il vous faudra aussi faire pointer votre site vers Vae Soli!, et, le cas échéant vers Quitus.

Tout ce travail peut vous être évité car Vae Soli! dispose d'un feature unique à savoir la génération automatique. De quoi s'agit-il ?

Pour ce travail, nous imaginerons devoir créer le site vlt- greenergy.be que nous rendrons accessible en mode développement sous les noms de domaine www.vlt.poc et vlt.poc (poc désignant Proof Of Concept) que nous définirons avec Apache (2.2.11 pour ce qui nous concerne). Suivez pas à pas les instructions :

Définition des domaines en Apache sous forme de vhosts

Éditez le fichier httpd-vhosts.conf de Apache et ajoutez en fin de fichier les lignes suivantes :

<VirtualHost *:80>
    DocumentRoot c:/websites/vlt-greenergy.be/www/httpdocs
    ServerName vlt.poc
    ServerAlias *.vlt.poc
</VirtualHost>

Nous venons de définir un nouveau domaine à servir sous de multiples noms différents : vlt.poc … mais aussi tous les sous- domaines possibles (*.vlt.poc) ce qui inclut aussi le fameux www.vlt.poc. Pourquoi abréger ainsi le nom du domaine (de vlt-greenergy.be à vlt.poc) ? Parce que, diantre, c'est bien plus court à taper dans une adresse web que le nom réel de tout le domaine ! Pour sûr, sur l'environnement de production final, on remplacera vlt.poc par vlt-greenergy.be et le tour sera joué.

Adapter le fichier hosts

En fonction de votre environnement, il faudra adapter le fichier hosts. Nous basons notre exemple sur une utilisation en environnement Windows … et nous fonctionnons en mode local (mode de développement) :

127.0.0.1   vlt.poc         www.vlt.poc

Création manuelle du répertoire physique dans lequel le domaine opérera

Comme le montre la définition du vhost, le domaine sera défini dans le répertoire physique c:/websites/vlt-greenergy.be/www/httpdocs. Vous devez créer ce répertoire manuellement.

Puis, dans ce répertoire, vous créez un fichier index.php avec la définition suivante{{ :}à

<?php include('../master.php'); ?>

Une seule petite ligne de code ! C'est tout ce qu'il nous faut. Vous constatez que cette ligne de code fait référence à un fichier source master.php qui, lui, ne se trouve PAS dans la racine du site.

Voici la définition de ce fichier :

01 <?php
02 ini_set('error_reporting', E_ALL | E_NOTICE );
03 error_reporting( E_ALL | E_NOTICE );
04 ini_set( 'display_errors','On' );
05
06 global $szVaesoliDir;                                           /* Necessary for workaround of bug in PHP on junctions */
07
08 $szRoot         = $_SERVER['DOCUMENT_ROOT'];                    /* Root of the site */
09 $szVaesoliDir   = $szRoot . '/vaesoli';                         /* Default Vae Soli! directory */
10 $szQDir         = $szRoot . '/q';                               /* Default Quitus directory */
11
12 if ( ! is_dir( $szVaesoliDir ) )                                /* If Vae Soli! directory NOT found */
13 {
14     /* Create a symbolic link to VaeSoli! */
15     if ( symlink( "c:\\websites\\vaesoli.org\\www\\httpdocs\\vaesoli\\",$szVaesoliDir ) )
16     {
17     }
18 }   /* if ( ! is_dir( $szVaesoliDir ) ) */
19
20 if ( ! is_dir( $szQDir ) )                                      /* If Quitus directory NOT found */
21 {
22     /* Create a symbolic link to Quitus */
23     if ( symlink( "c:\\websites\\latosensu.be\\www\\httpdocs\\q\\",$szQDir ) )
24     {
25     }
26 }   /* if ( ! is_dir( $szQDir ) ) */
27
28 if ( is_dir( $szVaesoliDir ) )                                  /* If Vaesoli path found */
29 {
30     /* File that contains the Foundation classes */
31     $szFoundationClassesFile = $szVaesoliDir . '/include/LSVfc.class.php';
32
33     if ( file_exists( $szFoundationClassesFile ) )              /* If Foundation classes found */
34     {
35         require_once( $szFoundationClassesFile );               /* Require these classes ONCE for all */
36
37         global $oApp;                                           /* This makes the application a GLOBAL variable */
38
39         $szGeoramaFile = '{new}';   /* Georama file (physical file name ... create a new one) */
40
41         if ( ! isset( $GLOBALS[ '__LS_IsAjax' ] ) || ! $GLOBALS[ '__LS_IsAjax' ] )
42         {
43             $oApp = new LSApplication( $szRoot          ,       /* Root of the site */
44                                        $szGeoramaFile   ,       /* Georama of the site */
45                                        null             ,       /* Verb */
46                                        true );                  /* Create georama if NOT found */
47             $oApp->szVaesoliPath = $szVaesoliDir;               /* So that LSApplication knows where Vae Soli! is installed ... relative to current site */
48             $oApp->Run();                                       /* Run application now */
49         }
50         else
51         {
52             $oAjax = new LSAjax();
53             $oAjax->Run();
54         }
55     }   /* if ( file_exists( $szFoundationClassesFile ) ) */
56 }   /* if ( is_dir( $szVaesoliDir ) ) */
57 else   /* Else of ... if ( is_dir( $szVaesoliDir ) ) */
58 {
59     echo "<p>Vae Soli! path NOT found</p>\n";
60 }   /* End of ... Else of ... if ( is_dir( $szVaesoliDir ) ) */
61 ?>

Copiez simplement ces lignes, débarrassez-vous des numéros de ligne, et sauvez le tout dans le fichier c:/websites/vlt-greenergy.be/www/master.php. Nous y sommes presque !

En ligne 09 vous constatez qu'on suppose que Vae Soli! est installé dans le répertoire c:/websites/vlt-greenergy.be/www/httpdocs/vaesoli. C'est une simple supposition mais il vaudrait mieux que ce soit effectivement le cas. Si le répertoire n'existe pas un répertoire symbolique va être créé vers l'endroit où Vae Soli! est supposé être installé (on appelle cela une jonction en Windows). Pourquoi créer un lien symbolique ? Tout simplement pour faire en sorte que différents sites déployés sur le même serveur puisse bénéficier de la même instance de Vae Soli! : un seul déploiement pour de multiples sites. Si dasn votre cas, le déploiement de Vae Soli! a été effectué à un autre endroit, il vous faudra modifier la ligne 15. Au sortir de la ligne 15, le répertoire c:\websites\vlt-greenergy.be\www\httpdocs\vaesoli\ pointe vers le répertoire c:\websites\vaesoli.org\www\httpdocs\vaesoli\ où Vae Soli! est installé.

À la ligne 28 on teste si le répertoire où se trouve Vae Soli! existe (que ce soit un lien symbolique ou non). Si le répertoire est trouvé, on charge les classes "Fondation" de Vae Soli! (lignes 31 et 35).

En ligne 39 on mentionne le nom du fichier géorama dont on a besoin. Vous constaterez que ce fichier pointe ici vers un répertoire qui se trouve au- dessus de la racine du site (pour des questions de sécurité). Dans notre cas, le nom de ce répertoire est c:\websites\vlt-greenergy.be\www\georama\ et le nom du fichier est georama.xml. Bien entendu, à ce stade, ce fichier n'existe pas (et peu nous importe qu'il existe ou non).

Des lignes 43 à 48 on va créer une application Vae Soli! et lui demander de se lancer (chaque page est une instance d'application). Notez le true de la ligne 46 : si le géorama n'existe pas il sera créé … et en fait c'est la totalité du site qui est créée.

À ce stade, tout est fait pour que la génération automatique puisse se dérouler sans encombre. Il suffit maintenant d'arrêter les services Apache et de les faire redémarrer pour que la nouvelle définition de domaine puisse être prise en compte.

En résumé

  1. Définir le domaine dans les vhosts Apache
  2. Adapter le fichier hosts (en fonction de votre environnement)
  3. Créer le répertoire dans lequel le site va être actif
  4. Créer le fichier index.php dans la racine du site
  5. Créer le fichier master.php au-dessus de la racine du site
  6. Adapeter le fichier master.php pour qu'il colle à votre nouveau site
  7. Redémarrer les services Apache
  8. Demander la page d'accueil du site

Dernier point : choisir un paradeigma bien défini

Lorsque Vae Soli! génère un site, notre framework choisit un paradeigma au hasard (modèle de site web). Tous nos paradeigmas sont compatibles les uns avec les autres. Par contre, vous pourriez souhaiter choisir vous-même le paradeigma à appliquer. Pour ce faire, il suffira que (1) votre fichier de géorama soit inexistant (ce qui activera la génération automatique) (2) indiquer le paradeigma dans l'URL de votre requête. Par exemple, voici comment choisir le paradeigma "Essentiel" avec l'exemple que nous avons fourni jusqu'ici, le site vlt.poc :

http://www.vlt.poc?paradeigma=Essentiel

Les nouveaux prototypes de date (Javascript) en 5.1.0000 2013-02-22

Depuis l'opus "5.1.0000"

Vae Soli! fournit des extensions au prototype des dates Javascript. Avec ces extensions, plus besoin de déclarer des fonctions pour calculer une nouvelle date sur base d'un nombre de jours (+ ou -), pour utiliser différents formats d'initialisation, bénéficier de différents formats de rendu, …. Voici la liste des extensions dont vous disposez :

Method Description
Add( x ) Ajout (x positif) ou retrait (x négatif) d'un nombre de secondes
Bom( [n] ) Positionne la date au début du mois. Si vous passez l'argument n, la méthode calcule le début du mois en sautant n mois : Bom(1) calcule le début du mois suivant; Bom(-1) calcule le début du mois précédent.
Eom( [n] ) Positionne la date à la fin du mois. Si vous passez l'argument n, la méthode calcule la fin du mois en sautant n mois : Eom(1) calcule la fin du mois suivant; Eom(-1) calcule la fin du mois précédent.
Render( [fmt] ) Rendu de la date selon un format optionnel. Si fmt passé, les trois formats possibles sont Y pour l'année, m pour le mois, d pour le jour, H pour l'heure, i pour les minutes et s pour les secondes.
Set( x ) Initialisation de la date. Si x est un chiffre, il représente le nombre de secondes passées entre le 1er janvier 1970 et la date à positionner (valeur UTC). Si x est une chaîne, elle peut être formatée selon DD-MM-YYYY, DD/MM/YYYY, DD.MM.YYYY, YYYY-MM-DD, YYYY/MM/DD, YYYY.MM.DD ou YYYYMMDD. Vous pouvez encore mentionner l'heure, les minutes et les secondes en mentionnant 6 chiffres à la fin de la chaîne passée.

Pour bénéficier de ces extensions, il suffit d'inclure la source Javascript suivante :

<script src="/vaesoli/scripts/LSVDates.js"> </script>

Les nouveaux prototypes de string (Javascript) en 5.1.0000 2013-02-21

Depuis l'opus "5.1.0000"

Vae Soli! ce n'est pas que du code PHP. C'est aussi un peu de code Javascript … et c'est ainsi que Vae Soli! fournit des extensions au prototype des strings Javascript. Avec ces extensions, plus besoin de déclarer des fonctions pour faire le ltrim(), le rtrim() ou encore le trim() d'une chaîne de caractères, toutes méthodes inexistantes dans l'objet string originel de Javascript. Voici la liste des extensions dont vous disposez :

Method Description
ltrim() Élimination des blancs les plus à gauche
rtrim() Élimination des blancs les plus à droite
trim() Élimination des blancs les plus à gauche ET des plus à droite
isBlank() Détermine si la chaîne ne contient que des blancs
isEmpty() Détermine si la chaîne est vide (alias de isBlank())
strin() Élimine la dernière position ("string" devient "strin")
endsWith( s ) Détermine si la chaîne se termine par la sous-chaîne s
startsWith( s ) Détermine si la chaîne commence par la sous-chaîne s
lpad( c,iLen ) Remplit la chaîne à gauche par le caractère c jusqu'à ce que la chaîne atteigne la longueur iLen
rpad( c,iLen ) Remplit la chaîne à droite par le caractère c jusqu'à ce que la chaîne atteigne la longueur iLen
unquote() Élimine les ',", CR et LF de la chaîne en les transformant en leur équivalent URL encode (' devient %27, " devient %22, CR devient %0D, LF devient %0A)
chkdate() Détermine si la chaîne représente une date (format DD-MM-YYYY)
chkemail() Détermine si la chaîne représente une adresse email valide
tokenize( sep ) Découpe une chaîne de caractères en fonction de sep qui est traité comme LE séparateur et non comme une liste de séparateurs comme dans la méthode split(). Retour = tableau

Pour bénéficier de ces extensions, il suffit d'inclure la source Javascript suivante :

<script src="/vaesoli/scripts/LSVStrings.js"> </script>

Tracing sur les définitions XML des îles et des archipels dans l'opus 5.1.0000 2013-02-20

Depuis l'opus "5.1.0000"

Marre de vous demander quelle définition XML est activée dans une page ? Utilisez donc cette fonctionnalités inédite de Vae Soli!: les traces définies au niveau des définitions des îles et archipels. Un exemple !

<Archipelago id="ecma" active="yes" category="ecma" trace="16:Hello from me">
    <Island id="ecma" active="yes" xhtml="yes" trace="16:Scripts will be inserted">
        <script type="text/javascript" src="/vaesoli/scripts/LSVCookies.js"> </script>
        <script type="text/javascript" src="/scripts/ls.js"> </script>
    </Island>
</Archipelago>

On ne peut décidément faire plus simple … mais désactivez donc cette fonctionnalité lorsque vous partez en production avec une application bâtie de cette manière … sauf si vous souhaitez justement tracer ce qui se passe en production !

La syntaxe permise est la suivante : trace="..." ou trace="x:...". Dans le premier cas, le niveau de logging souhaité est implicite (Vae Soli! considérant que sa valeur est 64). Dans le second cas, le niveau de logging est indiquée par la valeur de x (dans nos exemples ci-dessus, 16, ce qui correspond à un niveau "erreur").

LSContents et les user input zones 2013-02-18

Depuis l'opus "5.1.0000"

La version 5.1.0000 de Vae Soli! généralise les développements entrepris dans la classe LSContentsLoginLogoff (pour le cas du site The Mentors Club de Pernod Ricard) qui permettait de présenter des zones de saisie à l'écran pas prévues lors du développement initial de la classe.

Le principe est simple : des zones définies dans le géorama sont incluses dans le rendu de l'île. Par paramétrisation de l'île, il est donc possible de créer des formulaires. Rien de plus; rien de moins. Voici un exemple à vous mettre sous la dent :

<Island id="free-zones" active="yes" class="LSContents">
    <param name="after-storage"><![CDATA[true]]></param>
    <param name="user-field"
           id="txtZone1"
           tooltip="Please fill zone 1"
           cookie="yes"
           value=""
           caption="Zone 1:"
           css-class="free-zone"
           onkeypress="return __chkNumber(event,this,'');"
           maxlength="2"
           placeholder="DD"><![CDATA[<br />]]></param>
    <param name="user-field"
           id="txtZone2"
           tooltip="Please fill zone 2"
           cookie="yes"
           value=""
           caption="Zone 2:"
           css-class="free-zone"
           onkeypress="return __chkNumber(event,this,'');"
           maxlength="2"
           placeholder="MM"><![CDATA[<br />]]></param>
    <param name="user-field"
           id="txtZone3"
           tooltip="Please fill zone 3"
           cookie="yes"
           value=""
           caption="Zone 3:"
           css-class="free-zone"
           onkeypress="return __chkNumber(event,this,'');"
           maxlength="4"
           placeholder="YYYY"><![CDATA[<br />]]></param>
    <param name="user-field"
           id="cmdSubmit"
           type="submit"
           tooltip="Click to send data"
           value="Submit"
           css-class="free-zone"><![CDATA[]]></param>
</Island>

Dans l'exemple démontré ci-dessus, l'île n'a aucun autre contenu que les zones de saisie ! Il en découle que nous avons ainsi créé un formulaire sans code HTML … simplement en paramétrant une île de Vae Soli!.

LSInput et les datalist 2013-02-18

Depuis l'opus "5.1.0000"

La mise au point de la gestion d'entreprise Quitus nous pousse à ré-évaluer la manière dont les zones de type dropdowncombo sont implémentées en Vae Soli!.

Jusqu'à présent, ces listes étaient implémentées sous la forme d'un tour de passe passe où une zone texte était surexposée sur une zone de sélection (select). La solution était élégante mais posait néanmoins l'une ou l'autre difficulté de codage (notamment le code Javascript nécessaire à juxtaposer au pixel près les deux zones — la zone de texte cachant partiellement la zone de select, sauf pour ce qui était de la flèche de choix).

La solution que nous apportons aujourd'hui passe par l'utilisation de datalist, feature disponible en HTML 5. Voyons un exemple. La zone qui s'affiche ci-dessous est une zone d'input de type text toute simple. Auparavant, une datalist a été créée avec 4 choix possibles (on verra plus loin comment) et la liste de données a été attachée à la zone d'input pour que cette dernière en fasse usage (cliquez dans la zone d'input pour activer les 4 choix disponibles).

Quel est le code nécessaire ? Il n'est pas bien long :

Line 01: $oForm = new LSForm();
Line 02: $oForm->szVersion = 'Web 2.0';
Line 03:
Line 04: $oDataList = new LSTag( 'datalist','urls' );
Line 05: $oDataList->AddItem( 'FastWrite',
Line 06:                      'http://www.fastwrite.com' );
Line 07: $oDataList->AddItem( 'Lato Sensu Management',
Line 08:                      'http://www.latosensu.be' );
Line 09: $oDataList->AddItem( 'UIKey',
Line 10:                      'http://www.uikey.org' );
Line 11: $oDataList->AddItem( 'Quitus',
Line 12:                      'http://www.quitus.be' );
Line 13:
Line 14: $txtInput = new LSInput( 'text',null,'txtInput' );
Line 15: $txtInput->szList  = 'urls';
Line 16: $txtInput->szStyle = 'width:400px;';
Line 17:
Line 18: $oForm->AddObject( $txtInput  );
Line 19: $oForm->AddObject( $oDataList );
Line 20:
Line 21: echo $oForm;

En ligne 02 vous constatez qu'il faut indiquer vouloir générer des formulaires de type Web Form 2.0.

En ligne 04 vous créez un tag de type datalist.

Des lignes 05 à 12 on crée les données de la liste (libellé, valeur).

En ligne 15 on indique que la zone d'input doit utiliser la liste de données. En ligne 19, ne pas oublier d'ajouter la liste de données au formulaire (ou au fieldset).

Le tour est joué.

LSPage avec cookie de dernière visite 2013-02-18

Depuis l'opus "5.1.0000"

Le paramétrage LSVisit permet de demander à Vae Soli! de garder une trace des visites d'un internaute pour la totalité d'un site. Pour ce faire il faut paramétrer les settings du site de la manière suivante (souvent dans le defaults.xml) :

<Defaults>
    <Settings>
        <!-- Default settings for all other domain names -->
        <LSDoctype>xhtml11</LSDoctype>
        <LSIsDebug>true</LSIsDebug>

        <LSTracingLevel>48</LSTracingLevel>
        <LSTracingOutput>/../logs/t.log</LSTracingOutput>
        <LSTracingFilter></LSTracingFilter>
        <LSPerfThreshold>0.050</LSPerfThreshold>
        …
        <LSVisit><![CDATA[true]]></LSVisit>
    </Settings>
</Defaults>

Dès cet instant, Vae Soli! maintient un cookie (validité: 1 mois environ) qui indique quand l'utilisateur a visité le site pour la première fois, quand la dernière fois, et le nombre de visites (demandes de page). Illustration :

Le cookie s'appelle LS-LAST-VISIT et il est formaté en trois parties : la première visite;la dernière visite;le nombre de visites. Les première et dernière visites sont formatées en YYYYMMDDHHmmSS.

LSLoginQuitus avec des credentials PAR domaine 2013-02-11

Depuis l'opus "5.1.0000"

Il se pourrait que vous créiez un site multi-domaines (eg. www.vaesoli.org et www.vaesoli.com) et que dans ce cadre vous souhaitiez disposer de logins (credentials) différents en fonction du domaine sur lequel vous vous logguez. C'est désormais possible avec la nouvelle mouture de la classe LSLoginQuitus (opus 5.1.0000). Grâce à la config suivante :

<Connection>
    <Groups landscape="www.ls.poc;;www.latosensu.be">
        <![CDATA[quitus;admin]]></Groups>
    <Groups landscape="www.quitus.poc;;www.quitus.be;;www.quitus.ch">
        <![CDATA[guests]]></Groups>
    <Account landscape="www.ls.poc;;www.latosensu.be;;www.quitus.poc;;www.quitus.be;;www.quitus.ch">
        <![CDATA[oscar]]></Account>
    <Password landscape="www.ls.poc;;www.latosensu.be">
        <![CDATA[643079ef22297ea1e28c40b119d3afaa7e2c8f6894ee0e4797d645bb25765abecdef09ef1f8d0fc36bc4020d109b81e8]]></Password>
    <Password landscape="www.quitus.poc;;www.quitus.be;;www.quitus.ch">
        <![CDATA[8b148fc822e8170d60259e1051b096a63834e7d3d20a1845093aec7edc0d1f4da345b386eb8847c68394538e05852b07]]></Password>
</Connection>

De la configuration exprimée ci-dessus vous devez déduire que plusieurs domaines sont possibles : www.ls.poc;;www.latosensu.be;;www.quitus.poc;;www.quitus.be;;www.quitus.ch, que ces domaines sont divisés en deux grands groupes (le site de latosensu et le site de quitus). Quel que soit le domaine, le user account est "oscar", tandis que les groupes auxquels appartient Oscar sont différents pour les deux grandes catégories de domaines et que les mots de passe sont également différents.

Vous aurez aussi noté que les mots de passe sont encryptés ce qui évite que quelqu'un puisse vous les voler.

Les attributs threshold, score et random 2013-03-10

Depuis l'opus "5.1.0001"

En deux mots … la version 5.1.0001 de Vae Soli! permet l'insertion d'îles au hasard. Idéal pour un contenu identique, pourtant variable, mais dont le positionnement n'a finalement pas d'importance.

Il suffit pour cela d'indiquer l'attribut random="true" sur l'archipel dont les îles doivent être insérées au hasard et le tour est joué.

De même, on peut assigner un seuil à un archipel et des scores à des îles. Dès que les scores cumulés des îles atteignent le seuil de l'archipel dans lequel elles sont incluses, Vae Soli! stoppe l'insertion des îles restantes. Voici un exemple immédiat :

<Archipelago id="body" active="yes" category="body" random="yes" threshold="300">
    <Island id="island-1" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
    <Island id="island-2" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
    <Island id="island-3" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
    <Island id="island-4" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
    <Island id="island-5" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
</Archipelago>

L'archipel body a un seuil positionné à 300. Il est composé de 5 îles : island-1, island-2, island-3, island-4, et island-5, chacune pourvue d'un score de 100. Dans ce cas, Vae Soli! n'insérera que les îles 1 à 3 car dès l'insertion de l'île island-3 réalisée, le seuil de 300 sera atteint. Notez à présent le petit changement suivant :

<Archipelago id="body" active="yes" category="body" random="yes" threshold="300" random="yes">
    <Island id="island-1" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
    <Island id="island-2" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
    <Island id="island-3" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
    <Island id="island-4" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
    <Island id="island-5" active="yes" class="LSContent" score="100">
        <param name="storage"><![CDATA[<whatever storage...>]]></param>
    </Island>
</Archipelago>

… dans le cas présent, puisque vous demandez à Vae Soli! d'insérer les îles au hasard, tout ce que vous pourrez dire est que 3 des îles définies seront affichées … mais vous ne pourrez déterminer lesquelles.

Précédent Suivant