Newsgroup: it.comp.www.php
Titolo: eval() e ob_start

Salve a Tutti,
ho qualche piccolo problema con eval e output buffering, ho cercato in 
giro, ma onestamente non so nemmeno cosa cercare quindi propongo a voi 
la questione per avere un piccolo feedback. si tratta di qualcosa che ho 
sempre usato poco quindi non mi sento ferratissimo.
scenario: sto facendo un piccolo motore di templates che riceva dei 
contenuti, si carichi un template e restituisca i contenuti 
"templatizzati" da visualizzare all'interno del browser.
per questo motivo mi sono trovato ad utilizzare eval() ed output 
buffering che mi permetterebbe di immagazzinare il contenuto generato ad 
esempio in una variabile, prima che venga passato al browser (infatti 
eval() passa tutto al browser)
il codice è il seguente (tagliuzzato qua e la...)
$templatefile	= $PATH . "/il/mio/file.ext";
//... operazioni per la creazione dei contenuti
$templ_arr = file($templatefile);
$template = implode("", $templ_arr);
$template = addslashes($template);
$template = "\$tmp.=\"".$template."\";";
.....
ob_start();
eval($template);
$eval_buffer = ob_get_contents();
ob_end_clean();
.....
return $eval_buffer;
 
ebbene, la funzione non mi ritorna nulla ed eval() passa direttamente al 
browser.
che cosa mi sono perso? qualcuno sa dirmi cosa devo cercare (magari 
potrebbe semplicemente essere qualcosa da settare in php.ini....)
grazie
massimiliano

 al browser.  che cosa mi sono perso? 
Posta un semplice esempio di contenuto del file $templatefile.
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/3C
Vuoi supportarmi? 
http://url.repository.biz/go/3E
Do. Or do not. There is not try.

 Posta un semplice esempio di contenuto del file $templatefile.
grazie Setec per l'interessamento.
il file è un semplice:
<div class="Block">
	<div class="heading">$heading</div>
	<div class="gallery">$gallery</div>
	<div class="content">$content</div>
	....
</div>
chiaramente valorizzo le varie $heading .... ecc. con funzioni o mappe o 
qualsiasi altra cosa
ciao
massimiliano
 

 mappe o qualsiasi altra cosa
Da testare.
$template = file_get_contents($templatefile);
$template = addslashes($template);
$template = "echo \"" . $template . "\";";
.....
ob_start();
eval($template);
$eval_buffer = ob_get_contents();
ob_end_clean();
.....
echo $eval_buffer;


 echo $eval_buffer;
Grazie Setec,
Testato, ma non risolve il mio problema.
nel senso che devo mettere il contenuto eval'ed di $template su una 
variabile per poi restituirla indietro ad un'altra funzione.
In pratica uno script principale renderizza un template pseudo generico 
"contenitore", all'interno del contenitore possono esserci applicazioni che 
ritornano html e/o xml, le quali anche loro avranno il / i loro templates.
Nel caso specifico quello che mi sembra è che PHP se ne sbatte altamente di 
ob_start() nel senso che se io commento:
eval($template);
non mi fa vedere niente.
boh!
...adesso vedo di approfondire la cosa, tra l'altro non so nel tuo Yoda come 
faccia a gestire questa cosa.
grazie
massimiliano

 boh!
E secondo te che cosa dovrebbe farti vedere se non "esegui" il codice?
<?php 
// $template = file_get_contents($templatefile);
$template = '<b>$test</b>';
$template = addslashes($template);
$template = "echo \"" . $template . "\";";
/* impostazione variabili */
$test = 'Hello World!';
ob_start();
eval($template);
$eval_buffer = ob_get_contents();
ob_end_clean();
echo($eval_buffer);
?>
-- 
I am what I am, I do what I can


 E secondo te che cosa dovrebbe farti vedere se non "esegui" il codice?
sì, hai ragione Setec. in realtà volevo dire un'altra cosa, è che io ho 
tutta la situazione davanti ma non posso postare qui un centinaio di 
righe di codice.
in ogni caso ho fatto diversamente e la cosa funziona. (ma credo che 
dovrò approfondire eval e output buffering...)
Grazie ancora per l'interessamento
massimiliano

"templatizzati" da visualizzare all'interno del browser.
Ti diro': eval() m'e' sempre parsa una brutta strada, perche' in caso di
errori il debugging puo' essere difficile.
Se tutto quel che devi fare e' sostituire una variabile, cioe', ti serve
che
	<div>$pippo</div>
quando $pippo vale "PLUTO", diventi
	<div>$pluto</div>
allora puoi usare str_replace, oppure
        function populate(&$text, $var)
        {
                if (isset($GLOBALS[$var]))
                        return $GLOBALS[$var];
                return "<strong>Error! <em>\$$var</em> is not
defined</strong>";
        }
        $text = preg_replace("/\\$([a-z][a-z0-9]*)/e", "populate(\\\$text,
'\\1');", $text);
L'ho scritta in due minuti e di sicuro ci saranno piu' errori che righe
normali, ma con una guardata al manuale magari concludi qualcosa :-)
Non saprei come se la cava con la velocita', rispetto a eval()... se mi
fai sapere, m'interessa :-)
Leonardo
-- 
Avere studiato senza mettere in pratica e' inutile;
mettere in pratica senza avere studiato e' pericoloso.
                                                - Conphpucio