Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

CleitonGarcia

[Resolvido] Interpretar tag especifica como um código que eu quis

Recommended Posts

Olá, Cleiton. Desenvolvi uma solução para você.

 

index.php:

<?php
/**
 * Objeto que armazena as funções
 * a serem passadas para um template
 */
final class Branch
{

	/**
	 * Função sem parâmetro
	 */
	public function helloWorld()
	{
		echo 'Hello world!';
	}

	/**
	 * Função com um parâmetro
	 */
	public function welcome($name)
	{
		echo "Welcome, {$name}.";
	}
}

   /**
    * Vetor com os padrões
    * de expressão regular
    * para o template
    **/
   $patterns = array(
   	'/\{(\w*?)\}(?<pattern_variables>)/', // Padrão para variáveis
   	'/\{(\@(\w*?))\(\'?(\w*?)\'?\)\}(?<pattern_functions>)/' // Padrão para funções
);

   function replacements($matches)
   {
   	/**
	 * Manipula as variáveis
	 * e as retorna para o template
	 */
   	if (array_key_exists('pattern_variables', $matches)) {
	    /**
	     * Vetor com as variáveis
	     * a serem passadas para o template
	     **/
	    $variables = array(
            'page' => 'Página principal',
            'brand' => 'iMasters',
            'user' => 'Guilherme'
        );

	    /**
	     * Retorna o valor das variáveis
	     * para o template
	     */
        return $variables[$matches[1]];

       /**
        * Manipula as funções
        * e as retorna para o template
        */
   	} elseif (array_key_exists('pattern_functions', $matches)) {
   		/**
   		 * Instância o objeto
   		 * que armazena/agrega
   		 * todas as funções/métodos a
   		 * serem enviadas para o template
   		 */
   		$branch = new Branch();

   		/**
   		 * Retorna a função/método em questão
   		 */
   		return $branch->$matches[2]($matches[3]);
   	}
   }

   /**
    * Resgata o conteúdo do arquivo template.tpl.
    */
   $var = file_get_contents('template.tpl');

   /**
    * Exibe o conteúdo do arquivo template.tpl, utilizando
    * o esquema de template com expressão
    * regular.
    */
   echo preg_replace_callback($patterns, "replacements", $var);

 

template.tpl:

<!doctype html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>{page} - {brand}</title>
</head>
<body>
{@welcome({user})}
</body>
</html>

Está tudo documentado e suficiente. Mas algumas observações:

  • {page} imprimirá uma variável simples.
  • {@helloWorld()} executará uma função. Em vermelho são os requisitos para a função ser executada. Se você não adicionar o arroba, teremos a interpretação de uma variável. Se você omitir os parêntesis, teremos um erro. Para adicionar um parâmetro, basta colocá-lo dentro do parêntesis no template da função. O critério para a passagem de parâmetros é relativo: se for inteiro, pode omitir; se for string, a aspas é necessária; se for uma variável no template, a aspas pode ser omitida.
     
    Nesse caso em específico, implementei suporte a apenas um parâmetro por função, mas caso necessite, mãos à obra! Já dei o caminho para você.
     
    E ah, as suas funções não necessariamente precisam estar dentro de um objeto, ok? Eu tomei essa atitude, por hora, porque achei mais elegante. :rolleyes:
  • Por último mas não menos importante: eu só criei dois casos — os de interpretação de função e de variável. Se quiser trabalhar com foreach, while etc, aí é com você. Lembre-se que cada padrão de template possui sua expressão regular própria e eles são definidos por uma regra simples que os diferencia: no nosso script, temos: (?<pattern_variables>) e (?<pattern_functions>). Aí, use a criatividade e defina as regras que quiser.

 

Por hora, é isso.

Espero que esteja tudo bem esclarecido e claro.

 

Bons estudos! :thumbsup:

 

• Edit

Eis o meu milésimo post. Caprichei, ein? \o/

Compartilhar este post


Link para o post
Compartilhar em outros sites

Guilherme Oderdenge, muito elegante seu post. Tentarei, em breve, testá-lo e implementá-lo em minha aplicação. A execução das funções da forma como você fez é de meu interesse.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.