GAGA Template

XLetter

Ajouter une balise : switch

Vous devez être inscrit et connecté pour pouvoir écrire dans les forums

Page : 1
Tristou Posté le 28/02/2008 16:48 - #


Membre
60 messages
24 ans
Toujours pour le besoin du site actuellement en construction et pour éviter de voir des if/else/elseif partout, j'aimerais rajouter une balise: le switch.

Alors pourquoi ça ? Et bien dans la gestion de la confimation, selon ce qui est rentré en paramètre de $_GET['conf'], j'affiche les infos correspondantes (par exemple selonsi on confirme l'inscription, la connexion, l'ajout d'un message sur le forum etc0, on n'aura pas la même chose).

Je suppose que dans le fichier gaga.class.php, il faut modifier ceci, ce qui ne devrait pas poser de problème :

public $bal = array(
                        'var' => array('{', '}', '$'),                    // balises des vars
                        'foreach' => array('foreach', 'var', 'as'),                              // balises des blocks
                        'include' => array('include', 'file', 'cache'),   // balises de la fin des blocks
                        'cond' => array('if', 'elseif', 'else', 'cond'),        // balises des condition
                        'com' => array('/#', '#/'));                                    // balises des commentaires


C'est surtout pour parser cette nouvelle balises aux différents endroits (et qu'au moment de compiler, ça transforme bien en un switch en PHP) qu ej'hésite beaucoup.

Merci d'avance

gaga26 Posté le 28/02/2008 18:46 - #



741 messages
18 ans


Il ne suffit pas de modifier l'array contenant la liste des balises pour que comme par magie, mon moteur sache comment l'interpréter. Il faut que tu codes toi-même une méthode pour le faire et que tu l'ajoute dans parse_file().

Tristou Posté le 28/02/2008 19:49 - #


Membre
60 messages
24 ans
Oui je me doute , mais c'est la seule chose qui me semblait évident. Je ne sais pas trop comment faire, il faudrait remplacer les différentes parties du switch par un équivalent pour la partie template. Je suppose que ça sera plus ou moins comme pour les conditions, à savoir ça :

        function parse_condition($c) {
                return preg_replace(array(
                                '`<'.preg_quote($this->bal['cond'][0]).' '.preg_quote($this->bal['cond'][3]).'="(.+)">`sU',
                                '`</'.preg_quote($this->bal['cond'][0]).'>`sU',
                                '`<'.preg_quote($this->bal['cond'][1]).' '.preg_quote($this->bal['cond'][3]).'="(.+)"\s?/?>`sU',
                                '`<'.preg_quote($this->bal['cond'][2]).'\s?/?>`sU',
                        ),array(
                                '<?php if(\1) { ?>',
                                '<?php } ?>',
                                '<?php }elseif(\1){ ?>',
                                '<?php }else{ ?>'
                        ),
                        $c);
        }

gaga26 Posté le 28/02/2008 20:26 - #



741 messages
18 ans
Ouai ouai, c'est plus ou moins pareil.

Tristou Posté le 28/02/2008 22:39 - #


Membre
60 messages
24 ans
Bon, j'ai commencé à developper la méthode, c'est laborieux. Par contre, un truc sur lequel j'hésite :


'`</'.preg_quote($this->bal['switch'][0]).'>`sU',
'`<'.preg_quote($this->bal['switch'][1]).' '.preg_quote($this->bal['cond'][3]).'="(.+)"\s?/?>`sU',
'`<'.preg_quote($this->bal['switch'][2]).'\s?/?>`sU',
 


La question que je me pose, c'est à quoi correspond `sU', et '="(.+)"\s?/?>`sU', ? Et dans quel cas faut-il mettre l'un ou l'autre ? Enfin en tout cas, ça va, je comprends bien la méthode avec laquelle je travaille

EDIT : bon, après pas mal d'heures de taf' et d'essais, voilà où j'en suis

        function parse_switch($c) {
                return preg_replace(array(
                                '`<'.preg_quote($this->bal['switch'][0]).' '.preg_quote($this->bal['switch'][1]).'="(.+)">`sU',
                                '`</'.preg_quote($this->bal['switch'][0]).'>`sU',
                                '`<'.preg_quote($this->bal['switch'][1]).' '.preg_quote($this->bal['switch'][3]).'="(.+)"\s?/?>`sU',
                                '`<'.preg_quote($this->bal['switch'][2]).'\s?/?>`sU',
                        ),array(
                                '<?php switch(\1) { ?>',
                                 '<?php } ?>',       
                                '<?php case : ?>',
                                '<?php break; ?>',                
                        ),
                        $c);
        }
       
                        public $bal = array(   
             // les balises
                public $bal = array(
                        'var' => array('{', '}', '$'),                    // balises des vars
                        'foreach' => array('foreach', 'var', 'as'),                              // balises des blocks
                        'include' => array('include', 'file', 'cache'),   // balises de la fin des blocks
                        'cond' => array('if', 'elseif', 'else', 'cond'),        // balises des condition
                        'com' => array('/#', '#/'),                     // balises des commentaires
            'switch' => array( 'switch', 'var', 'case', 'break' 'defaut'));     
                       


Je change sur un fichier à coté pour pas faire buger toute la classe de template
Dans la méthode, seules les deux premières lignes sont faites, sûres, j'hésite ensuite, voir le problème ci-dessus

Edité par Tristou le 29/02/2008 01:58

Tristou Posté le 29/02/2008 03:53 - #


Membre
60 messages
24 ans
Je me permet de remettre un message parce que sinon, je crains de ne plus être très très lisible vu ce que j'ai mis dans mon post précédent...

Donc, j'y suis allé un peu à l'audace, je teste ailleurs que sur mon site ma balise switch et on va dire que ça marche partiellement :

- au niveau du fichier de classe, pas d'erreur PHP, ça veut donc dire que c'est codé correctement (ouf ). La méthode parse_swich(), pour le moment ça donne ça (mais y'a des choses à changer encore) :

function parse_switch($c) {
                return preg_replace(array(
                                '`<'.preg_quote($this->bal['switch'][0]).' '.preg_quote($this->bal['switch'][1]).'="(.+)">`sU',
                                '`</'.preg_quote($this->bal['switch'][0]).'>`sU',
                                '`<'.preg_quote($this->bal['switch'][2]).'  '.preg_quote($this->bal['switch'][1]).'="(.+)" />`sU',
                                '`<'.preg_quote($this->bal['switch'][4]).'\s?/?>`sU',
                                '`<'.preg_quote($this->bal['switch'][3]).'\s?/?>`sU',
                        ),array(
                                '<?php switch(\1) { ?>',
                                 '<?php } ?>',       
                                '<?php case : ?>',
                                '<?php default : ?>',
                                '<?php break; ?>',                
                        ),
                        $c);
        }


Coté PHP, ça donne simplement ça (comme pour un if en fait) :

$tpl-> assign('conf', $_GET['conf']);


Et du coté du fichier template, ça donne ça :

<switch var="$conf">
         <case var="inscription" />
           ici
          <break />
         <case var="connexion" />
          là
          <break />
         <default />
         pouet
      <break />         
        </switch>


Et dans le fichier compilé, ça ressemble à ça :


    <?php switch($conf) { ?>
         <?php case : ?>
           ici
          <?php break; ?>
         <?php case : ?>
          là
          <?php break; ?>
         <?php default : ?>
         pouet
      <?php break; ?>   
        <?php } ?>
 


Des balises d'ouverture et de fermeture un peu partout c'est pas super joli et comme vous pourrez le remarquer, il me reste à mettre un contenu à case (comme ça -> case 'truc' , là je sèche un peu et surtout quand j'exécute le fichier index.php, j'ai ce super message d'erreur à 10 francs le kilo signe d'une erreur à résoudre :
Parse error: syntax error, unexpected T_INLINE_HTML, expecting T_CASE or T_DEFAULT or '}' in C:\Program Files\wamp\www\test\moteur\compilation\index.compiled.php on line 10

Je pense avoir été complet donc sur ce, je vous souhaite une bonne nuit et merci d'avance pour l'aide future pour arriver à faire fonctionner cette balise

Tibo Posté le 29/02/2008 19:42 - #


Membre
22 messages
Bah à la place de mettre "ici" "là" "pouet" il faut mettre des instructions.
Après pas besoin de variable ici par exemple:
<case var="inscription" />

ou alors faire plutot
<case var="1" />

Tristou Posté le 29/02/2008 20:49 - #


Membre
60 messages
24 ans
Le 'ici', 'là' et 'pouet' que j'ai mis à titre d'exemple, cela correspond au contenu du cas du switch, comme on pourrait avoir ça :

switch($truc)
   {
     case 'truc' :
     echo 'ici';
     break;

     case 'machin' :
     echo 'là';
     break;

     case 'chouette' :
     echo 'pouet';
     break;     
   
     default :
     echo 'hihi';
     break;
   }
 



Ce qu'il faudrait, c'est que le var de la balise template case devienne ce qu'il y a entre les ' ' du case en PHP

Edité par Tristou le 29/02/2008 20:50

Tristou Posté le 02/03/2008 21:54 - #


Membre
60 messages
24 ans
Un petit coup de main gaga ?

gaga26 Posté le 03/03/2008 15:03 - #



741 messages
18 ans
Regarde la fonction parse_condition(), mais personnellement, je trouve que recoder PHP n'est pas une très bonne idées. J'ai ajouter les conditions car on les utilises souvent, mais switch...

Tibo Posté le 03/03/2008 15:16 - #


Membre
22 messages
J'avoue qu'au final c'est se casser beaucoup la tête pour pas grand chose

Tristou Posté le 03/03/2008 17:57 - #


Membre
60 messages
24 ans
Hum, je ne compte pas réinventer la roue, je trouve simplement qu'utiliser un switch est plus pratique que d'utiliser une succession de if, elseif else dans une même page.
Tout ce que j'ai mis ci-dessus est basé sur la méthode parse_condition() et à la limite pour le reste, je pense pouvoir me débrouiller, il n'y a que pour l'erreur PHP que je ne vois pas la solution

Ze Thriller Posté le 10/03/2008 21:21 - #


Membre
105 messages
24 ans
-2 pour le switch:

1. C'est pas si dur que ça d'en faire l'équivalent if ... elseif ... else
2. Bizarrement en PHP un switch est plus lent qu'une suite de if de taille égale. Contrairement au C par exemple.

gaga26 Posté le 10/03/2008 21:27 - #



741 messages
18 ans
Citation : Ze Thriller
[...]
2. Bizarrement en PHP un switch est plus lent qu'une suite de if de taille égale. Contrairement au C par exemple.

Mouai bon, c'est vraiment pinailler... Perso si j'ai un grand nombre de truc à comparer, je préfère switch, c'est plus joli dans le code, et osef des quelques micro secondes de perdues...

Tristou Posté le 11/03/2008 12:29 - #


Membre
60 messages
24 ans
Attention, je ne dis pas que j'ai la flemme d'utiliser if, else et elseif, simplement à force d'en utiliser, je finis par ne pas trouver ça clair, même avec des commentaires. Le switch me parait plus adapté, même si c'est plus lent, on est pas à quelques ms près

Edité par Tristou le 11/03/2008 12:30

Ze Thriller Posté le 12/03/2008 02:38 - #


Membre
105 messages
24 ans
Chacun ses goûts... C'est vrai que la différence est minime, mais je suis habitué aux if, j'y suis,j'y reste ^^
Et non, je ne trouve pas que je m'y perde ^^

Tristou Posté le 12/03/2008 18:57 - #


Membre
60 messages
24 ans
Bon enfin ça ne résout pas mon problème
Si quelqu'un a une piste, je suis preneur ^^

Page : 1

Vous devez être inscrit et connecté pour pouvoir écrire dans les forums

Retour au forum Balises, à la liste des forums, ou au haut de page