Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    sostituire elementi dei template via php

    sto spulciando i sorgenti di phpbb2 e vedo che, tanto per fare un esempio, in un .tpl c'è una serie di cose di questo tipo:

    background-color: {T_BODY_BGCOLOR};

    praticamente tutti gli elementi sostituibili sono inclusi fra graffe... ma guardando nei .php che li carica non sono riuscito a venirne a capo, come si fa a sostituire un elemento? vedo che nel .php che carica il tale template c'è una roba così

    Codice PHP:
    $template->set_filenames(array(
        
    'overall_header' => ( empty($gen_simple_header) ) ? 'overall_header.tpl' 'simple_header.tpl')
    ); 
    Codice PHP:
    $template->pparse('overall_header'); 
    io la funzione pparse non sono riuscito a trovarla nel manuale di php... nè la vedo definita da qualsiasi parte

    in fin della fiera, qual è il metodo corretto per caricare dei template e sostituire solo le parti che interessano?
    Sotto la panza la mazza avanza.

  2. #2
    La funzione pparse fa parte dell'oggetto $template; devi cercare la riga che dice $template = new qualchecosa , dove qualchecosa sarà il nome della classe di oggetti cui lui appartiene, e a questo punto dovrai cercare la stringa "class qualchecosa" dentro ai file php, magari meglio con un tool di ricerca nei file, così da trovare dove la classe qualchecosa viene definita; al suo interno troverai la funzione pparse e potrai vedere come è fatta.
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  3. #3
    ok trovata in include/template.php

    Codice PHP:
    function pparse($handle)
        {
            if (!
    $this->loadfile($handle))
            {
                die(
    "Template->pparse(): Couldn't load template file for handle $handle");
            }

            
    // actually compile the template now.
            
    if (!isset($this->compiled_code[$handle]) || empty($this->compiled_code[$handle]))
            {
                
    // Actually compile the code now.
                
    $this->compiled_code[$handle] = $this->compile($this->uncompiled_code[$handle]);
            }

            
    // Run the compiled code.
            
    eval($this->compiled_code[$handle]);
            return 
    true;
        } 
    me la sai spiegare brevemente? con classi e funzioni ci devo ancora giocherellare e nemmeno so cosa faccia l'operatore ->
    Sotto la panza la mazza avanza.

  4. #4
    cerca la funzione compile della stessa classe, questa qua a parte qualche controllo richiama solo quella.

    L'operatore -> serve per richiamare campi e metodi (variabili e funzioni) degli oggetti.

  5. #5
    Beh, lo spezzone che hai postato richiama altre funzioni sempre della classe: load, che probabilmente carica da file o da DB, chi lo sa, il template che gli si richiede, Compile che esegue la preparazione del template ed eval (che non è un metodo della classe ma un comndo di php) che esegue realmente il template...
    "Le uniche cose che sbagli sono quelle che non provi a fare."
    Atipica

  6. #6
    ok ho trovato la funzione compile... è un po' lunghetta; prima di capire dove sostituisce gli elementi inclusi in { } nei template diventerò vecchio

    [supersaibal]
    Codice PHP:
        function compile($code$do_not_echo false$retvar '')
        {
            
    // replace \ with \\ and then ' with \'.
            
    $code str_replace('\\''\\\\'$code);
            
    $code str_replace('\'''\\\''$code);

            
    // change template varrefs into PHP varrefs

            // This one will handle varrefs WITH namespaces
            
    $varrefs = array();
            
    preg_match_all('#\{(([a-z0-9\-_]+?\.)+?)([a-z0-9\-_]+?)\}#is'$code$varrefs);
            
    $varcount sizeof($varrefs[1]);
            for (
    $i 0$i $varcount$i++)
            {
                
    $namespace $varrefs[1][$i];
                
    $varname $varrefs[3][$i];
                
    $new $this->generate_block_varref($namespace$varname);

                
    $code str_replace($varrefs[0][$i], $new$code);
            }

            
    // This will handle the remaining root-level varrefs
            
    $code preg_replace('#\{([a-z0-9\-_]*?)\}#is''\' . ( ( isset($this->_tpldata[\'.\'][0][\'\1\']) ) ? $this->_tpldata[\'.\'][0][\'\1\'] : \'\' ) . \''$code);

            
    // Break it up into lines.
            
    $code_lines explode("\n"$code);

            
    $block_nesting_level 0;
            
    $block_names = array();
            
    $block_names[0] = ".";

            
    // Second: prepend echo ', append ' . "\n"; to each line.
            
    $line_count sizeof($code_lines);
            for (
    $i 0$i $line_count$i++)
            {
                
    $code_lines[$i] = chop($code_lines[$i]);
                if (
    preg_match('##'$code_lines[$i], $m))
                {
                    
    $n[0] = $m[0];
                    
    $n[1] = $m[1];

                    
    // Added: dougk_ff7-Keeps templates from bombing if begin is on the same line as end.. I think. :)
                    
    if ( preg_match('##'$code_lines[$i], $n) )
                    {
                        
    $block_nesting_level++;
                        
    $block_names[$block_nesting_level] = $m[1];
                        if (
    $block_nesting_level 2)
                        {
                            
    // Block is not nested.
                            
    $code_lines[$i] = '$_' $n[1] . '_count = ( isset($this->_tpldata[\'' $n[1] . '.\']) ) ?  sizeof($this->_tpldata[\'' $n[1] . '.\']) : 0;';
                            
    $code_lines[$i] .= "\n" 'for ($_' $n[1] . '_i = 0; $_' $n[1] . '_i < $_' $n[1] . '_count; $_' $n[1] . '_i++)';
                            
    $code_lines[$i] .= "\n" '{';
                        }
                        else
                        {
                            
    // This block is nested.

                            // Generate a namespace string for this block.
                            
    $namespace implode('.'$block_names);
                            
    // strip leading period from root level..
                            
    $namespace substr($namespace2);
                            
    // Get a reference to the data array for this block that depends on the
                            // current indices of all parent blocks.
                            
    $varref $this->generate_block_data_ref($namespacefalse);
                            
    // Create the for loop code to iterate over this block.
                            
    $code_lines[$i] = '$_' $n[1] . '_count = ( isset(' $varref ') ) ? sizeof(' $varref ') : 0;';
                            
    $code_lines[$i] .= "\n" 'for ($_' $n[1] . '_i = 0; $_' $n[1] . '_i < $_' $n[1] . '_count; $_' $n[1] . '_i++)';
                            
    $code_lines[$i] .= "\n" '{';
                        }

                        
    // We have the end of a block.
                        
    unset($block_names[$block_nesting_level]);
                        
    $block_nesting_level--;
                        
    $code_lines[$i] .= '} // END ' $n[1];
                        
    $m[0] = $n[0];
                        
    $m[1] = $n[1];
                    }
                    else
                    {
                        
    // We have the start of a block.
                        
    $block_nesting_level++;
                        
    $block_names[$block_nesting_level] = $m[1];
                        if (
    $block_nesting_level 2)
                        {
                            
    // Block is not nested.
                            
    $code_lines[$i] = '$_' $m[1] . '_count = ( isset($this->_tpldata[\'' $m[1] . '.\']) ) ? sizeof($this->_tpldata[\'' $m[1] . '.\']) : 0;';
                            
    $code_lines[$i] .= "\n" 'for ($_' $m[1] . '_i = 0; $_' $m[1] . '_i < $_' $m[1] . '_count; $_' $m[1] . '_i++)';
                            
    $code_lines[$i] .= "\n" '{';
                        }
                        else
                        {
                            
    // This block is nested.

                            // Generate a namespace string for this block.
                            
    $namespace implode('.'$block_names);
                            
    // strip leading period from root level..
                            
    $namespace substr($namespace2);
                            
    // Get a reference to the data array for this block that depends on the
                            // current indices of all parent blocks.
                            
    $varref $this->generate_block_data_ref($namespacefalse);
                            
    // Create the for loop code to iterate over this block.
                            
    $code_lines[$i] = '$_' $m[1] . '_count = ( isset(' $varref ') ) ? sizeof(' $varref ') : 0;';
                            
    $code_lines[$i] .= "\n" 'for ($_' $m[1] . '_i = 0; $_' $m[1] . '_i < $_' $m[1] . '_count; $_' $m[1] . '_i++)';
                            
    $code_lines[$i] .= "\n" '{';
                        }
                    }
                }
                else if (
    preg_match('##'$code_lines[$i], $m))
                {
                    
    // We have the end of a block.
                    
    unset($block_names[$block_nesting_level]);
                    
    $block_nesting_level--;
                    
    $code_lines[$i] = '} // END ' $m[1];
                }
                else
                {
                    
    // We have an ordinary line of code.
                    
    if (!$do_not_echo)
                    {
                        
    $code_lines[$i] = 'echo \'' $code_lines[$i] . '\' . "\\n";';
                    }
                    else
                    {
                        
    $code_lines[$i] = '$' $retvar '.= \'' $code_lines[$i] . '\' . "\\n";'
                    }
                }
            }

            
    // Bring it back into a single string of lines of code.
            
    $code implode("\n"$code_lines);
            return 
    $code    ;

        } 
    [/supersaibal]
    Sotto la panza la mazza avanza.

  7. #7
    lo fa con preg_match e preg_match_all ,
    come era lecito aspettarsi

  8. #8
    [supersaibal]Originariamente inviato da Shores
    Beh, lo spezzone che hai postato richiama altre funzioni sempre della classe: load, che probabilmente carica da file o da DB, chi lo sa, il template che gli si richiede, Compile che esegue la preparazione del template ed eval (che non è un metodo della classe ma un comndo di php) che esegue realmente il template... [/supersaibal]
    i template a quanto vedo sono tutti nella dir di phpbb2 in templates\tema_selezionato

    non pensavo fosse così complicato separare i sorgenti php dai template
    Sotto la panza la mazza avanza.

  9. #9
    [supersaibal]Originariamente inviato da skidx
    lo fa con preg_match e preg_match_all ,
    come era lecito aspettarsi [/supersaibal]
    ah-ha! sì trovato... mizzega che casino
    Sotto la panza la mazza avanza.

  10. #10
    [supersaibal]Originariamente inviato da Caleb
    mizzega che casino [/supersaibal]
    il "difficile" dei template sta tutto qua, nelle espressioni regolari e nella sostituzione del pattern con il giusto codice php.

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.