Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    379

    semplice template engine con loop

    Salve a tutti,

    Dire il vero, sto cercando un modo semplice per crearmi il mio template engine, che mi permette di effettuare loop. Ho iniziato col farmi una classe in php che phrasa tutti i tag che riconosce, e quindi li sostituisce con i valori in un array...

    ad un certo punto pero' ho visto che questo semplice giochetto non mi bastava piu' in quanto dovevo inserire cicli nelle pagine.Era quindi molto fastidioso dover' inserire codice html nella pagina php, proprio perche' cercavo di distiguere codice php da quello html.

    la classe che usavo è proprio ridicola ma non riesco proprio ad implementare i loop. Mi manca il concetto dal quale partire:


    Codice PHP:
    class template {
     var 
    $__file
        function 
    __construct($f){ // $file
            
    $this->__file file_get_contents($f);
        }
        function 
    setTags($t) { // $tag => array
            
    foreach($t as $tag => $valore) {
                
    $this->__file str_replace("<:".$tag.":>"$valore$this->__file);
            }
        }
        function 
    getPage() {
            return 
    $this->__file;
        }
        function 
    __destruct() {
            unset(
    $this->__file);
        }

    mi potete dare una mano?

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    379
    Ho provato a buttare giu qualche cosa tuttavia non riesco a capire come poter prasare il codice in entrata

    Codice PHP:
        class template
        
    {
            public    
    $__tags = array();
            
            private    
    $__file,
                    
    $__options = array('loop''if''noprase');
            
        
        
    //------------------------------------------------------------------------
        // costruttore della classe
        //------------------------------------------------------------------------            
            
    function __construct($file)
            {
                if (!empty(
    $file))
                {
                    if (
    file_exists($file))
                    { 
                        
    $this->__file file_get_contents($file);
                    } else
                        
    $this->error('Il file [{$file}] non esiste!');
                }
                else
                    
    $this->error('Devi specificare un template-file!');
            }
            

        
    //------------------------------------------------------------------------
        // newtag($n, $v) -> nome(strng), valore
        //------------------------------------------------------------------------        
            
    public function newtag($n$v)
            {
                if (
    is_string($n) && is_array($v))
                {
                    
    // quello che si cerca di immettere è un loop
                    
    $this->setloop($n$v);
                }
                else if (!empty(
    $n) && !empty($v) && is_string($v))
                {
                    
    // è stato immesso un solo tag
                    
    $this->__tags[$n] = $v;
                }
                else
                    
    $this->errore('Il formato in cui hai inserito il Tag non è valido!');
            }
            

        
    //------------------------------------------------------------------------
        // setloop($n, $a) -> nome(string), array(array)
        //------------------------------------------------------------------------        
            
    private function setloop($n$a)
            {
                foreach (
    $a as $nome => $valore)
                {                
                    if (
    is_array($valore))
                    {    
                        
    $this->setloop($nome$valore);
                    }
                    
    $this->__tags[$nome] = $valore;
                }
            }
        }
    // fine classe. 
    mi piacerebbe poter scrivere cose simili:

    Codice PHP:
    [b]{titolo}[/b]
    <
    table>
        {
    loop righe}
        <
    tr>
            <
    td>{righe.chatName}</td>
        </
    tr>
        <
    tr>
            <
    td>
            {
    loop righe.lastmex}
                <
    div>
                {
    colonne.contatore} - [url="{colonne.url}"]{colonne.user}[/url]

                </
    div>
            {/
    loop}
            </
    td>
        </
    tr>
        <
    tr>
            <
    td>utenti online : {righe.online}</td>
        </
    tr>
        {/
    loop}
    </
    table
    con un array di questo tipo :


    Codice PHP:
    array(
        
    'titolo' => 'tabella Chat',
        
    'righe' => array(
            [
    0] => array(
                
    'chatName' => 'chat1',
                
    'lastmex' => array(
                    [
    0] => array( 
                        
    'user' => 'nome1',
                        
    'url' => 'http://...'
                    
    ),
                    [
    1] => array( 
                        
    'user' => 'nome2',
                        
    'url' => 'http://...'
                    
    ),
                    [
    2] => array( 
                        
    'user' => 'nome3',
                        
    'url' => 'http://...'
                    
    )
                ),
                
    'online' => '12'
            
    ),
            [
    1] => array(
                
    'chatName' => 'chat1',
                
    'lastmex' => array(
                    [
    0] => array( 
                        
    'user' => 'nome1',
                        
    'url' => 'http://...'
                    
    ),
                    [
    1] => array( 
                        
    'user' => 'nome2',
                        
    'url' => 'http://...'
                    
    ),
                    [
    2] => array( 
                        
    'user' => 'nome3',
                        
    'url' => 'http://...'
                    
    )
                ),
                
    'online' => '12'
            
    )


  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    379
    up... vi prego datemi una mano

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    379
    plz I need help

  5. #5
    Io dico che prima di tutto dovresti scrivere una routine per il parsing del template

    Bè la RegEx per quello che vorresti tu è:
    Codice PHP:
    #\{loop.*=(.*?)\}(.*?)\{/loop\}# 
    In $1 = hai il parametro del loop
    In $2 = hai il testo all'interno del loop

    Dopodichè scrivi una routine per la sostituzione e qua và bene la str_replace, ma se vuoi un pò di performance ti consiglio le espressioni regolari ancora una volta, visto che la libreria che gestisce le epsressioni regolari di PHP (le PCRE) è molto efficace

    la RegEx generica per riconoscere un testo delimitato dalle parentesi graffe è:
    Codice PHP:
    #\{(.*?)\}# 
    Adesso scrivi un pò di codice e se ti blocchi ancora una volta, chiedi qua ancora.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    379
    stavo proprio scrivendo la funzione phrase xD

    ma sono negato con le regexp è da ore e ore che ci sbatto la testa e sono giusto arrivato a quella per trovare le {var}


    cmq ti ringrazio molto... vediamo se riesco finalmente a finirlo ora ^^



    secondo te oltre ai loop, che sono la cosa piu' fastidiosa, se non li abbiamo nel temp engine. cosa si potrebbe implementare ancora?

  7. #7
    Guarda ti dirò, io mi son fatto un template engine estensibile.

    Cioè se voglio scrivermi una funzione che simuli il ciclo for mi basta scrivere una funzione di questo tipo:
    Codice PHP:
    /*
     * in $params ho i parametri della funzione e il testo racchiuso tra i tag {for}
     * in $tpl ho l'istanza del template engine
     */
    function templates_function_for($params, &$tpl)
    {

    In questo modo estendere il template engine non è fastidioso , infatti se mi permetto devo dire che il tuo codice è disorganizzato, sicuramente c'è il rischio che quando si ingrandirà sarà molto difficile gestirlo e finirai per doverlo riscrivere da zero.

    Però io implementerei una sorta di {load} che include un altro template.
    Codice PHP:
    {load header}
    [
    b]Ciao Mondo[/b]
    {
    load footer
    Ah! Le RegEx sembrano difficili ma sono una "cazzata" immane. (il punto è che la maggior parte che affronta le RegEx non si impegna, ma ti assicuro che se le studi attentamente per 5/10 minuti...a me così è successo).

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    379
    a questo punto però mi hai fatto venire la colina, e devi farmi vedere il tuo super engine!


    Io so benissimo di non essere un programmatore come si deve, e diciamo che lo faccio piu' per passione che per lavoro. Tuttavia cerco sempre di dare del mio meglio. Non volevo usare tmp engine piu' complessi, perche' solitamente incorporano certe funzioni che dire il vero si utilizzano raramente e quindi sono inutili e pesanti ( se non le usi).

    ora che lo hai detto davvero il header / footer potrebbe essere un altro colpo di genio oltre magari al {nophrase}{/nophrase}

    fatte queste due tre cose per le mie esigenze l'engine è piu' che completo.

  9. #9
    ma guarda, neanche io sono un programmatore, diciamo che in PHP sono leggermente avvantagiato visto che ho una lunga storia con C, VB.NET,C# e un pò di Assembly, e sono anche un maniaco dell'estensibilità.

    "I do it just for fun"

    Se i tmp engine son complessi è perchè son fatti male.

    Cioè il vantaggio principale del mio engine è che è il core è di sole 85/100 righe (+ i file che contengono le varie funzioni) di codice a differenza di smarty & co.

  10. #10
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    379
    Dato che hai detto che il mio codice è contorto, e dire il vero lo ammetto pure io proprio perche' non ho minimamente idea di come farlo, mi daresti una mano riscriverlo da zero?

    diciamo che io mi ero fermato alla mia classe base:
    Codice PHP:
    class template {
    private 
    $__file;
        function 
    __construct($f){
            
    $this->__file file_get_contents($f);
        }
        function 
    assegna($t) {
            foreach(
    $t as $tag => $valore) {
                
    $this->__file str_replace("{".$tag."}"$valore$this->__file);
            }
        }
        function 
    mostra() {
            return 
    $this->__file;
        }
        function 
    __destruct() {
            unset(
    $this->__file);
        }


    nel loop ecc non riesco proprio ad efferare il concetto... ho solo un idea vaga di come farlo ma nulla di concreto ed ovviamente questa mia confusione nel codice si rispecchia!

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.