raelgc / template

PHP Template
http://raelcunha.com/template.php
GNU Lesser General Public License v2.1
73 stars 42 forks source link

Resetar conteúdo do bloco #3

Closed maiserjose closed 9 years ago

maiserjose commented 9 years ago

Situação: O arquivo PHP que usa o bloco template, faz o parse do bloco toda vez que é chamado.

Objetivo: Dependendo da situação é necessário "resetar" o bloco, ou seja, desfazer o parse feito quando o arquivo é chamado. E realizar um novo parse no mesmo bloco.

Exemplo:

Arquivo "modelo.html":

<!-- BEGIN BLK_BLOCO -->
    {VAR_CONTEUDO}
<!-- END BLK_BLOCO -->

Arquivo "modelo.php":

$tpl = new Template("modelo.html");

//faz o "parse" toda vez que chama este arquivo php
$tpl->VAR_CONTEUDO = "Algum conteúdo";
$tpl->block("BLK_BLOCO");

$get = filter_input(INPUT_GET, 'opcao');

//se for alguma das opções tem que resetar o bloco
if($get == "1"){
    //seria como a funcao $tpl->clear() para variáveis de template.
    $tpl->clearBlock("BLK_BLOCO");

    $tpl->VAR_CONTEUDO = "Conteúdo 1";
    $tpl->block("BLK_BLOCO");
}
else if($get == "2"){
    //seria como a funcao $tpl->clear() para variáveis de template.
    $tpl->clearBlock("BLK_BLOCO");

    $tpl->VAR_CONTEUDO = "Conteúdo 2";
    $tpl->block("BLK_BLOCO");
}

$tpl->show();
raelgc commented 9 years ago

@maiseralves, testa esse método block abaixo, substituindo o atual:

        /**
         * Show a block.
         *
         * This method must be called when a block must be showed.
         * Otherwise, the block will not appear in the resultant
         * content.
         *
         * @param     string $block     the block name to be parsed
         * @param     boolean $append   true if the content must be appended
         */
        public function block($block, $append = true) {
            if(!in_array($block, $this->blocks)) throw new \InvalidArgumentException("block $block does not exist");
            // Checking finally blocks inside this block
            if(isset($this->parents[$block])) foreach($this->parents[$block] as $child){
                if(isset($this->finally[$child]) && !in_array($child, $this->parsed)){
                    $this->setValue($child.'_value', $this->subst($this->finally[$child]));
                    $this->parsed[] = $block;
                }
            }
            if ($append) {
                $this->setValue($block.'_value', $this->getVar($block.'_value') . $this->subst($this->getVar($block)));
            } else {
                $this->setValue($block.'_value', $this->getVar($block.'_value'));
            }
            if(!in_array($block, $this->parsed)) $this->parsed[] = $block;
            // Cleaning children
            if(isset($this->parents[$block])) foreach($this->parents[$block] as $child) $this->clear($child.'_value');
        }

A diferença pro atual: quando você quiser que o bloco não mantenha o valor, usa:

$tpl->block('BLOCO', false);

Senão usa da maneira tradicional:

$tpl->block('BLOCO');

Depois me diga se funcionou pra eu poder fechar o issue ou arrumar os defeitos :)

maiserjose commented 9 years ago

Olá Rael, está funcionando!

Ótimo trabalho!

Para fins de esclarecimento a resolução para o exemplo acima com a sua solução (melhor impossível), ficaria assim:

$tpl = new Template("modelo.html");
$get = filter_input(INPUT_GET, 'opcao');

if( ! empty($get) ){
    $reset = true;
}else{
    $reset = false;
}

$tpl->VAR_CONTEUDO = "Algum conteúdo";
$tpl->block("BLK_BLOCO", ! $reset);

if($get == "1"){

    $tpl->VAR_CONTEUDO = "Conteúdo 1";
    $tpl->block("BLK_BLOCO");

}
else if($get == "2"){

    $tpl->VAR_CONTEUDO = "Conteúdo 2";
    $tpl->block("BLK_BLOCO");

}

$tpl->show();

Obrigado Rael!