Partage
  • Partager sur Facebook
  • Partager sur Twitter

Imbrication de Blocs Conditionnels

Regex

Sujet résolu
    17 août 2006 à 19:51:17

    Bonsoir,

    Je travaille actuellement sur un Moteur de Templates ( Je sais que Php le Fais très bien mais pour la distribution au public c'est pas le plus évident... donc s'il vous plait épargnez moi les remarques de ce genre :p ) et je bloque sur l'imbrication des Conditions Templates dans ce genre
    <if:"2==2">Azerty<br />
            <if:"4==2">Faux<else>Vrai<endif>
    <else>Qwerty<endif>

    Le problème étant que le Résultat du Preg_match_all() s'arrête au premier <else>... entrainant l'erreur des deux conditions...

    La Fonction est là :
    /* Parse les Conditions Templates
            $nomtpl = Nom du Template à Traiter
    */

    private function Ifs($nomtpl) {
            if(empty($this->Tpls[$nomtpl])) return false;            // Existence Template
            $motif= '`<if:"(.+)">(.+)(<else>(.+))*<endif>`smU';               // Motif de Recherche
            preg_match_all($motif,$this->Tpls[$nomtpl],$res,PREG_SET_ORDER);        // Recherche
            for($i=0;$i<count($res);$i++) {
                    if(!empty($res[$i][1])) {
                        $cond = (eval('return '.$res[$i][1].';') == true) ? 2 : 4// Test de la Condition
                        if(empty($res[$i][3])) $res[$i][4] = '';                // Création du Else
                            $this->Tpls[$nomtpl] = str_replace($res[$i][0],trim($res[$i][$cond]),$this->Tpls[$nomtpl]);          // Remplacement
                    }
            }
            return true;                                // Retour
    }


    J'ai tout dis je crois ...
    Maintenant je suis ouvert à toutes vos Suggestions et remarques.
    Merci de m'avoir lu jusque là et pour votre future aide :) ,
    Bonne Soirée
    • Partager sur Facebook
    • Partager sur Twitter
      17 août 2006 à 20:04:59

      Une suggestion ? DOM XML te permet de résoudre ton problème, et pour un moteur de template ça doir être assez simple avec.

      edit : par contre pas sûr qu'une balise de la forme <bal:"aaa"> ça soit aux normes. C'est <bal attr="aaa"> ou <bal:aaa>, donc dans ton cas je verrais plutôt <if cond="2==2">. Inspire toi peut-être de la syntaxe du XSLT sinon ;)
      • Partager sur Facebook
      • Partager sur Twitter
      Anonyme
        17 août 2006 à 20:24:02

        Ça m'interraisse aussi, si quelqu'un à la solution, ça ce serait chouette d'expliquer comment faire s.v.p :)
        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          17 août 2006 à 20:26:39

          mais le count($res) hors du for, sinon tu recalcule à chaque fois la taille du tableau, ce qui prend un temps fou pour rien.

          Ca doit venir du masque, ca va mieux avec ca?
          '`<if:"(.+)">(.+)(<else>(.+))?<endif>`smU'
          • Partager sur Facebook
          • Partager sur Twitter
            17 août 2006 à 20:38:04

            DomXml 3-4 Problèmes ( non mineurs ) se posent à moi alors :
            >Connaissance très superficielle du Xml
            >Connaissance très superficielle de DomXml
            >Connaissance Nulle de Xslt
            >Refonte des Balises, Blocs, ...
            >...

            EDIT : toutefois si c'est une solution sans grande perte de performances jsuis pret à l'envisager...
            Ok Pour le count()

            Le masque est normal ( un else n'est pas obligatoire )
            J'ai quand même essayé le résultat est le même

            Merci à vous deux :)

            D'autres Suggestions?

            PS: Pour ceux qui traineraient sur le forum d'Expreg `ixM a posé une question similaire à la mienne... sans réponse toutefois :(
            • Partager sur Facebook
            • Partager sur Twitter
              18 août 2006 à 8:25:05

              Citation : RedoX

              Bonsoir,

              Je travaille actuellement sur un Moteur de Templates...

              <if:"2==2">Azerty<br />
                      <if:"4==2">Faux<else>Vrai<endif>
              <else>Qwerty<endif>



              C'est donc ça du template ? o_O
              Je suis content de ne pas en faire alors ! :-°
              Je le vois bien le graphiste écrire ça dans son html sans connaissance aucune de la logique de programmation. C'est tellement évident. ^^

              Citation : RedoX


              if(empty($this->Tpls[$nomtpl])) return false;            // Existence Template
                      $motif= '`<if:"(.+)">(.+)(<else>(.+))*<endif>`smU';               // Motif de Recherche
                      preg_match_all($motif,$this->Tpls[$nomtpl],$res,PREG_SET_ORDER);     

              Fonctionnera jamais sous cette forme et c'est logique, on lui demande de s'arrêter à endif.
              En plus, pour gérer ce genre de truc faut utiliser des masques récursifs.
              Et la récursivité en regex c'est hard à mettre en place et c'est surtout vachement lourd, très lourd et même archi lourd. :-°

              Citation : RedoX


              $cond = (eval('return '.$res[$i][1].';') == true) ? 2 : 4;

              Et alors ça..., c'est juste pour me dégoûter à jamais de ton template.

              T'es occupé à réinventer Smarty !
              • Partager sur Facebook
              • Partager sur Twitter
                18 août 2006 à 8:49:40

                :D

                On a bossé sur ça une fois, et il en est ressorti de la bricole du genre (ce n'est plus la dernière version parce que je ne m'en souviens plus, mais c'est presque ça)

                <(truc)>((?:(?<!</truc>).(?!<truc))*)</\\1>
                • Partager sur Facebook
                • Partager sur Twitter
                  18 août 2006 à 9:06:45

                  C'est pas récursif ça, c'est juste 2 assertions.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 août 2006 à 9:07:45

                    Ouais, mais tu l'executes un certain nombre de fois, et ça vire les balises les plus intérieures à chaque fois.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      18 août 2006 à 10:43:21

                      Citation : RedoX

                      DomXml 3-4 Problèmes ( non mineurs ) se posent à moi alors :
                      >Connaissance très superficielle du Xml
                      >Connaissance très superficielle de DomXml
                      >Connaissance Nulle de Xslt
                      >Refonte des Balises, Blocs, ...
                      >...

                      EDIT : toutefois si c'est une solution sans grande perte de performances jsuis pret à l'envisager...



                      Déjà ça m'etonnerait que ça rame plus qu'avec des regex (normalement...). La connaissance du XSLT ça c'est pas grave, tu peux très bien faire sans, c'etait juste un exemple. La connaissance du XML ça s'arrête à une syntaxe correcte des balises, et DOM XML c'est assez sympa quand on commence à connaître je trouve. Par contre c'est vrai tu devras changer tes balises. DOM provoque une erreur si le document n'est pas well-formed, et là tu utilises des balises que tu ne fermes pas ; j'aurais plutôt vu ça alors :

                      <if test="2==2">
                          <then>ok</then>
                          <else>nok</else>
                      </if>


                      Mais bon comme l'a dit Bison c'est pas forcément évident pour quelqu'un qui connait juste le HTML.
                      Le plus gros problème est que l'extension DOM XML est rarement activée par les hébergeurs gratuits.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 août 2006 à 13:30:24

                        J'attendais la remarque de Bison... qui n'a pas tout à fait tort si ce n'est totalement raison...

                        J'ai voulu réaliser un moteur Simple et me voilà à faire un moteur Smarty-like...
                        J'ai donc un peu trop dépassé de mon Objectif donc je pense que je vais virer les Conditions Templates et m'en tenir aux conditions Php :)

                        Merci quand même pour votre Aide :)
                        6(sic)6 > Cette Idée de DOM m'interesse beaucoup :p Une fosi finalisé ce Projet de Tempaltes Resimplifié Jpense que jvias entammer un projet DOM/Xml/Xslt ( Non pas des Templates ^^ )

                        Merci Encore même si le résultat est la Suppression de Ce module
                        • Partager sur Facebook
                        • Partager sur Twitter
                          18 août 2006 à 13:35:24

                          Euh, tu peux faire un truc simple, mais avec des conditions quand même, non ?
                          • Partager sur Facebook
                          • Partager sur Twitter
                            18 août 2006 à 13:59:09

                            Qu'entend tu par Simple mais Conditionnel ?

                            Conditions Simples ca passe mas iConditions Imbriquées ca passe plus du tout :(
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Anonyme
                              18 août 2006 à 14:02:26

                              Personnellement, mes condition sont comme ceci:

                              {@nom_condition@}Si ma condition est déclaré{@nom_condition@}

                              Dans mon fichier PHP, si je déclare "nom_condition" alors ce qui est entre s'affiche sinon on le supprimer, tout simplement :D
                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 août 2006 à 14:08:07

                                Ouais, j'ai fait pareil que luigi, avec une clause else en plus.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Anonyme
                                  18 août 2006 à 14:12:00

                                  Citation : bluestorm

                                  Ouais, j'ai fait pareil que luigi, avec une clause else en plus.



                                  Tient, c'est une bonne idée :D Je vais essayer de dévellopper là-dessus :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    19 août 2006 à 12:27:14

                                    Luigi > J'ai développé un Bloc Comme Ca mais je comptais mettre en oeuvre des conditions autonomes en Templates...
                                    Je vais rajouter aussi le Else sur mes Instances :) Bonne Idée Bluestorm
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      19 août 2006 à 12:32:47

                                      Hum, en gros tu fais un remake de Blueplates, mais en moins bien :-°
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        19 août 2006 à 19:37:34

                                        Citation : bluestorm

                                        Hum, en gros tu fais un remake de Blueplates, mais en moins bien :-°



                                        Euh :euh: Non ^^

                                        Mon Moteur Actuel Gère :
                                        > Ouverture Simultanée de Plusieurs Fichiers Sans Réinstancier
                                        > Variables
                                        > Blocs
                                        > Instances ( Supprimées si Non Instanciées )
                                        > Inclusion de Templates Ouverts Par Clés
                                        > Affichage ou Retour de Template

                                        Et Dans la Soirée les Instances Doubles ( Comme cité précédement )

                                        Donc Quelques Différences Avec Blueplates :p
                                        MaisBon dans un Sens On retombe Toujorus sur les Mêmes Fonctionnalités :)
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          19 août 2006 à 19:42:20

                                          Citation

                                          > Ouverture Simultanée de Plusieurs Fichiers Sans Réinstancier
                                          > Variables
                                          > Blocs
                                          > Instances ( Supprimées si Non Instanciées )
                                          > Inclusion de Templates Ouverts Par Clés
                                          > Affichage ou Retour de Template


                                          Ahem, je fais tout ce que tu dis, sauf "Instances" qui me semble être un bloc conditionnel, en moins bien.
                                          (évidemment, tu ne le précises pas, mais je gère l'imbrication à fond de tous les composants les uns dans les autres, sinon c'est pas drôle)
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                          Anonyme
                                            19 août 2006 à 19:47:12

                                            Perso, mon moteur de template gère
                                            > Les variables
                                            > Les blocks
                                            > Les conditions
                                            > La mise en cache d'une partie du .tpl
                                            > La possibilité d'actualisé ce qui est dans le cache
                                            > inclusion du .tpl
                                            > Suppression d'un fichier cache
                                            > Possibilité de travailler sur plusieurs fichier en même temps

                                            Bon, quelques regex mais je supprime ça dès que tout fonctionne comme il faut :p
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              19 août 2006 à 19:49:12

                                              Si vous voulez, on donne tous ses sources, on convient d'un template d'exemple commun, et on joue à "qui a la plus grosse ?".
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                19 août 2006 à 19:58:10

                                                Citation : bluestorm

                                                "qui a la plus grosse ?".



                                                Ca sent le vécu :-°
                                                • Partager sur Facebook
                                                • Partager sur Twitter

                                                Imbrication de Blocs Conditionnels

                                                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                • Editeur
                                                • Markdown