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

    [PHP] Template Engine dinamico

    Ciao,
    vi chiedo un parere a livello concettuale, magari sollevando anche osservazioni su idee errate, che mi aiuteranno a trovare una soluzione efficace.

    Sto realizzando un template engine in un contesto multilanguage, e le aree fisse della pagina (header, menu vari e footer) non sono sempre uguali ma cambiano in base alla lingua in marcatura e contenuti.
    Il template engine, che sostanzialmente fa un replace, dovrebbe quindi selezionare dinamicamente il file tpl in base alla lingua di navigazione.

    Per far questo è sufficiente passargli la variabile lingua e fargli aprire il file tpl della lingua selezionata.

    Però mi sembra che questa soluzione abbia dei punti deboli, perché:
    [list=1][*]in caso di modifiche si devono editare tutti i files tpl per ogni lingua[*]la struttura è troppo poco flessibile perché non prevede l'inserimento di oggetti diversi da quelli del template (ad esempio un box promozionale) nelle aree fisse.[/list=1]

    La seconda limitazione in particolare esiste in tutte le soluzioni di template engine che ho visto finora.
    Mi pongo allora l'obiettivo di creare una struttura flessibile anche per i contenuti più o meno fissi (box e widgets vari).

    Ci sto lavorando su per arrivare ad una soluzione generale da integrare al mio ambiente di sviluppo.

    Conoscete qualche risorsa su cui prendere spunto?
    O soluzioni già implementate in tal senso?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  2. #2
    Che è una limitazione di tutti i template engine non è vero.

    Anzi devo dire che perfino Smarty (a malincuore visto che non ho avuto un buon rapporto) lo consente.

    Tutto dipende dalla logica a mio parere.

    Io ho fatto un template engine del genere.
    Codice PHP:
    //Variabile semplice
    {$variabile}
    //Semplice funzione
    {FUNZIONE|parametri}
    //Lo stesso di sopra come separatore si può usare | oppure uno spazio
    {FUNZIONE parametri}
    //Funzione che ha del testo al proprio interno
    {FUNZIONE parametri}
     
    Testo
    {/FUNZIONE
    Dove ogni volta che il template engine arriva a {FUNZIONE} controlla se ha parametri e del testo tra i tag e chiama una funzione PHP che si chiama tpl_func_FUNZIONE passandogli l'istanza della classe del template engine e un array contenente il parametro e testo.

    Esempio:
    Codice PHP:
    function tpl_func_FUNZIONE($params, &$tpl)
    {
        if(isset(
    $params['text']))
        return 
    $params['text'];
        else
        return 
    "No text is present";

    Per il parsing adesso uso le espressioni regolari e questa strada non mi convince del tutto, infatti sto pensando di scrivere un parser fatto in casa fatto apposta per analizzare la sinstassi del mio template engine.

    Questa strada ti può dare tutta la flessibilità che ti serve, in questo modo mi sono implementato IF, LOAD, FOR scrivendo rispettivamente 3 funzioni.
    E in più è facilmente personalizzabile per ogni tipo di script.

    Questa è la strada che ti suggerisco, poi può darsi che un giorno pubblicherò il mio template engine, quando sarà serio si intende con un proprio parser e capace di compilare in codice PHP.

  3. #3
    il template engine cosa fa? prende un insieme di codice ( html,pdf,word, quello che vuoi ) e lo riempe coi contenuti

    ora secondo me sta innanzitutto a decidere cosa è contenuto e cosa invece non lo è

    di conseguenza vedrai cosa mettere nel template e cosa no

    il mio approccio è quello di avere i contenuti e poi passarli al template engine che andrà semplicemente a riempirlo coi contenuti opportuni, a parte quelle poche stringhe che vengono sostituite al volo in pagina...

    tipo in

    Codice PHP:
    <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="I18n" lang="I18n"
    I18n

    può venire sostituito al volo dalla cultura selezionata, anzi in realtà con parte di essa ( xml:lang="en" lang="en",xml:lang="it" lang="it"... eccetera )

    ...

  4. #4
    Grazie cari colleghi dei vostri preziosi feedback, sono stati una utile base di partenza.

    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

  5. #5

    Metodo operativo per il parsing

    Originariamente inviato da flash.tato
    Codice PHP:
    function tpl_func_FUNZIONE($params, &$tpl)
    {
        if(isset(
    $params['text']))
        return 
    $params['text'];
        else
        return 
    "No text is present";

    Per il parsing adesso uso le espressioni regolari e questa strada non mi convince del tutto, infatti sto pensando di scrivere un parser fatto in casa fatto apposta per analizzare la sinstassi del mio template engine.

    Questa strada ti può dare tutta la flessibilità che ti serve, in questo modo mi sono implementato IF, LOAD, FOR scrivendo rispettivamente 3 funzioni.
    E in più è facilmente personalizzabile per ogni tipo di script.

    Questa è la strada che ti suggerisco, poi può darsi che un giorno pubblicherò il mio template engine, quando sarà serio si intende con un proprio parser e capace di compilare in codice PHP.
    Ciao,
    mi sto scontrando anche io con il parsing del meta linguaggio del template.
    Al momento sto usando le RegExp, ma mi chiedo quale sia la strada migliore per evitare di fare degli IF ELSE a catena.

    Esempio: la sintassi possibile è books[1] oppure book.getTitle()
    Il modello per individuare correttamente i pattern della sintassi sarà:

    $pattern = "/^([\w_]+)((\.([\w_]+)\(\))|(\[([0-9]+)\]))/s";

    Ora, in caso di match, in base a quali parametri prelevare i giusti valori dall'array delle occorrenze trovate?

    Codice PHP:
    // istanziazione di 2 stringhe di test:
    $string_1 "books[1]";
    $string_2 "book.getTitle()";

    $pattern "/^([\w_]+)((\.([\w_]+)\(\))|(\[([0-9]+)\]))/s";
    preg_match_all($pattern$string_1$matchesPREG_SET_ORDER); 
    Dando in pasto a preg_match_all i due pattern vengono catturate le seguenti occorrenze.
    Per la prima stringa:
    codice:
    Array
    (
        [0] => Array
            (
                [0] => books[1]
                [1] => books
                [2] => [1]
                [3] => 
                [4] => 
                [5] => [1]
                [6] => 1
            )
    
    )
    di cui mi interessano la sottoespressione con indice 1 e quella con indice 6 (cioè nome array e indice).

    Per la seconda stringa:
    codice:
    Array
    (
        [0] => Array
            (
                [0] => book.getTitle()
                [1] => book
                [2] => .getTitle()
                [3] => .getTitle()
                [4] => getTitle
            )
    
    )
    di cui mi interessano la sottoespressione con indice 1 e quella con indice 4 (ovvero, nome oggetto e metodo).

    In base a quale criterio stabilire se la stringa controllata appartiene alla prima sintassi o alla seconda? Il numero di occorrenze delle sottoespressioni trovate?



    @flash.tato: in che senso dicevi di voler scrivere un parser per il template? In un altro linguaggio? Da dove partiresti? E come si interfaccerebbe con PHP?
    Emanuele DG
    <?php echo "Proverbio zen(d): vivi ogni giorno come se fosse il ".date('d M Y', time()); ?>
    Intellectual property

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.