Olá pessoal, faz tempo que não escrevo nesse blog! Hoje a tarde pensei em postar uma mensagem de despedida e encerramento, mas como eu havia dormido tarde na noite anterior e acordado cedo eu acabei pegando no sono a tarde e estou aqui agora de madrugada acordadão e sem sono.

Então aproveitando esse momento silencioso aqui em casa eu resolvi brincar um pouco com PHP, comecei a fazer um template engine, porque o que mais me deixa enojado do meu código é quando tenho que misturar HTML com PHP, aí fica aquela zona.

Então vamos ao código… Esse é um código de exemplo de como fica a parte PHP usando o meu Template Engine:

  1. <?php
  2.  
  3. include ‘CTemplate.php’;
  4.  
  5. $objT = new CTemplate(‘new.html’,‘templates’);
  6.  
  7. $linha[0] = "Zero";
  8. $linha[1] = "One";
  9. $linha[2] = "Two";
  10. $linha[3] = "Three";
  11.  
  12. $teste[0] = "1";
  13. $teste[1] = "2";
  14. $teste[2] = "3";
  15. $teste[3] = "4";
  16. $teste[4] = "5";
  17.  
  18. $objT->assign(‘title’,‘Test page’);
  19. $objT->assign(‘variavel_teste’,"New value to be placed at variavel_teste");
  20. $objT->assign(‘linha’,$linha);
  21. $objT->assign(‘teste’,$teste);
  22. $objT->display();
  23.  
  24. ?>

Agora o HTML para ser manipulado:

  1. <html>
  2. <head>
  3.     <title>{title}</title>
  4. </head>
  5. <body>
  6.     {variavel_teste}
  7.  
  8.     <br/>
  9.     <br/>
  10.  
  11.     == {linha} ==<br/>
  12.  
  13.     <ul>
  14.         <li>{teste}</li>
  15.     </ul>
  16.  
  17.     <br/>
  18.  
  19.     <ol>
  20.         <li>{teste}</li>
  21.     </ol>
  22. </body>
  23. </html>

E o HTML resultante da renderização com o Template Engine:

  1. <html>
  2. <head>
  3.     <title>Test page</title>
  4. </head>
  5. <body>
  6.     New value to be placed at variavel_teste
  7.  
  8.     <br/>
  9.     <br/>
  10.  
  11.     == Zero ==<br/>
  12.     == One ==<br/>
  13.     == Two ==<br/>
  14.     == Three ==<br/>
  15.  
  16.     <ul>
  17.         <li>1</li>
  18.         <li>2</li>
  19.         <li>3</li>
  20.         <li>4</li>
  21.         <li>5</li>
  22.     </ul>
  23.  
  24.     <br/>
  25.  
  26.     <ol>
  27.         <li>1</li>
  28.         <li>2</li>
  29.         <li>3</li>
  30.         <li>4</li>
  31.         <li>5</li>
  32.     </ol>
  33. </body>
  34. </html>

Existem duas formas de iniciar o Objeto Template:

  1. $objT = new CTemplate(‘new.html’,‘templates’);

ou

  1. $objT = new CTemplate();
  2. $objT->setPath(‘templates’);
  3. $objT->setTemplate(‘new.html’);

A forma de codificar foi inspirada no Smarty Template, o primeiro Template Engine que eu usei. A classe do template engine foi batizado de “Chavão Template Engine” (que nome mais óbvio) e poder ser vista a seguir:

  1. <?php
  2. class CTemplate {
  3.     var $sHtml;
  4.     static $sPath;
  5.  
  6.     function __construct($psHtml=null,$psPath=null)
  7.     {
  8.         if(!is_null($psPath))
  9.         {
  10.             self::$sPath = (substr($psPath,-1)=="/") ? $psPath : $psPath."/";
  11.         }        
  12.  
  13.         if(!is_null($psHtml))
  14.         {
  15.             ob_start();
  16.             if(is_file(self::$sPath.$psHtml))
  17.             {
  18.                 include self::$sPath.$psHtml;
  19.             }
  20.             $this->sHtml = ob_get_contents();
  21.             ob_clean();
  22.         }
  23.     }
  24.  
  25.     function setPath($psPath)
  26.     {
  27.         if(!is_null($psPath))
  28.         {
  29.             self::$sPath = (substr($psPath,-1)=="/") ? $psPath : $psPath."/";
  30.         }
  31.     }
  32.  
  33.     function setTemplate($psHtml)
  34.     {
  35.         ob_start();
  36.         if(is_file(self::$sPath.$psHtml))
  37.         {
  38.             include self::$sPath.$psHtml;
  39.         }
  40.         $this->sHtml = ob_get_contents();
  41.         ob_clean();
  42.     }
  43.  
  44.     function assign($pTarget,$psValue)
  45.     {
  46.         $this->arrTarget[$pTarget] = $psValue;
  47.     }
  48.  
  49.     function display()
  50.     {
  51.         foreach($this->arrTarget as $sTarget => $sValue)
  52.         {
  53.             if(!is_array($sValue))
  54.             {
  55.                 $this->sHtml = str_replace("{".$sTarget."}",$sValue,$this->sHtml);
  56.                 unset($this->arrTarget[$sTarget]);
  57.             }
  58.         }
  59.  
  60.         $arrHtml = explode("\n",$this->sHtml);
  61.  
  62.         foreach($arrHtml as $iLine => $sHtml)
  63.         {
  64.             foreach($this->arrTarget as $sTarget => $arrValue)
  65.             {
  66.                 if(is_array($arrValue))
  67.                 {
  68.                     foreach($arrValue as $sValue)
  69.                     {
  70.                         if(preg_match(‘/\{ . $sTarget . \}/i’,$sHtml))
  71.                         {
  72.                             $sReturn .= str_replace("{".$sTarget."}",$sValue,$sHtml);
  73.                             $arrHtml[$iLine] = $sReturn;
  74.                         }
  75.                     }
  76.                 }
  77.             }
  78.  
  79.             unset($sReturn);
  80.         }
  81.  
  82.         $this->sHtml = implode("",$arrHtml);
  83.  
  84.         echo $this->sHtml;
  85.     }
  86. }
  87.  
  88. ?>

O “Chavão Template Engine” comentado e os arquivos de exemplo podem ser baixados clicando aqui

O conteúdo te ajudou de alguma forma? Que tal retribuir me pagando um café?