Blog

  • Strategy des canards en Swift (a ma sauce)

    [vc_row][vc_column][vc_column_text]protocol ComportementVol{

        func vole()

    }

    class voleAvecDesAiles:ComportementVol{

        func vole(){

        print (« je vole »)

        }

       

    }

    class neVolePas:ComportementVol{

        func vole(){

        print (« je ne vole pas »)

        }

       

    }

    class Canard{

        var comportementVol:ComportementVol?

       func afficher(){

           print (« je suis un canard »)

       }

        func vole(){

            comportementVol?.vole()

        }

    }

    class ColVert:Canard {

        

        override init(){

            super.init()

            comportementVol = voleAvecDesAiles()

        }

        

    }

    class CanardPlastic:Canard{

        override init(){

            super.init()

            comportementVol = neVolePas()

        }

    }

    var canard1:Canard = ColVert()

    canard1.afficher()

    canard1.vole()

    var canard2:Canard = CanardPlastic()

    canard2.afficher()

    canard2.vole()[/vc_column_text][/vc_column][/vc_row]

  • Utiliser la syntaxe php 5.4 sous Aptana Studio 3

    [vc_row][vc_column][vc_column_text]aptana

     

    Pour éviter les erreurs sous Aptana Studio3 lorsque vous utilisez la syntaxe php 5.4 + comme par exemple [] pour array()

    créez un dossier .setting à la racine de votre projet puis dans ce dossier un fichier se nommant com.aptana.editor.php.prefs contenant les lignes suivantes :

    eclipse.preferences.version=1
    phpVersion=php5.4

    relancez Aptana si besoin et c’est bon .

     

     [/vc_column_text][/vc_column][/vc_row]

  • Accessibilité des équipements de la ville de Paris

     

    logoAccessibiliteParis

    télécharger l'application
    Je viens de terminer cette application native pour Iphone dans l’espoir qu’elle puisse rendre service aux personnes cherchant un équipement répondant au niveau d’accessibilité qu’elles désirent.

    Cette première version est une ébauche et je souhaiterais dans les prochaines versions pouvoir y ajouter plus de possibilités d’interaction avec l’usager permettant de pouvoir faire remonter des informations plus ponctuelles du type « l’ascenseur est en panne » ou « l’Accès est momentanément en travaux ».

    Si ce projet vous intéresse et que vous souhaitiez y participer n’hésitez pas à prendre contact avec moi.

    liste des équipementsL’application pour iPhone « Accessibilité des équipements de Paris » répertorie tous les équipements publics de la Ville de Paris. Elle permet de connaître leur niveau d’accessibilité (moteur, visuel, auditif) et de les localiser sur une carte.

     

    La recherche s’effectue à partir des 17 types d’équipements de la Ville : mairies, écoles maternelles et élémentaires, collèges, lycées, crèches, halte-garderies, bibliothèques, piscines, équipements sportifs, conservatoires, jardins, cimetières, bains douches, musées de la Ville, CIO, équipements jeunes.

     

     

    Une fois le type d’équipement sélectionné, l’utilisateur choisit un niveau d’accessibilité sélection du niveau d'accessibilité souhaitéde 0 à 4 pour chaque catégorie de handicap : moteur, visuel, auditif.

    listedes equipements par arrondissements

     

     

     

    L’application fournit alors la liste des équipements correspondant aux différents critères par arrondissement. Chaque équipement fait l’objet d’une fiche comportant adresse, lien internet, avis d’utilisateurs.

     

     

     

     

     

    Une carte permet de situer l’équipement et de mesurer la distance qui en sépare l’utilisateur.

     

    plan

    télécharger l'application

     

    Les données utilisées par cette application proviennent du jeu de données « accessibilité des équipements de la Ville de Paris  » publiés par les services de la Ville sous licence libre ODbL (Open Database Licence).

  • video -HTML5- la librairie mediaelement.js

    L’élément video du HTML5 permet d’intégrer un player video directement dans le code HTML comme img permet d’intégrer une image

    Fantastique, terminé le Flash. Allez hop la video directement intégrée à ma page en tapant juste :

    <video width="400" height="200" src="mavideo.mp4"></video>

    Mais non, pas si simple 🙂
    Premièrement tous nos chers navigateurs ne comprennent pas forcément le HTML5 et ses nouveaux tags magiques, video entre autres
    Parlez en à IE7 ou IE8 ils vous diront ce qu’ils en pensent, il en va de même pour un bon nombre de navigateurs.

    Pour vous en convaincre allez faire un tour sur ce site : http://html5test.com/, qui vous donnera une petite idée de ce que votre navigateur comprend au HTML5.

    si vous utilisez IE7 vous obtenez quelque chose comme ça :

    compatibiliteIE7

     

    Oups …. Arrrg ! direz vous . C’est pas gagné . Faites le même test avec Chrome ça vous redonnera confiance en l’avenir 🙂

    compatibiliteIChrome

    Donc il y’a un premier souci mais peut être vous direz vous que vous vous fichez des vieux machins et que vous êtes résolument tourné vers l’avenir.. C’est alors qu’arrivera le second souci : le CODEC . Même si les choses tendent à se normaliser tous les navigateurs (voir suivant l’OS qui les supporte) ne lisent pas les même formats.

    firefox par exemple supporte le H264 depuis le version 21 sur Vista et la version 25 sur mac :

    Firefox does not natively support MP4 format. Instead it depends on the underlying OS or hardware codec. If you want to play MPEG4 videos, the minimum version required is version 21 for Windows 7, 22 (Windows Vista), 20 (Android), 15 (Firefox OS).

    si le sujet vous intéresse voici quelques liens :

    l’idée n’étant pas ici de décrire la balise video ni ses modalités d’utilisation je ne m’étendrais pas plus sur le sujet. Retenons juste que si je veux être certain de faire plaisir à tout le monde je vais devoir encoder 3 fois mes vidéos en H264/mpeg4, Ogg Theora et webm afin de pouvoir faire un truc comme ça :

    <video width="400" height="200" controls="controls">
      <source src="mavideo.mp4" type="video/mp4" />
      <source src="mavideo.webm" type="video/webm" />
      <source src="mavideo.ogv" type="video/ogg" />
       une alternative pour les navigateurs ne comprenant pas le HTML5
    </video>

    Je ne sais pas pour vous, moi ça m’a vite fait regretter Flash, mais comme je voulais jouer ma vidéo sur Ipad et que flash lui colle des boutons il a fallu en passer par là.
    Le plus drôle étant que l’alternative utilisée en général par les vieux navigateurs reste encore …. Flash.

  • changer de feuille de styles dynamiquement

    Il peut parfois être utile de modifier entièrement la feuille de style d’une page afin d’en changer l’apparence sans devoir recharger la page ou altérer les règles fixées dans la feuille de style.

    Si vous proposez par exemple à l’utilisateur de changer la skin de la page en lui offrant la possibilité d’en visualiser le résultat immédiatement.

     

    Dans cet exemple je vais utiliser 2 css, la première noir_blanc.css habille votre page ne noir et blanc, la seconde couleur.css lui redonne des couleurs.

    voir le résultat >> (c’est très moche mais l’intention est juste d’illustrer le propos :-))

     

    Le principe est très simple :

    1) ajouter une classe à votre appel de css

    	<link class="modifiable" href="css/color.css" rel="stylesheet" />

    ici une classe modifiable qui n’a d’autre but de récupérer l’élément <link > ayant une classe ‘modifiable’ avec un petit script java-script qui modifiera le href de l’élément. Bien entendu c’est le principe qui importe et cet exemple n’a  pas d’autre ambition que de le présenter

     2) ajouter le script:

    <script>
    $(document).ready(function () {
               $('#nbLink').on('click',function(event){
                event.preventDefault();
                $("link.modifiable").attr("href","css/noir_blanc.css");
               })
               $('#colorLink').on('click',function(event){
                event.preventDefault();
                $("link.modifiable").attr("href","css/color.css");
                 })
             })
    </script>

    3)pour finir ne reste plus qu’à créer vos liens avec les mêmes id

    <li><a href="#" id='nbLink' class='lesLiens'>noir et blanc</a></li>
    <li><a href="#" id='colorLink' class='lesLiens'>couleur</a></li>

    un mot encore, vous remarquerez la présence de event.preventDefault(); qui évite au lien ‘#’ de s’appliquer (puisqu’on a supprimer le comportement par défaut du lien) et donc de recharger la page.

  • la classe gest_xml

    Cette classe peut être utilisée indépendamment de facade et offre un ensemble de méthodes permettant de créer, ouvrir, dupliquer, modifier, sauvegarder un fichier xml. Elle permet également de copier le contenu d’un fichier XML dans un autre, d ‘en copier, couper, coller des éléments d’un nœud dans un autre, etc …
    [vc_row][vc_column width= »1/1″][vc_column_text]

    vous pouvez charger la classe ici >>

    [/vc_column_text][vc_column_text]

    Tout d’abord créons une instance de gest_xml

    require_once('Classes/systeme/gest_xml.php');
    $gest = new gest_xml();

    [/vc_column_text][vc_column_text]

    1) Les fichiers

    Si il n’existe pas de fichier à lire le plus simple est d’en créer un :

    a) créer un nouveau document

    deux méthodes sont possibles : La première

    $gest-> init_xml();

    qui se contente de créer un document vide on obtiendra quelque chose qui ressemble à ça :

    La seconde

     $gest->DOM_create_root("racine");

    On obtient alors:

    
    <racine/>

    Qui ajoutera un élément racine à notre document. Le nom de l’élément racine ne peut comporter que des caractères alphanumériques . Aussi si l’on entre la commande suivante:

    $gest->DOM_create_root("raci@_ne");

    Les caractères incorrects seront remplacés par des X et l’on obtiendra le résultat suivant :

    
    <raciXXne/>

    Pour l’instant notre document réside en mémoire mais n’est pas sauvegardé et disparaitra lorsque le script s’achèvera. Cest pouquoi nous allons le sauvegarder pour pouvoir y travailler ultérieurement.

    b) sauvegarder un  document

    Pour sauvegarder le document il nous faut lui donner un nom et un chemin vers le dossier où nous souhaitons qu’il réside en renseignant la propriété doc_name de notre instance en utilisant la méthode set_prop de celle ci .

    $gest->set_prop('doc_name',"xml/mon_premier_ficher.xml");

    alors nous pouvons sauvegarder notre document en utilisant la commande save_doc()

    $gest->save_doc();

    Un nouveau fichier mon_premier_ficher.xml se trouve maintenant dans notre répertoire xml. Attention le dossier cible doit être préalablement créé avant d’effectuer la sauvegarde Le nom du fichier ne doit pas contenir de caractères spéciaux. Nous avons donc créé un fichier et  nous pouvons en faire un second, soit en créant une nouvelle instance soit en utilisant la même, mais nous ne pourrons plus travailler sur notre fichier tant que nous le chargerons pas à nouveau. Si nous passons la commande suivante à l’instance en cours ($gest)

    $gest->DOM_create_root("adresses");

    nous n’aurons plus accès à notre précédent contenu sauvegardons le document :

    $gest->set_prop('doc_name',"xml/carnet_adresse.xml");
    $gest->save_doc();

    et nous voilà à la tête de deux  fichiers XML

    1. mon_premier_ficher.xml
    2. carnet_adresse.xml

     

    c) ouvrir un fichier

    Il est possible de créer maintenant une seconde instance de gest_xml et d’y charger notre premier fichier en appelant la méthode open_doc de l’instance :

    $gest2 = new gest_xml();
    $gest2->open_doc("xml/mon_premier_ficher.xml");

    pour afficher le contenu du fichier on peut utiliser la méthode dump_doc sur l’instance $gest2

    print($gest2->dump_doc());

    qui affichera ceci

    
    <raciXXne/>

    ou en utilisant l’instance $gest

    print($gest->dump_doc());

    qui affichera cela

    
    <adresses/>

    2) manipulation des éléments

    a) créer des nœuds enfants

    Je parlerais dans la suite du document, de nœuds ou d’éléments de manière indifférenciée. Commençons à garnir notre carnet d’adresses de nouveaux éléments afin d’obtenir quelque chose qui ressemble à :

    <adresses>
      <personne>
        <nom />
        <prenom />
        <adresse />
        <telephone />
      </personne>
     </adresses>

    Nous allons dans un premier temps créer un noeud personne qui devra accueillir les nœuds nom, prénom, adresse et téléphone . La création d’un nœud utilise la méthode DOM_add_node en lui passant 2 arguments :

    1. le nœud parent c’est à dire le nœud dans lequel on souhaite le créer (dans le cas de ‘personne’ le nœud parent est ‘adresses’
    2. son nom : ‘personne’

    1) récupération du nœud parent (ici l’élément racine du document) à l’aide de la méthode DOM_get_root

    $root = $gest->DOM_get_root();

    puis création d’un nouveau nœud ‘personne’  que nous conserverons dans la variable $p afin de l’utiliser par la suite

    $p = $gest->DOM_add_node($root,'personne');
    print ($gest->dump_doc();
    <adresses>
      <personne />
    </adresses>

    puis  ajoutons au nœud ‘personne’ les nœuds enfants  comme ceci :

    $gest->DOM_add_node($p,'nom');
    $gest->DOM_add_node($p,'prenom');
    $gest->DOM_add_node($p,'adresse');
    $gest->DOM_add_node($p,'telephone');
    print($gest->dump_doc());

    Le contenu de notre document ressemble à

    <adresses>
      <personne>
        <nom />
        <prenom />
        <adresse />
        <telephone />
      </personne>
    </adresses>

    il peut être intéressant de créer une fonction capable d’ajouter une personne à notre carnet

    function add_personne(){
        $root = $gest->DOM_get_root();
        $p = $gest->DOM_add_node($root,'personne');
        $gest->DOM_add_node($p,'nom');
        $gest->DOM_add_node($p,'prenom');
        $gest->DOM_add_node($p,'adresse');
        $gest->DOM_add_node($p,'telephone');
        $gest->save_doc();
        return ($p);
    }
    // ajout d'une nouvelle entrée au carnet :
    add_personne();

    Une autre méthode nous permet d’ajouter un nœud enfant à un élément DOM_add_node_to_target($node = «  »,$node_dest = «  ») à la différence de la méthode précédente celle ci ne prend pas un nom en argument pour le nœud enfant mais un nœud existant ce qui permet de déplacer des nœuds dans notre xml

    b) ajouter du contenu à un nœud

    Il serait bon maintenant de pouvoir ajouter du contenu à notre nouveau nœud . Comme la fonction que nous venons de créer nous retourne le noeud personne qu’elle vient de créer il va falloir lui préciser lequel de ses enfants nous souhaitons renseigner. Admettons que nous souhaitions ajouter une personne s’appelant Jeanot Lapin habitant 3 impasse du terrier 000000 lapinVille dont le téléphone est le 01 23 45 67 89 nous souhaiterions que notre fichier ressemble à ceci

    <adresses>
      <personne>
        <nom > Lapin</nom >
        <prenom >Jeanot</prenom >
        <adresse >3 impasse du terrier 00000 LapinVille</adresse >
        <telephone >01 23 45 67 89 </telephone >
      </personne>
    </adresses>

    Nous pouvons modifier notre fonction et lui passer ces différents éléments comme argument et utiliser la méthode DOM_make_content dont le rôle est justement d’ajouter du contenu à un élément. La signature de cette méthode est DOM_make_content($node= » », $val_content= » ») 

    function add_personne($gest,$nom,$prenom,âdresse, $telephone){
        $root = $gest->DOM_get_root();
        $p = $gest->DOM_add_node($root,'personne');
        $gest->DOM_make_content($gest->DOM_add_node($p,'nom'), $nom);
        $gest->DOM_make_content($gest->DOM_add_node($p,'prenom'), $prenom);
        $gest->DOM_make_content($gest->DOM_add_node($p,'adresse'), $adresse);
        $gest->DOM_make_content($gest->DOM_add_node($p,'telephone'), $telephone);
        $gest->save_doc();
        return ($p);
    }
    add_personne($gest,'lapin','Jeannot','3 rue des terriers 00000 LapinVille', '0123456789')

    Bien, mais il arrive parfois que l’on souhaite ajouter du contenu non-affichable dans notre fichier. Par exemple il m’est arrivé de  désirer placer  du contenu XML dans certains éléments de mes fichiers XML mais que celui-ci ne soit pas analysé comme élément de la structure qui le contient, ou un fragment HTML ou encore un morceau de code Javascript, une variable JSON…. Dans ce cas la solution consistera à placer ce contenu dans un élément CDATA avec la méthode DOM_add_CDATA elle fonctionne comme la méthode DOM_make_content mais le contenu sera alors ‘enrobé’ dans un élément CDATA ce qui évitera que ce contenu soit analysé à la lecture du fichier. De même certains caractères exotiques, accentués pourraient causer soucis, bien que ce ne soit pas le cas avec nos instances de gest_xml. En effet toutes les valeurs ajoutées au XML sont préalablement ‘utf8 encodés’ et seront ‘utf8 décodées’ lorsque nous les récupérerons plus tard. si mon ami lapin s’appelle Hervé j’obtiens donc avec Dom_make_content

     <prenom>hervé</prenom>

    et avec DOM_add_CDATA

     <prenom><!CDATA[hervé]]></prenom>

    c) ajouter des arguments à un nœud

    Bon, pour l’instant nous n’avons pas ajouté d’attributs à nos éléments. ne serait-ce qu’un id pourtant si efficace lors de notre recherche dans un fichier XML qui peut rapidement dépasser les milliers d’entrées et devenir très délicat à  gérer. Ce qui fera la différence entre une personne et une autre tiendra souvent dans un simple attribut : sa taille, son genre, sa qualité (ami, connaissance, collègue ….)et qui ne justifient pas, dans bien des cas, d’ajouter un nœud enfant pour le gérer. La méthode pour ajouter un identifiant s’appelle DOM_add_node_attribut et sa signature est : DOM_add_node_attribut($nom_att = «  »,$val_att = «  »,$elem = «  ») par exemple

    $root = $gest->DOM_get_root();
    $p = $gest->DOM_add_node($root,'personne');
    $gest -> DOM_add_node_attribut('id','1000',$p);

    générera

    <personne id="1000"/>

    il est possible d’ajouter un autre attribut en appelant de nouveau la méthode sur ce nœud comme ceci

    $root = $gest->DOM_get_root();
    $p = $gest->DOM_add_node($root,'personne');
    $gest -> DOM_add_node_attribut('id','1000',$p);
    $gest -> DOM_add_node_attribut('genre','m',$p);
    $gest -> DOM_add_node_attribut('age','15',$p);

    générera

    <personne id="1000" genre="m" age="15"/>
    ajouter plusieurs attributs

    en utilisant DOM_add_several_arguments_to_node($array_arg = array(), $noeud = «  ») il est possible de créer plusieurs attributs en une fois. L’argument $array_arg est un tableau associatif de type (array(‘attribut’=>’valeur’,…’attribut_n’=>’valeur_n’). Ce qui donnerait pour l’exemple précédent

    $gest->DOM_add_several_arguments_to_node(array('id'=>'1000','genre'=>'m','age'=>'15'),$p);

    plus tranquille 🙂

    ajouter plusieurs nœuds

    De même il est possible de créer plusieurs nœuds possédant différents arguments et différents contenus en utilisant : DOM_add_nodes_chidren($nom_enf = array(), $attrib_enf= array(), $content_enf=array(),$content_format=array(), $noeud_parent= » »).

    • le premier argument de la méthode ($nom_enf) est un simple tableau contenant les noms des différents nœuds enfants que l’on souhaite ajouter
    • le second ($attrib_enf) est également un tableau  qui, pour chaque nœud enfant contiendra un tableau associatif  contenant les attributs . Si un noeud ne possède pas d’attribut on passera un chaine vide à la place du tableau.
    • le troisième ($content_enf) est aussi un tableau contenant le contenu de chaque nouveau nœud.
    • le quatrième ($content_format) précise (ou non) pour chaque contenu s’il s’agit d’un élément Cdata.
    • le dernier argument ($noeud_parent) contient l’élément auquel on souhaite ajouter les nœuds enfants. Si cet argument est omis il ne se passera rien.

    si je souhaite entrer différents nouveaux contacts de genre et d’ages différents je peux procéder ainsi

    $p = $gest->DOM_add_node($root,'personne');
    $gest->DOM_add_several_arguments_to_node(array('id'=>'1','genre'=>'m','age'=>'15'),$p);    
    $gest->DOM_add_nodes_chidren(
         array('nom','prenom','adresse','telephone'),// liste des nom des noeus
         array(array('surnom'=>'le lievre')),//liste de listes d ' attibuts ici surnom s'applique au nœud nom
         array('lapin','jeannot','Impasse des terriers 00000 Lapinville','01 23 45 67 89'),  
         array('','','CData',''),
          $p);
     $p = $gest->DOM_add_node($root,'personne');
     $gest->DOM_add_several_arguments_to_node(array('id'=>'2','genre'=>'f','age'=>'19'),$p);
     $gest->DOM_add_nodes_chidren(
          array('nom','prenom','adresse','telephone'),// liste des nom des noeus
          array(array('surnom'=>'lacanCanne'),'',array('code'=>'007')),//liste de listes d ' attibuts. a noter que le second argument s'applique au noeud 'adresse'
          array('lacanne','jeanne','rue de la mare 00000 Canneville','01 23 45 67 89'),  
          array('','','CData',''),
          $p);

    et j’obtiens

    <adresses>
     <personne id="1" genre="m" age="15">
        <nom surnom="le lievre">lapin</nom>
        <prenom>jeannot</prenom>
        <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse>
        <telephone>01 23 45 67 89</telephone>
     </personne>
     <personne id="2" genre="f" age="19">
       <nom surnom="lacanCanne">lacanne</nom>
       <prenom>jeanne</prenom>
       <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse>
       <telephone>01 23 45 67 89</telephone>
     </personne>
    </adresses>

    3) Rechercher dans le document

    a) récupération d’une liste de nœuds par leur nom

    Maintenant que notre document commence à se remplir il devient pertinent de vouloir en extraire quelque chose. Retrouver un contenu, la valeur d’un argument, un nœud, son parent, ses enfants, une liste de nœuds répondant à certains arguments …. si je souhaite par exemple modifier le nom d’un de mes contacts il va falloir récupérer le nœud ayant ce nom comme contenu et le modifier. Cherchons le noeud nom contenant le texte ‘lapin’. Une première façon d’opérer peut consiter à récupérer dans une liste l’ensemble des noeud ‘nom’ avec la méthode DOM_get_element($nom_elem= »* ») puis faisons une boucle sur la liste de nœuds retournés

    $listNode =$gest->DOM_get_element("nom");
    $nbNodes = count($listNode);
    
    for($i=0;$i<$nbNodes;$i++){
        print($gest->DOM_get_content_node($listNode[$i]).' - ');
    }
    /*
    retourne lapin - lacanne - 
    */

    nous pouvons tester la valeur du contenu du nœud et la modifier si elle contient ‘lapin’ et modifions la

    $listNode =$gest->DOM_get_element("nom");
    $nbNodes = count($listNode);
    
    for($i=0;$i<$nbNodes;$i++){
        if($gest->DOM_get_content_node($listNode[$i])== 'lapin'){
            $gest->DOM_make_content($listNode[$i], 'lapin de garenne');
        }
            print($gest->DOM_get_content_node($listNode[$i]).' - ');
      } 
    /*
    retourne lapin de garenne - lacanne - 
    */

    b) récupération du parent d’un nœud

    si l’âge de lapin a changé il faut modifier l’attribut age du nœud personne le contenant. Pour ce faire il nous faut chercher notre élément lapin, récupérer son nœud parent ‘personne’ et modifier son attribut age. pour récupérer le nœud parent utilisons la méthode DOM_get_parent_node($elem)

    $listNode =$gest->DOM_get_element("nom");
    $nbNodes = count($listNode);
    for($i=0;$i<$nbNodes;$i++){
        if($gest->DOM_get_content_node($listNode[$i])== 'lapin'){
            $gest->DOM_make_content($listNode[$i], 'lapin de garenne'); //mofication du contenu du noeud
            $personne = $gest->DOM_get_parent_node($listNode[$i]); // recupération du noeud parent
            $gest->DOM_add_node_attribut('age','16',$personne);// modification d'un attribut
    
        }
            print($gest->dump_doc());
    <?xml version="1.0" encoding="UTF-8"?>
    <adresses>
     <personne id="1" genre="m" age="16">
      <nom surnom="le lievre">lapin de garenne</nom>
      <prenom>jeannot</prenom>
      <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse>
      <telephone>01 23 45 67 89</telephone>
     </personne>
     <personne id="2" genre="f" age="19">
      <nom surnom="lacanCanne">lacanne</nom>
      <prenom>jeanne</prenom>
      <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse>
      <telephone>01 23 45 67 89</telephone>
    </personne>
    </adresses>

    et voila un lapin de 16 ans. Maintenant dans le cadre d’une étude sur les amis des lapins je souhaiterais ajouter un nœud ‘amis’ aux lapins pour y conserver les numéros de téléphones des personnes de mon carnet qui sont ami avec cet individu.

    c) récupération d’une liste de nœuds à l’aide d’un pattern XPATH

    De nouveau je vais récupérer les nœuds ‘personne’ parents de ceux contenant le texte ‘lapin’ mais plutôt que de faire une boucle sur un ensemble de noeuds de type ‘nom’ je souhaiterais cibler directement tous ceux dont le contenu contient le texte ‘lapin’. Ce pattern XPATH me le permet facilement : « //nom[text()=’lapin’]/parent::personne » et en utilisant le méthode suivante : get_node_by_Xpath($pattern) je vais pouvoir le faire et ajouter un noeud ‘amis’ pour chaque lapin

    $pattern = "//nom[text()='lapin']/parent::personne";
    $listNode = $gest->get_node_by_Xpath($pattern);
    $nbNodes = count($listNode);
    for($i=0;$i<$nbNodes;$i++){
        $gest->DOM_add_node($listNode[$i],'amis');  
    }
    print($gest->dump_doc());

     

    <?xml version="1.0" encoding="UTF-8"?>
    <adresses>
     <personne id="1" genre="m" age="15">
      <nom surnom="le lievre">lapin</nom>
      <prenom>jeannot</prenom>
      <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse>
      <telephone>01 23 45 67 89</telephone>
    <amis/>
    </personne>
    <personne id="2" genre="f" age="19">
     <nom surnom="lacanCanne">lacanne</nom>
     <prenom>jeanne</prenom>
     <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse>
     <telephone>01 23 45 67 89</telephone>
    </personne>
    </adresses>

    l’idée ici n’est pas de présenter le fonctionnement de XPATH mais de montrer les possibiités qu’offre gest_xml dans son utilisation

    d) copier/coller un nœud

    Jeanne lacanne est une amie du lapin il convient donc de récupérer le nœud ‘personne’ qui l’abrite et de le copier dans le noeud ‘amis’ du lapin. Il va falloir : récupérer le nom personne de Lacanne à l’aide de get_node_by_Xpath

    $pattern = "//nom[text()='lacanne']/parent::personne";
    $listNode = $gest->get_node_by_Xpath($pattern);

    le copier avec la méthode DOM_copy_node($node,$profondeur=1) l’attribut $profondeur précise si l’on souhaite récupérer les nœuds enfants s’ils ont pour valeur 1

    $gest->DOM_copy_node($listNode[0],1);

    récupérer le noeud amis du lapin à l’aide de get_node_by_Xpath à l’aide  d’un nouveau pattern: « //nom[text()=’lapin’]/parent::personne/amis »

    $pattern = "//nom[text()='lapin']/parent::personne/amis";
    $listNodesAmis = $gest->get_node_by_Xpath($pattern);

    et enfin y coller le noeud précédemment collé à l’aide de la méthode DOM_paste_node($node_dest) où l’argument

    $node_dest sera le noeud 'amis'
    $gest->DOM_paste_node($listNodeAmis[0]); 
    // même s'il n'y a qu'un nœud le méthode get_node_by_Xpath retourne un tableau
    print($gest->dump_doc());

     

    <adresses>
      <personne id="1" genre="m" age="15">
        <nom surnom="le lievre">lapin</nom>
        <prenom>jeannot</prenom>
        <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse>
        <telephone>01 23 45 67 89</telephone>
        <amis>
          <personne id="2" genre="f" age="19">
            <nom surnom="lacanCanne">lacanne</nom>
            <prenom>jeanne</prenom>
            <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse>
            <telephone>01 23 45 67 89</telephone>
          </personne>
        </amis>
      </personne>
      <personne id="2" genre="f" age="19">
        <nom surnom="lacanCanne">lacanne</nom>
        <prenom>jeanne</prenom>
        <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse>
        <telephone>01 23 45 67 89</telephone>
      </personne>
      <personne id="1000" genre="m" age="15"/>
    </adresses>

    bien entendu le simple id aurait suffit mais pour la démonstration il me semble intéressant de copier tout le nœud ‘personne’ dans ‘amis’. Il est également possible de couper l’élément plutôt que de le copier avec la méthode DOM_cut_node($node,$profondeur=1) identique à la précédente mais qui supprime le nœud d’origine une fois collé.

    <adresses>
      <personne id="1" genre="m" age="15">
        <nom surnom="le lievre">lapin</nom>
        <prenom>jeannot</prenom>
        <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse>
        <telephone>01 23 45 67 89</telephone>
        <amis>
          <personne id="2" genre="f" age="19">
            <nom surnom="lacanCanne">lacanne</nom>
            <prenom>jeanne</prenom>
            <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse>
            <telephone>01 23 45 67 89</telephone>
          </personne>
        </amis>
      </personne>
    </adresses>

    e) importer le contenu d’un fichierXML dans un nœud d’un autre fichier

    il m’est arrivé de vouloir importer le contenu d’un fichier XML dans un autre fichier XML, pour cela j’ai créé une méthode DOM_insert_file_content(). Son utilisation suppose que l’on renseigne un attribut fic_xml avec comme valeur le chemin complet vers le fichier que lon souhaite importer. Tout d’abord sauvegardons notre carnet

    $gest->save_doc();

    ouvrons notre second fichier dans $gest ou une autre instance de gest_xml

    $gest->open_doc("xml/mon_premier_ficher.xml");

    son contenu est

    <?xml version="1.0" encoding="UTF-8"?>
    <raciXXne/>

    ajoutons y un nœud ‘import’ et renseignons l’argument fic_xml pour qu’il fasse reference au xml du carnet

    $root=$gest->DOM_get_root();
    $import=$gest->DOM_add_node($root,'import');
    $gest->DOM_add_node_attribut('fic_xml','xml/carnet_adresse.xml',$import);
    <?xml version="1.0" encoding="UTF-8"?>
    <raciXXne><import fic_xml="xml/carnet_adresse.xml"/></raciXXne>

    lançons l’importation du fichier

    $gest->DOM_insert_file_content();

    enfin vérifions le contenu de notre document

    print($gest2->dump_doc());
    <?xml version="1.0" encoding="UTF-8"?>
    <raciXXne>
    <import fic_xml="xml/carnet_adresse.xml">
    <adresses>
      <personne id="1" genre="m" age="15">
        <nom surnom="le lievre">lapin</nom>
        <prenom>jeannot</prenom>
        <adresse><![CDATA[Impasse des terriers 00000 Lapinville]]></adresse>
        <telephone>01 23 45 67 89</telephone>
        <amis>
           <personne id="2" genre="f" age="19">
            <nom surnom="lacanCanne">lacanne</nom>
            <prenom>jeanne</prenom>
            <adresse code="007"><![CDATA[rue de la mare 00000 Canneville]]></adresse>
            <telephone>01 23 45 67 89</telephone>
           </personne>
         </amis>
       </personne>
      </adresses>
     </import>
    </raciXXne>

    Cette méthode permet de travailler sur un ensemble de fichiers XML indépendant et de les regrouper lorsque le besoin s’en fait sentir. Je n’irai pas plus loin sur les méthodes de la classe gest_xml, un certain nombre ne sont pas documentées ici en voici une liste complète :

    [/vc_column_text][/vc_column][/vc_row]

  • facade

    Facade est un ancien projet que j’ai utilisé en le tordant, le modifiant, pour pouvoir l’utiliser avec PHP bien sur, mais aussi avec actionScript sous Flex ou Flash et plus récemment Javascript. L’idée initiale était (comme son nom l’indique) d’utiliser le pattern du même nom pour ‘masquer la complexité’ des classes sous-jacentes et de leurs méthodes. Rapidement j’y ai ajouté une pincée d’introspection de façon à ce que facade connaisse les méthodes de mes classes métiers en renseignant un fichier XML de configuration

    [vc_row][vc_column width= »1/1″][vc_column_text]

    [/vc_column_text][vc_column_text]

    Le principe de facade est assez simple :

    « Je ne veux voir qu’une tête« ,  c’est à dire que je veux laisser la responsabilité des actions à effectuer à un ensemble de classes métier sans avoir à me soucier de celle qui s’en chargera.

    Par exemple je vais créer une classe perso qui étendra facade et un jeu de classes métier ayant chacune ses propres responsabilités :

     

    • une classe tete qui s’occupera de la tete de mon personnage avec une méthode ‘ouvre Les Yeux’
    • une classe membres qui gèrera les membres (se lever, tendre la jambe)
    • une classe radio qui s’occupera de la radio du personnage (allumer radio, éteindre radio)

    Lorsque mon personnage se réveille il ouvre les yeux, tend la jambe, allume le radio, se lève et éteint la radio.

    D’une façon classique je pourrais instancier chacune de mes classes et appeler la méthode qui convient pour chaque action. Par exemple :

    require_once('Classes/metier/tete.php');
    require_once('Classes/metier/membres.php');
    require_once('Classes/metier/radio.php');
        $tete = new tete();
        $membre= new membres;
        $radio= new radio ;
    
       $tete->ouvreLesYeux();
       $membre->tendreLaJambes();
       $radio ->alumerRadio();
       $membre->seLever();
       $radio->eteindreRadio();

    🙂 rien que ça !

    Je préfère

    $monPerso = new Perso();
    $monPerso->seRéveille();

    et hop !…

    Je ne veux pas me poser la question sur qui a la responsabilité et de quoi ?

    Je veux une classe perso qui ressemble à ça:

    require_once('Classes/facade.php');
    class Perso extends facade {
    	public function seRéveille(){
    		print_r($this->Objets);
    		$this->ouvreLesYeux();
    		$this->tendreLaJambe();
    		$this->alumerRadio();
    		$this->seLever();
    		$this->eteindreRadio();
    	}
    }

     

    Mais où sont les méthodes ?

    Tout est appelé en faisant référence à $this comme si toutes les méthodes appartenaient à la classe perso ou à la classe facade qu’elle étend et pourtant il n’en est rien. Ces méthodes appartiennent bien à mes classes métier.

    En fait la classe facade utilise une méthode magique de PHP __call qui est appelée à chaque fois que l’on fait appel à une méthode non déclarée dans la classe comme ouvreLesYeux, tendreLaJambe ou autre, et exécute alors le code qu’elle contient.

    Lorsque la méthode  __call est appelée, elle reçoit 2 arguments :

    • le nom de la méthode appelée
    • les arguments qui lui on été passés.

     

    Par exemple $this->ouvreLesYeux(). Comme la méthode ouvreLesYeux n’existe pas dans la classe Perso ni dans la classe facade, c’est la méthode __call qui répond en recevant la chaine de caractères ‘ouvreLesYeux‘ comme  argument pour le nom de la fonction et rien en paramètre.

    Une façon classique d’utiliser __call consiste à prévenir de l’erreur comme par exemple :

    public function __call($func, $param) {
    
        print('attention !!! la méthode '.$func.' n'existe pas');
    
    }

    Mais on peut faire beaucoup mieux.

    Dans le cas de facade, les noms et le chemin des classes métier que l’on souhaite manipuler sont renseignées dans un fichier XML comme ceci :

    ini/conf.xml

            <section id="6" nom="classes">
                <item name="tete" val="Classes/metier/tete.php" id="16"/>
                <item name="membres" val="Classes/metier/membres.php" id="16"/>
               <item name="radio" val="Classes/metier/radio.php" id="16"/>
             </section>

    On utilise la classe gest_xml et une classe config spécialisée dans l’interrogation de ce fichier XML pour récupérer les noms des classes.

    C’est la classe facade qui déclenche cette récupération des classes métiers, puis pour chacune d’entre elles effectue un require_once du fichier de la classe et en initialise une instance que l’on conserve dans un tableau associatif $Objets sous la forme :

    $this->Objets['nom classe'] = instance de la classe

    par exemple :

    print_r($this->Objets);
    /* retourne :
    [tete] => tete Object()
    [membres] => membres Object()
    */

     

    Puis c’est à l’aide d’une méthode d’introspection de classe que l’on récupère les méthodes de chaque classe métier : c’est la fonction PHP get_class_methods qui retourne un tableau contenant le nom de chaque méthode.
    Ne reste plus qu’a garnir un tableau associatif au format:

    $this->func['nom methode'] = nom de la classe

    par exemple :

    [ouvreLesYeux] => tete
    [tendreLaJambe] => membres
    [seLever] => membres
    [alumerRadio] => radio

     

    Désormais, avec nos deux tableaux, la méthode __call peut répondre aux appels à des méthodes inconnues en cherchant le nom passé en argument dans la table $func et en faisant quelque chose comme ça :

    $this->Objets['nom classe']->{$func}()

    En fait il faut faire appel à la fonction eval de php pour le faire.

    mettode __call de facade

    public function __call($func='get_name', $param=array()) {
            $tmpClass = @$this->func[$func];
            if(is_null($tmpClass)) {
               return;
            }
    
            $num_param = count($param)-1;
            $i=1;
            $str="\$this->Objets[\$tmpClass]->{\$func}(";
            foreach ($param as $key => $value) {
                if(is_string($value)){$value= "\"".$value."\"";}
                    if($i<=$num_param){
                    $str.=$value.',';
                    }else{
                    $str.=$value;    
                    }
                    $i++;
                    }
                $str.=");";    
    
        eval("\$retour=".$str) ;
        return $retour ;
    
        }

    En résumé:

    1) nous créons nos classes métier et créons les méthodes qui dépendent de leur responsabilité

    2) nous renseignons un fichier XML avec les noms et path de nos classes métier

    3) nous créons une classe héritant de facade et y créons les méthodes que nous souhaitons appeler (seRéveille() par exemple), méthodes qui feront appel à des méthode métier sans se soucier de la classe qui les abrite ni même sans faire d’include ou de require dans notre classe facade

    4) pis voilà c’est terminé je peux maintenant appeler ma mérhode seRéveille() comme ceci :

    require_once(‘Classes/Perso.php’);

    $monPerso = new Perso();
    $monPerso->seRéveille();

     

    [/vc_column_text][vc_column_text]

    diadramma uml1 [facade]
    un dessin en dit parfois plus qu’un long discours

    [/vc_column_text][/vc_column][/vc_row]

  • De simples machines

    De simples machines

    [vc_row][vc_column width= »1/1″][vc_column_text]

    [ Flash CS6 ] : (Framework pureMVC/Fabrication)

    Développement de 6 modules ludo-éducatifs en AS3  .
    Produit par la Cité des sciences, le site en Flash « De simples machines », est un ensemble de
    6 modules ludo-éducatifs destinés aux enfants de 8 à 12 ans, sur le thème des machines simples : plans inclinés, vis,
    leviers, coin, roue, poulies, engrenages.

    Nouveau travail commun avec Benjamin Gibeaux  concevant et améliorant l’architecture mis en place dans les deux précedents projets Ma maison, ma planète et moi et Quand la terre gronde

    VOIR LE SITE >>

    [/vc_column_text][/vc_column][/vc_row]

  • fais moi signe

    [vc_row][vc_column width= »1/2″][vc_column_text]

    Tralalere : fais-moi sifne
    Tralalere : fais-moi signe

    [/vc_column_text][/vc_column][vc_column width= »1/2″][vc_column_text]

    Dans le cadre du projet Vinz & Lou et le handicap

    [ Flash CS 5 ] (pureMVC/fabrication) :

    Quizz Vidéo de sensibilisation à la langue des signes

    Un quiz interactif avec 10 expressions en Langue des Signes Française.

    >> voir le quiz

    [/vc_column_text][/vc_column][/vc_row]