Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    Curiosita template engine

    Salve a tutti. Ho da poco completato una piccola classe wrapper per PDO (grazie anche alla guida di oly) e ora volevo provare a crearmi un template engine. So benissimo che ce ne sono una marea in circolazione, che reinventare la ruota non ha senso etc etc, ma siccome son curioso come un gatto ho deciso di crearmene uno per capire il funzionamento e non limitarmi a richiamare classi e metodi scritti da altri.Ad esempio ho visto che yii e twig utilizzano file_get_content per recuperare il contenuto della pagina, parsarlo e stamparlo dentro il template di base al posto di usare un più brutale include o require. Quello che non mi è chiaro è COME fare arrivare questo contenuto al template. Esempio:
    Configuro la mia classe (per comodità MyTpl) specificandogli un template di base che verrà incluso nell'entry point.
    Un ipotetico controller per un sistema di news richiama il metodo render() passandogli il nome della vista e un array con i dati recuperati da database.
    Il metodo render() di MyTpl prende in carico i dati, recupera la vista da cui estraggo il contenuto con file_get_content e.....poi?
    Come faccio a far arrivare questa variabile al template di base? Probabilmente a forza di far prove mi son fatto un gran casino in testa da solo ma magari
    qualcuno di voi può chiarirmi le idee.
    Grazie in anticipo.
    Fare o non fare....non c'è provare!

  2. #2
    Utente di HTML.it L'avatar di marco_c
    Registrato dal
    Jun 2004
    Messaggi
    1,047
    non capisco cosa non capisci.

    la classe MyTpl (che mi sembra aver capito sia il tuo gestore di template) avrà dei metodi per rimpiazzare dei segnaposto con delle variabili. Es:

    Codice PHP:
    $mytpl = new MyTpl("news.html");
    $mytpl->Replace("titolo"$news->GetTitle()); 
    oppure derivi la classe MyTpl e ti fai un NewsTpl che fa tutto dentro

    Codice PHP:
    $newstpl = new NewsTpl();
    $newstpl->Render($news)

    class 
    NewsTpl extends MyTpl
    {
       public 
    __construct()
       {
          
    parent::__construct("news.html");
       }

       public 
    Render($news)
       {
          
    this->Replace("titolo"$news->GetTitle());
          
    parent::Render();
       }

    Gli uomini si dividono in due categorie: i geni e quelli che dicono di esserlo. Io sono un genio.

  3. #3
    Non mi è mai capitato di sviluppare un template engine ed ho sempre utilizzato terze parti.

    Nel caso in cui dovessi farlo però sfrutterei la funzione eval()

    abbiamo ad esempio una cartella con file .tpl (protetta con .htaccess). Al suo interno avremo, ad esempio, file di questo tipo: header.tpl

    Codice PHP:
    <html>
    <head>
        <title><?php echo $title?></title>
        <meta name="description" content="<?php echo $description?>" />
    </head>
    Poi avremo una classe template che sarà na cosa di questo tipo (moltoooo sbrigativa e priva di qualsiasi controllo... giusto un esempio per capirci)
    Codice PHP:
    <?php
    Class template{
        public 
    $dir_template 'tpl/';
        public function 
    __costruct(){
        }
        
        public function 
    render($tpl$vars = array()){
            
    extract($vars);
            
    $template file_get_contents($this->dir_template $tpl);
            return eval(
    "?>" $template);
            }
        }
    Poi per richiamare il template e sostituire le variabili farai

    Codice PHP:
    <?php
    $data 
    = array(
                    
    'title' => 'questo è il titolo',
                    
    'description' => 'questa è la descrizione'
                    
    );
                    
    require_once(
    'class/template.class.php');                
    $template = New template;
    $template->render('header.tpl'$data);
    ... poi ovviamente si dovrebbero creare i file e le/la cartella/e per gestire il chaching... la cosa si complica e non di poco
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

  4. #4
    Grazie ad entrambi. Oly, mi hai chiarito alcuni dubbi grazie ancora. Dato il livello di rischio usando eval non lo avevo neanche preso in considerazione. Stavo già partendo con preg_match e preg_replace. Dici che mi conviene usare eval e affiancarci un match/replace per evitare sorprese?
    Fare o non fare....non c'è provare!

  5. #5
    Sì... con eval ci sono problemi di sicurezza da tener attentamente in considerazione.

    Ma il problema usando preg_replace li incontri quando nelle view (i file .tpl) avrai condizioni e cicli.
    http://www.miniscript.it
    Se ti sono stato di aiuto in qualche modo in questo forum iscriviti alla fan page di Miniscript - il mio blog di programmazione web.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.