TransWikia.com

Criar loop em templates com php

Stack Overflow em Português Asked by Alex Oliveira on November 19, 2021

Estou tendo dificuldades em criar um algoritmo para implementar o uso de loops em uma classe de template simples.

Tenho a minha classe abaixo, ela recebe um arquivo HTML, procura por strings especificas que estão neste arquivo a partir de valores de um array e substitui por outra string obtida de uma variável, por fim retorna o código HTML alterado em forma de print na tela. Funciona muito bem, exceto quando preciso utilizar loops.

Obs: eu quero separar todo meu código HTML do PHP

Classe Template

<?php

class Template {

private $file;
private $vars;

public function __construct($file = "") {

    $this->vars = array();
    $this->load($file);
}

public function load($file){

    if(file_exists($file)){

        if(file_get_contents($file)){

            $this->file = file_get_contents($file);

            return true;
        }
        else{

            return die("Error: Could not load file "{$file}."");
        }
    }
    else{

        return die("Error: file "{$file}" not found.");
    }
}

public function show(){

    if($this->file){

        $output = $this->file;

        foreach ($this->vars as $varName => $varValue) {

            $tagToReplace = "{{$varName}}";

            $output = str_replace($tagToReplace, $varValue, $output);
        }

        printf($output);
    }
    else {
        return die("Error: template file is empty.");
    }
}

public function setVar($varName, $varValue){

    if(!empty($varName) && !empty($varValue)){

        $this->vars[$varName] = $varValue;
    }
}
}
?>

Exemplo de utilização index.php

<?php

$template   = new Template("index.template.html");

$template->setVar("page_title", "Página Inicial");
$template->setVar("msg", "Bem vindo!");

$template->show();
?>

Arquivo index.template.html

<!DOCTYPE html>
<html>
    <head>
        <title>{page_title}</title>
    </head>
    <body>
        <h1>{msg}</h1>
    </body>
</html>

2 Answers

Eu não sei muito bem como você quer que seja impresso no final. Mas para você usar todas as variáveis do array você deverá trata-las separadamente do código que faz a alteração do HTML. Um exemplo:

    // ... código anterior

    $tagToReplace = "{{$varName}}";
    $newValue = ""; // criei essa variável para ser usada depois

    foreach ($this->vars as $varName => $varValue) {

        $newValue .= $varValue." ";

    }
    // aqui ele altera com a variável $newValue
    $output = str_replace($tagToReplace, $newValue, $output); 

    // restante do código ...

Acredito que irá dar certo. Qualquer erro comente aqui abaixo. Abraço!

Answered by Andrei Coelho on November 19, 2021

O que você fez até agora é bem simples, porêm obviamente se deseja obter algo mais genérico ou completo você vai ter que ir muito mais além. Desta forma, você só esbarrou no primeiro problema (loops), mas você vai esbarrar em condicionais, e diversos outros problemas. Por isso existem projetos onde outras pessoas já pensaram, mastigaram para a comunidade soluções bem completas e robustas que fazem exatamente o que está tentando fazer. Um exemplo é o Smarty: http://www.smarty.net/

A documentação é grande pois é uma solução bem completa. Minha sugestão é pesquisa sobre PHP Template Engines no google e escolhar a que melhor te atende.

Answered by Paul H. on November 19, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP