``` a la recherche d'optimisation d'une fonction ```



  • Bon en gros j'm'amuse à coder un moteur de template donc là j'ai coder (vite fait) une fonction pour gerer les block de boucle (<!– BEGIN block -->text du template avec des {block.VAR} ... <!-- END block --> )
    Le "problème" est que j'me demande si j'aurais pas pus faire plus simple ... :/ (j'ai pas encore pu la test vu que j'dois partir en cours d'ici peu :P ) donc donnez moi votre avis / correction qu'il faudrait (ou que j'pourrais) faire, merci ! :P

    	/**
    	 *	Check for blockvars (loop begin/end + loop vars)
    	 *	i.e. <!-- BEGIN block -->{blockvar.VAR}<!-- END block -->	
    	 *
    	 *	@private
    	 *	@arg	template code in var
    	 *	@return template code without blockvars
    	 */	
    	function tpl_remove_blockvars($template)
    	{
    		$motif = "`<!-- BEGIN (.*?) -->`";
    		preg_match_all($motif, $template, $row);
    		foreach( $row[1] as $match )
    		{
    			//check if the match exist in blockvar array else remove it
    			if( isset($this->tpl_blockvar_array[$match]) )
    			{
    				$blockreplace = '';
    				$blocktxtmotif =  "`<!-- BEGIN ".$match." -->(.*?)<-- END ".$match."-->`Us";
    				foreach( $this->tpl_blockvar_array[$match] as $var_array )
    				{
    					preg_match($blocktxtmotif,$template,$blocktxt);
    					foreach( $var_array as $var => $value )
    					{
    						$blockvar = '`{'.$match.'.'.$var.'}`';
    						while( preg_match( $blockvar , $blocktxt)
    						{
    							$blocktxt = preg_replace( $blockvar, $value, $blocktxt);
    						}
    					}
    					$blockreplace .= $blocktxt . 'n';		
    				}
    				$template = preg_replace( $blocktxtmotif , $blockreplace, $template );
    			}
    			else
    			{
    				$blocktxtmotif =  "`<!-- BEGIN ".$match." -->(.*?)<-- END ".$match."-->`Us";
    				$template = preg_replace( $blocktxtmotif ,'', $template );
    			}
    		}	
    	}
    
    

    Je vous donne juste la fonction qui crée le tpl_blockvar_array de la classe histoire de voir comment je la construit :

    	/**
    	 *	Add vars to a template block var 
    	 *	
    	 *	@arg	array(blockvar, array('VAR' => value))
    	 *	@return bool
    	 */
    	function assign_blockvars($blockvar,$blockvar_array)
    	{
    		$blockvar = explode('.',strtolower($blockvar));
    		foreach($blockvar as $blockvar) 
    		{
    			$this->tpl_blockvar_array[$blockvar][] = $blockvar_array;
    		}
    	}
    


  • Yop, juste deux petites choses:

    • Si tu as le choix d'utiliser n'importe quel moteur de template, je te conseille d'utiliser Smarty au final. Il est très simple, la documentation est très complète (et en français, bonus), et possède des fonctionnalités très intéressantes.

    • L'un des problèmes de ton code est qu'il ne gère pas les blocs enfants d'autres blocs. Je ne peux pas t'expliquer tout ça (un peu compliqué), mais si tu veux tu peux aller sur cette page où je propose un code complet pour un moteur de template relativement bon (dans le sens où on trouve un certain nombre de fonctionnalités intéressantes). Comme pour la quasi-totalité de mes projets, je n'assure plus le développement, mais les idées y sont. En gros, je fais comme le moteur de template de phpBB: je convertit tout le code Template en code PHP, que j'analyse ensuite via la fonction eval(). Forcément, ça demande un certain travail pour qu'il n'y ait pas de failles, mais c'est assez sympa. Si ça t'intéresse tu peux essayer de voir comment il fonctionne et de le reprendre. C'est intéressant à coder, un moteur de templates mais qu'est-ce que c'est chiant.



  • Bah déjà, je suis un "néophite" du codage, du coup je préfère coder ce que j'utilise. De plus j'ai totalement le choix (ainsi que le temps et l'envie :P) donc j'ai envie d'en coder un ^^

    Ensuite ouai, j'avais déjà regarder ton moteur de template, mais après avoir étudier ton code (qui n'a pas de commentaire ¬¬) j'ai un peu lacher l'affaire de comprendre certains truc. :p

    Après tu entend quoi par 'blocs enfant d'autres blocs' ? T'as pas un exemple à la limite?

    Enfin.. c'est sur, c'est intéressant à coder même si c'est chiant, mais c'est pas en codant un "hello world" qu'on progresse :P

    edit : en fait, j'ai piger ton histoire de block enfant: c'est en cas de blockvar imbriqué quoi, d'où "mon prob" qui se poserait dans ce cas là, car ils seraient traités selon le cas, mais carrément pas correctement



  • Bah déjà, je suis un "néophite" du codage, du coup je préfère coder ce que j'utilise. De plus j'ai totalement le choix (ainsi que le temps et l'envie :P) donc j'ai envie d'en coder un ^^

    […]

    Enfin.. c'est sur, c'est intéressant à coder même si c'est chiant, mais c'est pas en codant un "hello world" qu'on progresse :P

    Très bon état d'esprit ! C'est exactement ce qu'il faut penser quand des chieurs dans mon genre disent que réinventer la roue caylemal. Et je le pense encore d'une certaine manière, utilisant le principe du "faites ce que je dit, pas ce que je fais" quand je répond à des messages tels que le tiens (où parfois les gens recherchent surtout la facilité … dommage, ça). :D

    (qui n'a pas de commentaire ¬¬)

    Euh … :mrgreen:
    C'est pas faux. Et en plus je ne suivais pas encore les normes de codage PEAR quand je l'ai écrit, donc ça doit être un peu illisible, d'une certaine manière. Tu peux utiliser le paramètre –debugMode du constructeur pour voir un peu comment sont gérés les différents trucs. Pratique, je trouve, ce param.

    Après tu entend quoi par 'blocs enfant d'autres blocs' ? T'as pas un exemple à la limite?

    Supposons un template ressemblant à celui-ci:

    <!-- BEGIN premier_bloc -->
    	{premier_bloc.var1}
    	<!-- BEGIN deuxieme_bloc -->
    		{premier_bloc.deuxieme_bloc.var1}
    		{premier_bloc.var2}
    		{premier_bloc.deuxieme_bloc.var2}
    	<!-- END deuxieme_bloc -->
    	{premier_bloc.var3}
    <!-- END premier_bloc -->
    ```et généré avec ce code:
    

    // ... bla bla initialisation ...
    $tpl->assign_block_vars('premier_bloc', array(
    'var1' => 'That's',
    'var2' => 'All',
    'var3' => 'Folks!',
    ));
    $tpl->assign_block_vars('premier_bloc.deuxieme_bloc', array(
    'var1' => 'Hello',
    'var2' => 'World',
    ));

    That's Hello All World Folks!



  • ouai c'est en gros ce que j'pensais, mais bon, si c'est pour faire comme ton exemple, y a pas besoin de s'emmerder avec des block var non plus xD, après c'est sur que si tu as besoin de boucle, tout l'intérêt est là (fin du moins pour moi vu que j'les utilise pour faire ça surtout)



  • Dans mon exemple, effectivement ça sert à rien, mais si tu veut afficher différents menus avec chacun leurs liens, là ça devient nécessaire.



  • En gros, je fais comme le moteur de template de phpBB: je convertit tout le code Template en code PHP, que j'analyse ensuite via la fonction eval().

    PAS BIEN la fonction eval !

    Perso, je te conseil de te passer de moteur de template, c'est lourd et pas forcément utile, sauf si tu veux un site multi-design…



  • bah c'est ce que j'veux justement :) et c'est pas nécessairement plus lourd qu'autre chose ;)



  • @phenix:

    En gros, je fais comme le moteur de template de phpBB: je convertit tout le code Template en code PHP, que j'analyse ensuite via la fonction eval().

    PAS BIEN la fonction eval !

    Faut savoir l'utiliser.
    Théoriquement, c'est la fonction include mais avec les chaines de caractères. :wink:


Se connecter pour répondre
 

Il semble que votre connexion ait été perdue, veuillez patienter pendant que nous vous re-connectons.