Magic!

    Auteur: Olivier Auverlot
    Version 3.1.0
    Date: 2 décembre 2004

Contents

1. Présentation
2. Que permet Magic! ?
3. Compatibilité
4. Avertissement important
5. Copyright
6. Installation
7. Insérer du code Rebol dans une page HTML
8. Transmission des données d'un formulaire à une page RHTML
9. Utiliser des librairies partagées
10 Connaître le répertoire courant
11 Gestion des applications
11.1 Créer une application
11.2 Connexion à une application
11.3 Accéder aux propriétés et méthodes d'application
11.4 Transmettre l'identifiant d'une application
11.5 Détruire une application
12 Gestion des sessions
12.1 MAGICSESSID
12.2 session-start
12.3 session-vars
12.4 session-destroy
12.5 session?
12.6 Création d'un compteur utilisant une session
12.7 Insérer le MAGICSESSID dans un formulaire
12.8 Réécriture d'url
13 Les composants wand
13.1 Déclaration d'un composant wand
13.2 Création d'un composant wand
13.3 Exploiter le contenu d'un composant wand
14 Utilisation du cache
14.1 Configuration du cache
14.2 La directive #nocache
14.3 Performances du cache
15 Personaliser l'environnement d'exécution d'un utilisateur
15.1 Le fichier user-magic.conf
15.2 Le fichier admin-magic.conf
16 Gestion de la sécurité
17 Envoyer et recevoir des cookies
17.1 Setcookie
17.2 Getcookie
17.3 Exemple d'utilisation
18 Travailler avec des modèles de document
19 Fonctions utilitaires
19.1 Activer le mode de deboggage
19.2 Manipuler l'entête HTTP
19.3 Redirection
19.4 Redirection vers une page d'erreur
19.5 Manipuler des couleurs en RGB
19.6 Obtenir les variables d'environnement
19.7 Réécriture d'url
20 Obtenir la version de Magic!
21 Utiliser les composants HTML
21.1 Localiser les composants html
21.2 Mise en page
21.3 Construction de formulaires
21.4 Présentation formatée de données
21.5 Interactivité
21.6 Gestion de contenu (CMS)
21.7 Fonctions d'impression
22 Pour les prochaines versions...
23 Mises à jour

1. Présentation

Magic! est une extension au serveur HTTP Apache permettant de concevoir des pages web mélangeant du code HTML et du code Rebol. Les pages ayant le suffixe RHTML sont automatiquement redirigées vers Magic! qui exécute alors les sections de code Rebol rencontrées. Les instructions Rebol peuvent être placées au sein du code HTML mais également au début ou à la fin de la page. Les balises <rebol> et </rebol> permettent respectivement de marquer le début et la fin d'une section de code.

[ back to top ]

2. Que permet Magic! ?

[ back to top ]

3. Compatibilité

Magic! a été testé avec les versions 1.3.x et 2.0.x du serveur Apache sur les plateformes suivantes :

[ back to top ]

4. Avertissement important

Les fonctions de Magic! débutant par la séquence "m-" ne doivent pas être utilisées ou modifiées par l'utilisateur. Elles sont réservées au fonctionnement interne de Magic!. Ces instructions sont susceptibles d'être modifiées dans le futur.

[ back to top ]

5. Copyright

Copyright notice:

    (C) 2004 Olivier Auverlot

     This software is provided 'as-is', without any express or implied
     warranty.  In no event will the author be held liable for any damages
     arising from the use of this software.

     Permission is granted to anyone to use this software for any purpose,
     including commercial applications, and to alter it and redistribute it
     freely, subject to the following restrictions:

     1. The origin of this software must not be misrepresented; you must not
     claim that you wrote the original software. If you use this software
     in a product, an acknowledgment in the product documentation would be
     appreciated but is not required.
     2. Altered source versions must be plainly marked as such, and must not be
     misrepresented as being the original software.
     3. This notice may not be removed or altered from any source distribution.

     Olivier Auverlot
     olivier.auverlot@free.fr
[ back to top ]

6. Installation

Le fichier MAGIC.CGI doit être copié dans le répertoire CGI-BIN de votre serveur Apache. Sous Unix, les droits d'exécution doivent être correctement activés.

    chmod 755 magic.cgi

La première ligne du code contient le chemin d'accès vers l'évaluateur Rebol utilisé sur votre serveur, vous devez obligatoirement le modifier.

    Exemple pour un système Unix : #!/opt/command/rebol -cs
    Exemple pour un système Microsoft Windows : #!c:/rebol/rebol -cs

Les variables M-LIBRARY-PATH et M-SESSIONS-PATH doivent être correctement renseignées selon la configuration de votre serveur :

    AddHandler magic rhtml
    Action magic /cgi-bin/magic.cgi

Si une page rhml doit être une page de démarrage, vous devez modifier la directive DirectoryIndex afin qu'Apache considère ce type de document comme devant être exploité lors d'une entrée dans un répertoire :

    DirectoryIndex index.rhtml index.html 

Afin d'éviter l'occupation du temps processeur par des pages rhtml contenant des boucles infinies, il vous est recommander de fixer un temps d'exécution limite. Pour cela, utilisez la directive RLimitCPU suivante afin de limiter le temps d'exécution des pages RHTML à 30 secondes :

    RLimitCPU 30 

Une fois ces opérations réalisées, vous devez relancer le serveur afin qu'il prenne en compte les modifications.

[ back to top ]

7. Insérer du code Rebol dans une page HTML

Le code écrit en Rebol doit être placé entre des balises <REBOL> et </REBOL> au sein même de la page HTML. L'exemple suivant (SAMPLE1.R) affiche la date et l'heure courante :

    <html>
    <head><title>Sample1</title></head>
    <body>
    Bonjour, nous sommes le

    <rebol>
        print [ now/date "<br><br>" ]
    </rebol>

    Il est actuellement :
    <rebol>
        print [ "<b>" now/time "</b>" ]
    </rebol>
    </body>
    </html> 

Vous pouvez déclarer des variables, des objets et même des fonctions. Magic! n'impose pas de limitations au programmeur. Il est également possible d'utiliser les fonctionnalités avancées de Rebol/Command. L'exemple suivant (SAMPLE2.R) accède à une base de données MySQL et affiche le résultat sous la forme d'un tableau.

    <html>
    <head></head>
    <body>
    <h1>Membre du personnel</h1>
    <rebol>
            con: open mysql://homer:marge@serveurmysql/base
            p: first con
            insert p join "select * from personnes"
            rep: copy p
            close p
            close con
            prin "<rebol border=1>"
            foreach ligne rep [
                    prin "<tr>"
                    foreach ele ligne [
                            prin [ "<td>" ele "</td>" ]
                    ]
                    print "</tr>"
            ]
            prin "</table>"
    </rebol>
    </bpdy>
    </html> 

A l'aide des balises <%= et %>, vous pouvez également afficher le résultat de l'évaluation d'une variable ou d'une expression Rebol.

    <rebol>
            variable: 10
            nom: "Dupont"
            prenom: "Pierre"
    </rebol>

    <html>
    <head></head>
    <body>
            Variable vaut <%=variable%><br>
            Vous êtes <%=join nom [ " " prenom ] %>
    </body>
    </html>
[ back to top ]

8. Transmission des données d'un formulaire à une page RHTML

Une page RHTML peut recevoir et exploiter les données provenant d'un formulaire HTML. L'attribut ACTION du formulaire doit indiquer le nom de la page RHTML. La méthode (attribut METHOD) peut avoir la valeur GET ou la valeur POST. Magic! détecte seul la méthode utilisée et sait les exploiter toutes les deux. Les données reçues dans une page RHTML sont accessibles à l'aide de l'objet VARS pour lequel chaque propriété correspond à un champ du formulaire émetteur. L'exemple suivant est composé deux pages. La première est une page HTML (SAMPLE3_1.HTML) demandant la saisie du nom de l'utilisateur :

    <html>
    <head><title>Sample3_1</title></head>
    <body>
        <form name="formulaire" method="GET" action="sample3_2.rhtml">
            Quel est votre nom<BR>
            <input type="field" name="nom" value="">
            <input type="submit" value="Valider">
        </form>
    </body>
    </html>

Le formulaire est ensuite transmis à la page SAMPLE3_2.RHTML dont la fonction est d'afficher un sympathique "Bonjour !" suivi du nom de l'utilisateur :

    <html>
    <head><title>Sample3_2</title></head>
    <body>
    <rebol>
        print [ "Bonjour!" vars/nom ]
    </rebol>
    </body>
    </html>

Si le formulaire est de type multipart/form-data, Magic! peut être utilisé afin de pratiquer le transfert de fichiers du poste client vers le serveur http. Les fichiers reçus par Magic! sont accessibles à l'aide de l'objet VARS. Chaque fichier est représenté par un objet possédant quatre propriétés qui sont :

[ back to top ]

9. Utiliser des librairies partagées

Si vous voulez mettre un ensemble de fonctions à la disposition des utilisateurs, vous pouvez déclarer un répertoire dédié dont le chemin d'accès est contenu dans la variable M-LIBRARY-PATH, déclarée dans le fichier MAGIC.CGI. Pour utiliser une bibliothèque, l'utilisateur doit utiliser le mot LIBRARY suivi du nom de fichier. Ce mot returne une valeur booléenne selon la réussite ou l'échec du chargement. L'exemple qui suit, présente l'intégration de la librairie MySQL de Nenad Rakocevic au sein d'une page RHTML :

    <html>
    <head>Sample 5_1</head>
    <body>
    <rebol>
        if library %mysql-protocol.r [
            db: open mysql://olivier:homer@172.29.143.1/musiquedb
            insert db [ "select distinct artiste from disques order by artiste" ]
            while [ not empty? (nom: first db) ] [
                print join nom "<BR>"
            ]
            close db
        ]
    </rebol>
    </body>
    </html>

Si une librairie est spécifique à un projet et que son stockage dans le répertoire M-LIBRARY-PATH ne présente aucun intérêt pour les autres utilisateurs, il vous est possible de la placer dans le répertoire de votre application web. Dans ce cas, il vous faut utiliser le raffinement /private.

Exemple:

    <hthml>
    <head></head>
    <body>
        <rebol>
            if library/private %malibamoi.r [
                print "Librairie chargée"
            ]
        </rebol>
    </body>
    </html>
[ back to top ]

10 Connaître le répertoire courant

Le répertoire courant est le chemin d'accès à la page RHTML en court d'éxecution. Ce chemin peut être obtenu à l'aide de la variable CURDIR.

    <html>
    <head>Sample 6_1</head>
    <body>
    <rebol>
        print [ "le répertoire courant est : " curdir ]
    </rebol>
    </body>
    </html>
[ back to top ]

11 Gestion des applications

Les pages rhtml d'un projet peuvent être regroupée sous la forme d'une application. Chaque application porte un nom afin de la distinguer des autres et est représentée "physiquement" par un objet stocké dans le répertoire M-SESSIONS-PATH de Magic!. Cette objet comporte des propriétés et méthodes communes aux différents utilisateurs de l'application. La modification de la valeur d'une propriété de l'application par un utilisateur peut alors être prise en compte par l'ensemble des utilisateurs. Cette persistence et ce partage de données permet ainsi de mettre en place rapidement des outils tels qu'un compteur d'accès ou encore un cache, destiné au stockage d'informations provenant d'une base de données (évitant ainsi d'incessantes requêtes SQL). Les méthodes d'application sont généralement des fonctions spécifiques à l'application et n'ont donc pas leur place dans le répertoire m-library-path. Les propriétés et méthodes sont accessibles à l'aide de l'objet APPLICATION. Le nom de l'application active peut être connu à l'aide de la variable MAGICAPPID. Le concept d'application prend tout son intérêt s'il est utilisé conjointement aux sessions. Malgré tout Magic! vous laisse le choix et offre au programmeur une architecture très souple.

apps.png

11.1 Créer une application

Pour créer une application, vous devez utiliser le mot APPLICATION-CREATE suivi du nom de l'application et d'un bloc contenant les propriétés et méthodes. Certaines propriétés sont définies automatiquement à la création de l'application:

Exemple:

    application-create "TEST" [
        score: make integer! 0
        ajoute: func [] [
            score: score + 1
        ]
    ]

A l'aide du raffinement /owner, il vous est possible de spécifier un propriétaire pour l'application. Sur un serveur hébergeant différents utilisateurs, cet identifiant permet de sécuriser la création et la destruction d'une application.

Exemple:

    application-create/owner "TEST" [
        score: make integer! 0
        ajoute: func [] [
            score: score + 1
        ]
    ] "monidentifiantsecret"

La création d'une application ne doit être réalisée qu'une seule fois à l'initialisation de l'application web. Le mot APPLICATION-EXISTS? vous permet de contrôler l'existence de l'application et ainsi d'éviter l'écrasement de l'objet d'application.

Exemple:

    either not application-exists? "TEST" [
        application-create "TEST" [
            score: make integer! 0
            ajoute: func [] [
                score: score + 1
            ]
        ]
        print "L'application est démarrée"
    ] [ print "L'application existe déjà" ]

Une fois l'objet généré, les pages rhtml n'ont plus qu'à se connecter à l'application.

11.2 Connexion à une application

Créer une application ne suffit pas pour pouvoir l'utiliser, le mot APPLICATION-BIND suivi du nom de l'application, permet à l'utilisateur de se connecter à l'application. La transmission du MAGICAPPID entre les pages peut se faire de deux façons différentes. Si le raffinement /cookie est utilisé, Magic! génère un cookie MAGICAPPID et gère automatiquement sa réception. Dans le cas contraire, c'est au programmeur de transférer le MAGICAPPID à l'aide des fonctions de réécriture d'url intégrées dans Magic!.

Exemple:

    application-bind/cookie "TEST"

Il est souvent très pratique de savoir si une application est active avant de vouloir l'utiliser. Pour cela, vous disposez du mot APPLICATION? qui retourne une valeur booléenne.

Exemple:

    either not application? [
        application-bind "TEST"
        print [ "Utilisation de l'application " MAGICAPPID ]
    ] [ print [ MAGICAPPID " est déjà en cours d'utilisation pour ce client" ] ]

11.3 Accéder aux propriétés et méthodes d'application

Pour utiliser l'objet application, il vous suffit d'utiliser l'objet APPLICATION.

Exemple:

    print application/score
    application/ajoute

11.4 Transmettre l'identifiant d'une application

La fonction insert-MAGICAPPID insère un champ caché dans un formulaire. La fonction rewrite-url permet également de générer une url contenant le MAGICAPPID.

11.5 Détruire une application

Le mot APPLICATION-DESTROY détruit l'objet d'application MAGICAPPID.

Exemple:

    either application? [
        print "tente destruction"
        application-destroy
        print "Application détruite"
    ] [
        print "Pas d'application active"
    ]

Si l'application a un propriétaire, l'identifiant /owner lui permet de s'identifier pour autoriser la destruction de la session.

Exemple:

    either application? [
        print "tente destruction"
        application-destroy/owner "monidentifiantsecret"
        print "Application détruite"
    ] [
        print "Pas d'application active"
    ]
[ back to top ]

12 Gestion des sessions

Magic! autorise la création et la manipulation de sessions. Une session identifie un utilisateur et permet de conserver sur le serveur, des variables de session stockées dans un objet nommé SESSION. Le principal problème de l'utilisation des sessions réside dans le fait que HTTP est un protocole ignorant la notion de connexion persistante. Il est malheureusement impossible de savoir si l'utilisateur est toujours connecté et donc de déterminer si l'objet de session qui lui a été attribué, doit toujours être conservé.

12.1 MAGICSESSID

Une session est identifiée par un marqueur unique nommé MAGICSESSID. Vous avez accès au contenu de ce mot mais vous devez surtout pas modifier sa valeur lorsqu'un session est ouverte. Si aucune session n'est active, MAGICSESSID contient la valeur NONE.

12.2 session-start

Le mot SESSION-START permet de créer une session. Magic! génère alors un identifiant et l'attribut au mot MAGICSESSID. Le temps de vie maximum d'une session est fixé par défaut à 30 minutes mais vous pouvez le modifier à l'aide du raffinement /EXPIRE suivi du délai exprimé selon le format hh:mm:ss.

Le transport du MAGICSESSID peut être réalisé de deux manières différentes :

    session-start/cookie/expire 0:0:30

12.3 session-vars

Avec le mot SESSION-VARS, vous définissez les variables appartenant à la session. SESSION-VARS peut être utilisé à plusieurs reprises durant l'exécution de votre application : les nouvelles variables de session créées seront ajoutées à celles déjà existantes. Les variables de sessions sont définies à l'aide d'une série de blocs. Chaque bloc contient le nom de la variable et sa valeur d'initialisation.

    session-vars [ [ login: "" ] [ id: none ] ]

Une variable de session est accessible à l'aide de l'objet SESSION :

    print session/login
    print session/id

12.4 session-destroy

Le mot SESSION-DESTROY permet de forcer la destruction d'une session. Lorsqu'il est exécuté, ce mot efface l'objet de session et en avertit le daemon MSMD. Toutes les variables de session sont définitivement perdues.

12.5 session?

Le mot SESSION? retourne une valeur booléenne selon qu'une session est active ou n'existe pas.

12.6 Création d'un compteur utilisant une session

L'exemple suivant est un simple compteur. A chaque chargement de la page RHTML, la valeur de la variable de session VALEUR est incrémenté d'une unité. A son exécution, la page vérifie si la session est déjà initialisée. Si la session n'est pas active, elle est créée avec un temps de vie de 5 minutes et la variable de session VALEUR est initialisée.

    <html>
    <head></head>
    <body>
    <rebol>
        if not session? [
            session-start/cookie/expire 0:5:0
            session-vars [ [ valeur: 0 ] ]
        ]
        print join "<h1>" [ session/valeur "</h1>" ]
        session/valeur: session/valeur + 1
    </rebol>
    </body>
    </html>

12.7 Insérer le MAGICSESSID dans un formulaire

La fonction insert-MAGICSESSID insère un champ caché (hidden) dans un formulaire afin de transmettre le marqueur de session au serveur.

12.8 Réécriture d'url

La fonction link permet la génération d'un lien hypertexte dans la page html. Elle reçoit deux arguments qui sont le texte du lien et l'url de destination. Le raffinement /rewrite permet d'activer la réécriture de l'url afin d'insérer l'identifiant de l'application (MAGICAPPID) et le MAGICSESSID de la session active.

    link/rewrite "Page suivante" "mapage.rhtml"

Le raffinement /image indique que le texte passé en paramètre est le nom d'un fichier image (gif,png ou jpeg).

    link/image/rewrite %suite.png "mapage.rhtml"

Le raffinement /target détermine le mode d'ouverture de la page appellée ('blank, 'top ou 'self).

    link/target "Retour" "mapage.rhml" 'top
[ back to top ]

13 Les composants wand

La technologie wand présente dans Magic! autorise la création de composants autonomes distribués sur le réseau. A l'aide de la balise <object>, ces composants peuvent être intégrés dans une page RHTML. Il est ainsi possible de fournir des composants RHTML exploitables directement par un concepteur de page HTML et ceci, à l'aide d'un éditeur de pages web tel que Macromedia Dreamweaver ou Microsoft Frontpage.

13.1 Déclaration d'un composant wand

Pour être intégré dans une page rhtml, un composant wand utilise la balise <object> et a pour identificateur "clsid:magic-wand". Les différentes propriétés disponibles sont :

Si le comportement d'un composant doit être paramètré, la balise <object> dispose des options <param>.

Exemple:

    <object classid="clsid:magic-wand" id="testpanel" 
        width="300" 
        height="100" 
        border="2" 
        bgcolor="#CC00CC"
        codebase="http://localhost/magic/testpanel-wand.r">
        <param name="caption" value="Panel de test">
        <param name="valdeb" value="1">
        <param name="valfin" value="5">
    </object>

13.2 Création d'un composant wand

Un composant wand est un objet Rebol stocké sur un serveur web. Le composant wand le plus simple a la forme suivante :

    context [
        start: func [] []
    ]

Lorsque Magic! exploite un composant wand, le processus charge l'objet et appelle sa méthode start. L'objet a accès à l'ensemble des données de configuration du processus Magic! et à l'intégralité des données manipulées dans la page rhtml.

wand.png

Un composant wand peut disposer de propriétés et de méthodes. Lorsqu'un paramètre est invoqué dans la balise <object>, celui ci correspond en fait à une propriété publique du composant.

Exemple:

    context [
        caption: make string! ""
        valdeb: make integer! 0
        valfin: make integer! 0

        prt: does [ print "Un sondage...<br>" ]

        start: func [ /local i ] [
            print caption
            br
            prt
            radio-group/selected "sexe" [ "Masculin" "Féminin" ] "Masculin" 
            button "Valider" "Valider"
        ]
    ]

13.3 Exploiter le contenu d'un composant wand

Lorsqu'un composant wand a été exécuté par Magic!, le code rhtml présent dans page peut toujours accéder aux valeurs de ses propriétés et aux valeurs de retour des méthodes à l'aide du nom porté par le composant (id). Ainsi, si le composant wand se nomme testpanel et que celui comporte une propriété retour, il vous est possible de l'exploiter par la syntaxe testpanel/retour. De même, une méthode peut être utilisée ou réutilisée durant l'intégralité du temps de traitement par Magic! de la page rhtml contenant le composant.

[ back to top ]

14 Utilisation du cache

Magic! 2.0 dispose d'un mécanisme de cache permettant de réduire considérable la charge du serveur http et le temps d'attente pour l'obtention d'une page rhtml par le client. Le principe du cache consiste à définir un temps de validité pour une page rhtml: la page n'est reconstruite par Magic! que lorsque ce temps de validité est dépassé. Magic! laisse la possibilité aux concepteurs de choisir si leurs pages doivent ou ne doivent pas être pris en compte par le cache si celui ci est activé.

14.1 Configuration du cache

Pour utiliser le cache, vous devez éditer le fichier magic.cgi et modifier la valeur de la variable m-cache-delay. Si cette variable contient la valeur none, le cache n'est pas actif (le page rhtml appelée est systèmatiquement reconstruite à chaque requête d'un client). Si la variable contient une valeur temporelle telle que 0:5:0, le cache est activé et les pages rhtml disposent ici d'un temps de validité fixé à 5 minutes. Vous devez également créer un sous répertoire nommé cache dans le répertoire contenant vos pages rhtml. Si ce cache n'est pas trouvé, Magic! ignore la valeur de la variable m-cache-delay et reconstruit systèmatiquement les documents rhtml. Ce mode de fonctionnement permet d'avoir sur un même serveur des sites utilisant le cache et d'autres ne l'utilisant pas. Au niveau sécurité, il vous est recommandé d'attribuer le moins de droits possibles sur le ou les répertoires cache (généralement, ils appartiennent à l'utilisateur/groupe groupe apache et ne disposent que du droit 700 afin de limiter la lecture et l'écriture pour cet utilisateur).

14.2 La directive #nocache

Si un site utilise un cache mais contient des pages devant être systèmatiquement reconstruites, vous pouvez insérer dans votre page rhtml la directive <!-- #nocache -->. Si Magic! rencontre cette directive, il ignore le paramètrage du cache et reconstruit systèmatiquement la page.

14.3 Performances du cache

Configuration du serveur :

Configuration de l'injecteur:

cache.png

[ back to top ]

15 Personaliser l'environnement d'exécution d'un utilisateur

Par défaut, l'ensemble des utilisateurs partage le même environnement. Les librairies sont stockées dans le M-LIBRARY-PATH, les sessions et les applications dans le M-SESSIONS-PATH. Dans certain cas, l'administration du serveur peut nécessiter la création d'environnements particuliers. Ces opérations sont réalisables à l'aide de deux fichiers qui sont:

15.1 Le fichier user-magic.conf

Ce fichier est créé par l'utilisateur à la racine de son site. Le dialecte d'administration ne contient qu'une seule commande lui permettant de fixer la durée de validité du cache de Magic!.

Exemple:

    [
        cache-delay: 2:0:0
    ]

15.2 Le fichier admin-magic.conf

Ce fichier est créé par l'administrateur du serveur à la racine du site de l'utilisateur. Pour éviter que l'utilisateur ne le modifie, il vous est recommandé de fixer les droits en lecture seule. Le dialecte d'administration dispose de deux commandes qui sont:

Exemple:

    [
        library-path: %/var/www/apl/utilisateur1/lib/
        session-path: %/var/www/apl/utilisateur1/sessions/
    ]
[ back to top ]

16 Gestion de la sécurité

Magic! tient en compte des problèmes de sécurité posés par l'utilisation de pages RHTML, contenant du code exécuté par le serveur HTTP. La politique de sécurité fixe donc des limites à la liberté de l'utilisateur :

La stratégie de sécurité est donc :

    file [ throw all ]  
    (curdir) allow
    (m-library-path) [ allow read ]
    (m-sessions-path) allow
    (m-cache-path) allow

Vous avez la possibilité de la modifier en éditant le code du fichier MAGIC.CGI.

[ back to top ]

17 Envoyer et recevoir des cookies

Magic! met à la disposition du programmeur deux fonctions dédiées à l'exploitation des cookies :

17.1 Setcookie

La fonction SETCOOKIE reçoit au minimum deux paramètres qui sont le nom du cookie et la valeur de ce dernier.

    setcookie "moncookie" "valeur du cookie"

Quatre raffinements permettent d'affiner le comportement du cookie :

Le champs EXPIRES permet de définir la durée de vie d'un cookie. Si cette information est absente, le cookie a une existence limitée à la session du client : lorsque le client quitte le navigateur, le cookie est effacé. Il est possible de spécifier une "date limite de consommation".

Le PATH permet de spécifier un chemin du domaine d'appartenance du cookie (champ optionnel DOMAIN) pour lequel le cookie est envoyé au serveur. Avant de retourner un cookie à un serveur, votre navigateur vérifie que votre requête concerne bien le domaine et le chemin pour lesquels le cookie est autorisé à voyager. Le rôle de cette fonctionnalité est d'éviter que les cookies puissent être lus par un autre serveur que celui qui les a créés. Si le PATH est fixé à la valeur /, l'envoi d'un cookie par un poste client est autorisé pour l'ensemble des URL du serveur d'origine.

Si un cookie est marqué SECURE, il n'est transmis à un serveur que si celui-ci est sécurisé par une méthode de chiffrement de type SSL.

17.2 Getcookie

La fonction GETCOOKIE permet de récupérer la valeur d'un cookie. Si celui-ci n'existe pas, la fonction retourne la valeur NONE.

    valeur: getcookie "moncookie"

17.3 Exemple d'utilisation

L'exemple suivant est composé de deux pages RHTML. La première (SAMPLE4_1.RHTML) envoie un cookie nommé "sample41" et contenant la valeur "test".

    <html>
    <head><title>Sample4_1</title></head>
    <body>
    <rebol>
        setcookie "sample41" "test"
    </rebol>
    Le cookie "sample41" a été envoyé, <a href="sample4_2.rhtml">cliquez ici</a> pour lire sa valeur
    </body>
    </html>

Une fois que l'utilisateur a cliqué sur le lien, la page SAMPLE4_2.RHTML est exécutée. La valeur du cookie est récupérée et affichée dans le navigateur :

    <html>
    <head><title>Sample4_2</title></head>
    <body>
    <rebol>
        print [ "le cookie 'sample41' a la valeur : " (getcookie "sample41") ]
    </rebol>
    </body>
    </html>
[ back to top ]

18 Travailler avec des modèles de document

La fonction template suivi du nom d'un fichier permet d'inclure un modèle de document dans votre page rhtml. Ce fichier est une page rhtml pouvant contenant des balises <rebol> et </rebol>. Des variables peuvent être directement incluses dans ce fichier: elles sont entourés par les balises <%= et =>.

    <rebol>
        print now/time
    </rebol>
    <form>
        <input type="field" value=<%=nom%>>
        <input type="field" value=<%=prenom%>>
        <input type="hidden" name="MAGICSESSID" value=<%=MAGICSESSID%>>
    <rebol>
        print now/date
    </rebol>
    </form>

Généralement, les modèles de document sont spécifiques à un projet et résident donc dans l'arborescence de l'application web qui les utilise. Si des templates doivent être partagés entre différentes applications, il vous est possible de les stocker dans le répertoire M-LIBRARY-PATH et de les utiliser à l'aide du raffinement /shared.

Exemple:

    <html>
    <head></head>
    <body>
        <rebol>
            template/shared %entete.rhtml
        </rebol>
    </body>
    </html>
[ back to top ]

19 Fonctions utilitaires

19.1 Activer le mode de deboggage

Magic! dispose d'un mode de deboggage qui provoque la division de l'écran en deux zones. Sur la droite, la page html est affichée. Sur la gauche, les traces générées par le programmeur et le temps d'exécution de la page dynamique sont consultables. L'envoi de données sur la zone de deboggage est réalisé à l'aide de la fonction debug. L'activation du mode deboggage est déclenché automatiquement lorsque Magic! exécute la première instruction debug rencontrée.

Exemple:

    <html>
        <head></head>
        <body>
            print "Démontration du mode de deboggage"
            <rebol>
                repeat i 10 [
                    debug [ "valeur de i = " i ]
                ]
            </rebol>
        </body>
    </html>

19.2 Manipuler l'entête HTTP

La fonction HEADER permet la construction d'un entête HTTP personnalisé. La valeur par défaut ("Content-type: text/html") peut ainsi être modifiée afin d'utiliser les différentes directives du protocole HTTP.

L'exemple suivant modifie le type MIME du document généré par la page SAMPLE5_1.RHTML en le fixant sur text/plain :

    <rebol>
        header "Content-type: text/plain"
        print "Cette page est une simple page de texte"
    </rebol> 

19.3 Redirection

A l'aide de la fonction REDIRECT, une page RHTML peut générer une redirection vers un autre document. L'argument de cette fonction est une url ou une chaine de caractères.

    <rebol>
            redirect http://monserveur/monautrepage.rhtml
    </rebol>

    <html>
    <head></head>
    <body>
    Ce texte n'apparaît pas sur l'écran
    </body>
    </html>

19.4 Redirection vers une page d'erreur

A l'aide la fonction ON-ERROR, il est possible de rediriger l'exécution d'une application vers une page html ou rhtml. L'argument de cette fonction est une url ou une chaine de caractères.

    <rebol>
            on-error "mapagerreur.html"
    </rebol>
    <html>
    <head></head>
    <body>
            <%=2 / 0%>
    </body>
    </html>

19.5 Manipuler des couleurs en RGB

La fonction TO-HTMLCOLOR suivi d'une couleur exprimée en RGB retourne le code de la couleur dans le format HTML.

    to-htmlcolor 255.255.0
    >> "#FFFF00"

19.6 Obtenir les variables d'environnement

La fonction MAGIC-ENV génére un tableau affichant les variables d'environnement CGI.

19.7 Réécriture d'url

La fonction rewrite-url reçoit en paramètre une url ou une chaine de caractères. Elle retourne une url contenant le MAGICAPPID et le MAGICSESSID.

[ back to top ]

20 Obtenir la version de Magic!

La fonction MAGIC-VERSION retourne le numéro de version de Magic!.

[ back to top ]

21 Utiliser les composants HTML

A partir de la version 2.0, Magic! est livré avec un ensemble de composants HTML de haut niveau. Ces composants sont stockés dans le fichier html.r qu'il vous faut copier dans le répertoire contenant les librairies partagées de Magic!. L'apparence de ces composants est paramètrable à l'aide de la feuille de style magic.css.

    body - fond de la page html
    a:hover - lien hypertexte survolé
    a:active - lien hypertexte
    a:visited - lien hypertexte visité
    a.calendar - lien hypertexte dans le composant calendar
    a.article - lien hypertexte sur l'annonce d'un article
    a.news - lien hypertexte sur une news
    span.news - texte décrivant les news
    span.resultsselected - numéro d'un résultat de recherche sélectionné
    th.magic - entête des tableaux générés par Magic!
    th.menulist - entête d'un menu de navigation
    th.news - Entête d'une zone de news
    th.calendar - entête du composant calendar
    th.rss - entête d'un tableau pour le composant rss-channel
    td.magic - cellule des tableaux générés par Magic!
    td.magicalt - couleur alternative pour les cellules des tableaux
    td.calendar - cellule du tableau pour le composant calendar
    td.selected - cellule sélectionnée dans le composant calendar
    td.highlight - date courante dans le composant calendar
    p.small - paragraphe de texte avec une petite fonte 
    p.normal - paragraphe de texte avec une fonte normale
    p.medium - paragraphe de texte (taille moyenne et caractères gras)
    p.title - paragraphe de texte (taille maximum et caractères gras)
    div.css - calque

Certain composants html dispose d'un raffinement link qui autorise la génération d'url à la volée. La valeur courante (la date pour le composant calendar, la valeur d'une colonne pour le datagrid, etc.) est stockée dans la propriété html/value. Pour chaque donnée traitée, le bloc de code Rebol est évalué et sa valeur de retour est utilisée pour constituer un lien hypertexte.

    datagrid/columns/link data [ "Nom" "Prenom" ] [
        join "http://serveur/page?cle=" html/value 
    ] 

21.1 Localiser les composants html

Si vous désirez utiliser différentes langues, la librairie html.r dispose de l'objet MAGIC-LOCALE qui recense les différents textes utilisés par les composants html fournis.

    login - Compte utilisateur
    password - Mot de passe
    validate - Opération de validation

21.2 Mise en page

21.2.1 br

    USAGE:
            BR /count nbr

    DESCRIPTION:
            Insère un ou plusieurs retours à la ligne
            BR is a function value.

    REFINEMENTS:
            /count
                nbr -- Nombre de retours à la ligne (Type: any)

Exemple:

    br/count 2

21.2.2 hr

    USAGE:
            HR

    DESCRIPTION:
            Insère une ligne de séparation
            HR is a function value.

21.2.3 center

    USAGE:
            CENTER code

    DESCRIPTION:
            aligne au centre de l'écran
            CENTER is a function value.

    ARGUMENTS:
            code -- (Type: block)

Exemple:

    center [
        print now/time
    ]

21.2.4 code

    USAGE:
            CODE cde 

    DESCRIPTION:
             Affichage avec une police à pas fixe (avec retours à la ligne) 
             CODE is a function value.

    ARGUMENTS:
             cde -- Code Rebol évalué (Type: block)

21.2.5 grid

grid.png

    USAGE:
            GRID code

    DESCRIPTION:
            Affiche des éléments dans un tableau
            GRID is a function value.

    ARGUMENTS:
            code -- Code Rebol évalué (Type: block)

Chaque ligne est définie par trois éléments qui sont l'alignement horizontal('left, 'center ou 'right), l'alignement vertical ('top, 'middle, 'bottom,'baseline) et l'élément devant être affiché. Si l'élément est une valeur, elle est affichée. Si l'élément est un bloc, le code contenu est évalué.

Exemple:

    grid [
        [
            [ 'right 'middle "Votre nom:" ]
            [ 'left 'middle [ field "nom" "Auverlot" ] ]
        ]
        [
            [ 'right 'middle "Votre prénom:" ]
            [ 'left 'middle [ field "prenom" "Olivier" ] ]
        ]
        [
            [ 'right 'top "Votre sexe:" ]
            [ 'left 'top [ 
                radio-group/selected "sexe" [ "Masculin" "Féminin" ] "Masculin" ] 
            ]
        ]
    ]

21.2.6 fieldset

fieldset.png

    USAGE:
            FIELDSET name code

    DESCRIPTION:
            Affiche un groupe de champs de saisie
            FIELDSET is a function value.

    ARGUMENTS:
            name -- Nom du groupe (Type: string)
            code -- Code Rebol évalué (Type: block)

Exemple:

    fieldset "Langages utilisés" [
        checkbox-group "langages" [
            "Rebol"
            "Lisp"
            "Java"
            "Logo"
        ]
    ]

21.2.7 css

    USAGE:
            CSS url

    DESCRIPTION:
            Insère une feuille de style dans la page html
            CSS is a function value.

    ARGUMENTS:
            url -- Feuille de style (Type: string url)

Exemples:

    css "magic.css"
    css http://monserveur.domaine.org/proj/magic.css

21.2.8 box

    USAGE:
        BOX name xy wh code /noborder /zindex zidx /backcolor bcol 

    DESCRIPTION:
        Définition d'un calque 
        BOX is a function value.

    ARGUMENTS:
        name -- Nom du calque (Type: string)
        xy -- Coordonnées de départ (Type: pair block)
        wh -- Dimensions (Type: pair block)
        code -- Composants présents dans le cadre (Type: block)

    REFINEMENTS:
        /noborder -- Pas de bordure
        /zindex
            zidx -- Position verticale (Type: integer)
        /backcolor
            bcol -- Couleur de fond (Type: tuple)

Exemples:

    box "calque1" 1x1 100x100 [ text "calque1" ]
    box "calque2" 100x1 [ "100%" 100 ] [ text "calque2" ]
    box/noborder "calque3" 100x100 [ "100%" "auto" ] [ text "calque3" ]
    box/zindex "calque4" 200x200 100x100 [ text "au dessus" ] 10

21.3 Construction de formulaires

21.3.1 webform

    USAGE:
            WEBFORM name action method code /enctype ct /rewrite

    DESCRIPTION:
            Insertion d'un formulaire
            WEBFORM is a function value.

    ARGUMENTS:
            name -- Nom du formulaire (Type: string)
            action -- page rhtml ou script CGI recevant les données du formulaire (Type: string url)
            method -- méthode utilisée pour l'envoi ('get ou 'post) (Type: word)
            code -- Description du formulaire (Type: block)

    REFINEMENTS:
            /enctype
                ct -- Type du contenu (Type: string)
            /rewrite -- Insertion automatique du MAGICAPPID et du MAGICSESSID

Exemple:

    webform/rewrite "Utilisateur" "enregistre.rhtml" 'post [
        grid [
            [
                [ 'right 'middle "Votre nom:" ]
                [ 'left 'middle [ field "nom" "" ] ]
            ]
            [
                [ 'right 'middle "Votre prénom:" ]
                [ 'left 'middle [ field "prenom" "" ] ]
            ]
            [
                [ 'right 'top "Votre sexe:" ]
                [ 'left 'top [ radio-group/selected "sexe" [ "Masculin" "Féminin" ] "Masculin" ] ]
            ]
            [
                []
                [ 'right 'middle [ submit "Valider" ] ]
            ]
        ]
    ]

21.3.2 submit

    USAGE:
            SUBMIT txt

    DESCRIPTION:
            Insère un bouton de soumission
            SUBMIT is a function value.

    ARGUMENTS:
            txt -- Intitulé du bouton (Type: string)

21.3.3 reset

    USAGE:
            RESET txt

    DESCRIPTION:
            Insère un bouton de réinitialisation
            RESET is a function value.

    ARGUMENTS:
         txt -- Intitulé du bouton (Type: string)

21.3.4 field

    USAGE:
            FIELD name value /width size /length maxlength /label txt /password

    DESCRIPTION:
            Insertion d'un champ de saisie
            FIELD is a function value.

    ARGUMENTS:
            name -- Nom du champ (Type: string)
            value -- Valeur du champ (Type: any-type)

    REFINEMENTS:
            /width
                size -- Largeur de la zone de texte (Type: integer string)
            /length
                maxlength -- Nombre maximal de caractères (Type: integer)
            /label
                txt -- Intitulé du champ (Type: string)
            /password -- Saisie cachée

21.3.5 textarea

    USAGE:
            TEXTAREA name data /label txt /width w /height h /wrap mode /readonly

    DESCRIPTION:
            Affichage d'une zone de saisie à plusieurs lignes
            TEXTAREA is a function value.

    ARGUMENTS:
            name -- Nom du champ (Type: string)
            data -- Valeur d'initialisation du champ (Type: any-type)

    REFINEMENTS:
            /label
                txt -- Intitulé du champ (Type: string)
            /width
                w -- Largeur du champ en caractères (Type: integer)
            /height
                h -- Nombre de lignes (Type: integer)
            /wrap
                mode -- Active le retour à la ligne ('virtual ou 'physical) (Type: word)
            /readonly -- Champ en lecture seule

Exemple:

    textarea/label/width/height/wrap "zone" "texte d'initialisation" 
        "Zone de saisie:" 20 4 'physical

21.3.6 text-list

textlist.png

    USAGE:
            TEXT-LIST objectname data /selected key /size siz /multiple

    DESCRIPTION:
            Affichage d'une liste de valeur
            TEXT-LIST is a function value.

    ARGUMENTS:
            objectname -- Nom de la liste (Type: string)
            data -- Données affichées (Type: block)

    REFINEMENTS:
            /selected
                key -- Valeur d'initialisation (Type: integer string)
            /size
                siz -- Nombre d'éléments visibles (5 par défaut) (Type: integer)
            /multiple -- Plusieurs choix sont autorisés

Exemples:

    text-list/size/selected "lignes" [ "ligne1" "ligne 2" "ligne 3" ] 10 "ligne 3"
    text-list/size/selected/multiple "lignes" [ 
        [ 1 "ligne1" ] [ 2 "ligne 2" ] [ 3 "ligne 3" ] 
    ] 10 2

21.3.7 radio

    USAGE:
            RADIO name value /checked

    DESCRIPTION:
            Insère un bouton radio
            RADIO is a function value.

    ARGUMENTS:
            name -- Nom du bouton (Type: string)
            value -- Valeur du bouton (Type: string block)

    REFINEMENTS:
            /checked -- Sélection du bouton radio

Exemples:

    radio "rad1" "Choix 1"
    radio/checked "rad1" [ 100 "Choix 2" ]

21.3.8 checkbox

    USAGE:
            CHECKBOX name value /checked

    DESCRIPTION:
            Insère une case à cocher
            CHECKBOX is a function value.

    ARGUMENTS:
            name -- Nom du checkbox (Type: string)
            value -- Valeur du checkbox (Type: string block)

    REFINEMENTS:
            /checked -- Sélection du checkbox

Exemples:

    checkbox/checked "ch1" "Choix 1"
    checkbox "ch2" [ 100 "Choix 2" ]

21.3.9 radio-group

radio-group.png

    USAGE:
            RADIO-GROUP objectname data /selected key /across

    DESCRIPTION:
            Affichage d'un groupe de bouton radio
            RADIO-GROUP is a function value.

    ARGUMENTS:
            objectname -- Nom du groupe (Type: string)
            data -- Intitulés des boutons (Type: block)

    REFINEMENTS:
            /selected -- Sélection d'un bouton radio du groupe
                key -- Valeur d'initialisation (Type: integer string)
            /across -- Placement horizontal des boutons

Exemple:

    radio-group/selected "test3" [
        [ 1 "Premier radio" ]
        [ 2 "Second radio" ]
        [ 3 "Troisième radio" ]
    ] 3

21.3.10 checkbox-group

checkbox-group.png

    USAGE:
            CHECKBOX-GROUP objectname data /selected key /across

    DESCRIPTION:
            Affichage d'un groupe de cases à cocher
            CHECKBOX-GROUP is a function value.

    ARGUMENTS:
            objectname -- Nom du groupe (Type: string)
            data -- Intitulé des cases (Type: block)

    REFINEMENTS:
            /selected -- Sélection d'une case à cocher du groupe
                key -- Valeur(s) d'initialisation (Type: integer string block)
            /across -- Placement horizontal des cases à cocher

Exemple:

    checkbox-group/selected "ch" [
        "premier check"
        "second check"
    ] "second check"

    checkbox-group/selected "ch" [
        [ 1 "premier check" ]
        [ 2 "second check" ]
    ] [ 1 2 ]

21.3.11 file

    USAGE:
            FILE name /accept filter

    DESCRIPTION:
            Envoi d'un fichier vers le serveur
            FILE is a function value.

    ARGUMENTS:
            name -- Nom du champ (Type: string)

    REFINEMENTS:
            /accept
                filter -- Filtre sur les types de fichier acceptés (Type: string)

Exemple:

    webform/enctype "envoidata" "mapage.rhtml" 'post [
        prin "Choisissez un fichier:"
        br
        file/accept "envoifichier" "*.r,*.txt"
        br/count 2
        submit "Valider"
    ] "multipart/form-data"

21.3.12 hidden

    USAGE:
            HIDDEN name value

    DESCRIPTION:
            Insère un champ caché
            HIDDEN is a function value.

    ARGUMENTS:
            name -- Nom du champ (Type: string)
            value -- Valeur du champ (Type: string)

21.4 Présentation formatée de données

21.4.1 list

list.png

    USAGE:
            LIST data /toc /link code

    DESCRIPTION:
            Affiche une liste de valeurs précédées chacune d'une puce
            LIST is a function value.

    ARGUMENTS:
            data -- (Type: block)

    REFINEMENTS:
            /toc -- Utilisation du mode plan
            /link
                code -- Code exécuté pour chaque élément (Type: block)

Exemple:

    list [ 
       "Element 1" "Element 2" [ 
           "Sous élément A" "Sous élément B" 
       ] 
       "Element 3" 
    ]

21.4.2 toc

toc.png

    USAGE:
            TOC data /link code

    DESCRIPTION:
        Affiche une liste sous la forme d'un plan
            TOC is a function value.

    ARGUMENTS:
            data -- (Type: block)

    REFINEMENTS:
            /link
                code -- Code exécuté pour chaque élément (Type: block)

Exemple:

    toc/link [ 
        "Introduction" 
        "Chapitre 1" 
        [ "Partie 1" "Partie 2" ] 
        "Chapitre 2" 
        [ "Partie 1" "Partie 2" ] 
        "Conclusion" 
    ] [ join "http://monserveur/mapage.rhtml?rubrique=" html/value ]

21.4.3 datagrid

datagrid.png

    USAGE:
            DATAGRID data /noborder /columns col /link code /checkbox namecheckbox vccolumn /radio nameradio vrcolumn /image url /nospacing /alt /width w

    DESCRIPTION:
            Affiche un tableau construit dynamiquement à partir de données
            DATAGRID is a function value.

    ARGUMENTS:
            data -- (Type: block)

    REFINEMENTS:
            /noborder -- Pas de bordure
            /columns -- Affichage du nom des colonnes
                col -- Noms des colonnes (Type: block)
            /link
                code -- Code généré pour chaque élément (Type: block)
            /checkbox -- Affichage de cases à cocher
                namecheckbox -- Nom des checkbox (Type: string)
                vccolumn -- Numéro de la colonne contenant la valeur du checkbox (Type: integer)
            /radio -- Affichage de boutons radio
                nameradio -- Nom des boutons radio (Type: string)
                vrcolumn -- Numéro de la colonne contenant la valeur du bouton radio (Type: integer)
            /image -- Affichage d'une image
                url -- Chemin d'accès (Type: string url)
            /nospacing -- Pas d'espace entre les colonnes
            /alt -- Utilise une seconde couleur pour l'affichage des lignes
            /width
                w -- Largeur du tableau (Type: integer string)

Exemple:

    datagrid/columns/radio/noborder/nospacing/link buffer
            [ "Nom" "Prenom" ]
            "rad" 1
            [ join "http://lazarus/page.rhtml?cle=" html/value ]
        datagrid/columns/alt data [ "Nom" "Prenom" ]

    datagrid/nospacing/noborder/columns/image/alt data [ "Nom" "Prenom" ] "ico1.gif"

21.4.4 text

text.png

    USAGE:
            TEXT str /small /normal /medium /title

    DESCRIPTION:
            Affiche un texte
            TEXT is a function value.

    ARGUMENTS:
            str -- chaîne de caractères (Type: string block)

    REFINEMENTS:
            /small -- Petits caractères
            /normal -- Texte standard
            /medium -- Taille intermédiaire
            /title -- Gros caractères

Exemples:

    text "hello"
    text/small "Petit"
    text/normal "Normal"
    text/medium "Medium"
    text/title "Titre"

21.5 Interactivité

21.5.1 drop-down

drop-down.png

    USAGE:
            DROP-DOWN objectname data /action destination /selected key /label txt /rewrite

    DESCRIPTION:
            Affichage d'une liste déroulante
            DROP-DOWN is a function value.

    ARGUMENTS:
            objectname -- Nom de la liste (Type: string)
            data -- Données affichées dans la liste (Type: block)

    REFINEMENTS:
            /action -- Appel d'une page suite à la sélection d'une valeur
                destination -- Page de destination (Type: string url)
            /selected -- Sélection d'une ligne de la liste
                key -- Valeur d'initialisation (Type: integer string)
            /label -- Affichage d'un label
                txt -- Intitulé du label (Type: string)
            /rewrite -- Insertion automatique du MAGICAPPID et du MAGICSESSID

Exemple:

    drop-down/action/selected/label "lettre" [ 
        "A" "B" "C" "D" "E" "F" "G" 
    ] "db.rhtml" lettre "Choisissez la première lettre:"

21.5.2 icon-group

icon-group.png

    USAGE:
            ICON-GROUP data /across /pad lg /link code

    DESCRIPTION:
            Affichage d'un menu d'icones
            ICON-GROUP is a function value.

    ARGUMENTS:
            data -- image, intitulé et page de destination pour chaque icone (Type: block)

    REFINEMENTS:
            /across -- Placement horizontal des icones
            /pad -- Ecart entre les icones
                lg -- Nombre de pixels (Type: integer)
            /link -- Génération d'une url pour chaque journée
                code -- Code Rebol (Type: block)

Exemple:

    icon-group/across/pad/link [
        [ "ico1.gif" "Valider" "page.rhtml" ]
        [ "ico2.gif" "Abandonner" "page.rhtml" ]
        [ "ico3.gif" "Fichier" "page.rhtml" ]
    ] 10 [ join html/value ".rhtml" ]

21.5.3 calendar

calendar.png

    USAGE:
            CALENDAR /set-date dt /selected selection-dates /link code

    DESCRIPTION:
            Affichage d'un calendrier
            CALENDAR is a function value.

    REFINEMENTS:
            /set-date -- Fixe la date de référence
                dt -- Date de référence (Type: date)
            /selected -- Sélection d'une plage de temps
                selection-dates -- Dates de début et de fin de la plage (Type: block)
            /link -- Génération d'une url pour chaque journée
                code -- Code Rebol (Type: block)

Exemple:

        calendar/link/selected [ 
            join "http://localhost/script.cgi?cle=" (html/value) 
        ] [ 10/2/2004 15/2/2004 ]

21.5.4 login

login.png

    USAGE:
            LOGIN title url /rewrite

    DESCRIPTION:
            Affiche une boite d'identification
            LOGIN is a function value.

    ARGUMENTS:
            title -- Titre (Type: string)
            url -- Script CGI ou page rhtml de destination (Type: string url)

    REFINEMENTS:
            /rewrite -- Insertion automatique du MAGICAPPID et du MAGICSESSID

Exemples:

    login "Identification" "mapage.rhtml"
    login "Identification" http://monserveur/mapage.rhtml 

21.5.5 button

    USAGE:
            BUTTON caption script

    DESCRIPTION:
            Insère un bouton
            BUTTON is a function value.

    ARGUMENTS:
            caption -- Intitulé du bouton (Type: string)
            script -- Script Javascript ou VBScript (Type: string)

Exemple:

    button "Clickez moi !" "alert('hello, un suis un script Javascript')"

21.5.6 btn-help

    USAGE:
        BTN-HELP url 

    DESCRIPTION:
        Insère un bouton d'aide 
        BTN-HELP is a function value.

    ARGUMENTS:
        url -- Document web contenant l'aide (Type: string url)

21.6 Gestion de contenu (CMS)

21.6.1 menu-bar

menubar.png

    USAGE:
            MENU-BAR data /link code

    DESCRIPTION:
            Affiche une barre de menu horizontale
            MENU-BAR is a function value.

    ARGUMENTS:
            data -- Contenu de la barre de menu (Type: block)

    REFINEMENTS:
            /link
                code -- Code généré pour chaque élément du menu (Type: block)

Exemple:

    menu-bar/link [ 
        [ "Accueil" "index.rhml" ] 
        "Recherche" [ "News" "" ] 
        "Articles" 
    ] [
        join html/value ".html"
    ]

21.6.2 menu-list

menulist.png

    USAGE:
            MENU-LIST data /link code /width lg

    DESCRIPTION:
            Affiche un menu vertical
            MENU-LIST is a function value.

    ARGUMENTS:
            data -- Rubriques et sous rubriques (Type: block)

    REFINEMENTS:
            /link
                code -- Code généré pour chaque sous rubrique (Type: block)
            /width
                lg -- Largeur du tableau en pixels ou en pourcentages (Type: any)

Exemple:

    menu-list/link [
            "Administration" [
                    [ "Edition" "edition.rhtml" ]
                        [ "Suppression" "" ]
        ]
                "Articles" [
                    "Programmer en Rebol"
                    "Rebol et MySQL"
                    "Débuter en Rebol"
                    "VID et GCS"
                    "Rebol contre Java"
                ]
                "Contacts" [
                    "Courrier"
                    "Forum"
                    "Autres sites"
        ]
    ] [ join html/value ".rhtml" ]

21.6.3 image

    USAGE:
        IMAGE name data /width w /height h /label txt /usemap map 

    DESCRIPTION:
        Affichage d'une image 
        IMAGE is a function value.

    ARGUMENTS:
        name -- Nom de l'image (Type: string)
        data -- Fichier contenant l'image (Type: string url)

    REFINEMENTS:
        /width
            w -- Largeur de l'image en pixels (Type: integer)
        /height
            h -- Hauteur de l'image en pixels (Type: integer)
        /label
            txt -- Texte affiché si l'image n'est pas trouvée (Type: string)
        /usemap
            map -- Définition de zones cliquables (Type: block)

Exemple:

    image/width/height/label "monimage" "ico.gif" 100 50 "Une image"
    image/usemap "carte" "france.jpg" [
       [ rect [ 10x10 20x20 ] http://www.geo.org/doc1.html ]
       [ circle [ 30x30 10 ] "dossier2.html" ]
       [ polygon [ 40x40 50x40 90x90 ] "data.rhtml?carte=3" ]
    ]

21.6.4 banner

banner.png

    USAGE:
            BANNER data /target dest

    DESCRIPTION:
            Affichage d'une ou plusieurs bannières publicitaires
            BANNER is a function value.

    ARGUMENTS:
            data -- Images et liens (Type: block)

    REFINEMENTS:
            /target -- Mode d'ouverture de la page
                dest -- 'self, 'top ou 'blank (Type: any)

Exemple:

    banner/target [ %banniere1.gif http://www.rebolfrance.org ] 'blank

21.6.5 article

article.png

    USAGE:
            ARTICLE title url text /subtitle subtext 

    DESCRIPTION:
            Affichage de l'annonce d'un article 
            ARTICLE is a function value.

    ARGUMENTS:
            title -- Titre de l'article (Type: string)
            url -- url vers l'article (Type: url string)
            text -- Contenu de l'article (Type: string)

    REFINEMENTS:
            /subtitle -- Sous titre (compléments, date, etc.)
                subtext -- (Type: any-type)

Exemple:

    article/subtitle "Annonce d'un plugin Rebol" "index.rhtml" {Rebol technologies vient d'annoncer la disponibilité d'un plugin de Rebol/View 1.3 pour Internet Explorer 6.0. Ce produit ouvre de nombreuses perspectives dans le développement d'applications web interactives et place Rebol en concurrent direct des technologies Flash MX et Java.} now/date

21.6.6 news

news.png

    USAGE:
        NEWS data /width lg /noborder /title titre 

    DESCRIPTION:
        Affichage d'une liste de news 
        NEWS is a function value.

    ARGUMENTS:
        data -- news et url (Type: block)

    REFINEMENTS:
        /width
            lg -- Largeur de la zone de news (Type: integer)
        /noborder -- Pas de bordure
        /title
            titre -- Titre (Type: string)

Exemple:

    news/width/noborder [ 
        [ "Mise à jour de Magic! 2.0.2" http://rwst.no-ip.com/magic20 ]
        [ {Retrouvez Rebol dans le magazine Login} http://www.loginmag.com ]
        [ "dernières infos" "index.rhtml" ]
    ] 150

21.6.7 results

results.png

USAGE:

        RESULTS num1 num2 /selected num /link code 

        DESCRIPTION:
            Accés aux pages affichant le résultat d'une recherche 
                RESULTS is a function value.

        ARGUMENTS:
            num1 -- Numéro de la première page (Type: integer)
                num2 -- Numéro de la seconde page (Type: integer)

    REFINEMENTS:
                /selected -- Mise en évidence de la page sélectionnée
                     num -- Numéro de la page sélectionnée (Type: integer)
                /link -- Evaluation du code Rebol pour chaque numéro de page
                     code -- Bloc de code Rebol évalué (Type: block)

Exemple:

    results/link/selected 5 15 [ join "index.rhtml?page=" html/value ] 8

21.6.8 rss-channel

rsschannel.png

    USAGE:
            RSS-CHANNEL url /description /no-border /title titre /width w /length long 

    DESCRIPTION:
            Lecture d'un canal RSS 
            RSS-CHANNEL is a function value.

    ARGUMENTS:
            url -- url du canal RSS (Type: url)

    REFINEMENTS:
            /description -- Utilisation du champ <description>
            /no-border -- Pas de bordure
            /title
                titre -- Affichage d'un titre (Type: string)
            /width
                w -- Largeur en pixels (Type: integer)
            /length
                long -- Nombre d'éléments affichés (Type: integer)

Exemple:

    rss-channel/width/title/length/no-border 
        http://www.apachefrance.com/News/Rss/news-apachefrance.rss 
        150 "ApacheFrance" 5

21.6.9 path

path.png

    USAGE:
            PATH pages /rewrite

    DESCRIPTION:
            Affiche un chemin d'accès vers un document
            PATH is a function value.

    ARGUMENTS:
            pages -- Liste de blocs contenant le nom et l'url du document (Type: block)

    REFINEMENTS:
            /rewrite -- Insertion automatique du MAGICAPPID et du MAGICSESSID

Exemple:

    path/rewrite [
        [ "Accueil" "index.rhtml" ]
        [ "Rubrique" "rubrique.rhtml" ]
        [ "Sous-rubrique" "sousrubrique.rhtml" ]
    ]

21.6.10 popup

    USAGE:
        POPUP url name size /at pos /resizable 

    DESCRIPTION:
           Affiche une fenêtre flottante 
     POPUP is a function value.

    ARGUMENTS:
        url -- url de la page (Type: url string)
        name -- Nom de la fenêtre (Type: string)
        size -- Dimensions de la fenêtre (Type: pair)

    REFINEMENTS:
        /at
            pos -- Position à  l'écran (Type: any)
        /resizable -- Fenêtre redimensionnable

21.6.11 alert

    USAGE:
        ALERT msg 

    DESCRIPTION:
        Affiche une boite d'alerte au chargement de la page 
        ALERT is a function value.

    ARGUMENTS:
        msg -- Message (Type: any-type)

21.7 Fonctions d'impression

21.7.1 btn-print

    USAGE:
            BTN-PRINT caption /redirect url /close

    DESCRIPTION:
            Insère un bouton déclenchant l'impression de la page
            BTN-PRINT is a function value.

    ARGUMENTS:
            caption -- Intitulé du bouton (Type: string)

    REFINEMENTS:
            /redirect
                url -- Redirection suite à l'impression (Type: string url)
            /close -- Fermeture de la fenêtre active suite à l'impression

21.7.2 send-to-printer

    USAGE:
            SEND-TO-PRINTER /redirect url /close

    DESCRIPTION:
            Impression du contenu d'une page
            SEND-TO-PRINTER is a function value.

    REFINEMENTS:
            /redirect
                url -- Redirection suite à l'impression (Type: string url)
            /close -- Fermeture de la fenêtre active suite à l'impression

Exemple:

    <html>
    <head><title>Utilisation de send-to-printer</title></head>
    <body>
        <h1>Titre</h1>
        Cette page est envoyée à l'imprimante
        <rebol>
            send-to-printer
        </rebol>
    </body>
    </html>
[ back to top ]

22 Pour les prochaines versions...

[ back to top ]

23 Mises à jour

[ back to top ]

Document formatter copyright Robert M. Münch. All Rights Reserved.
XHTML 1.0 Transitional formatted with Make-Doc-Pro Version:1.0.9 on 3-Dec-2004 at 9:35:07