Newsgroup: it.comp.www.php
Titolo: template html e defines

Ho un file php con delle define di lingua
define('_TESTO','Questo è il testo');
ed un file html del tipo
<div>{_TESTO}</div>
due funzioni di questo tipo
## This function reads and return the template escaping double quotes
function GetTemplate($template) {
	return str_replace("\"","\\\"",implode("",file($template)));
}
## This function prints the template resulting from the above function
function PrintTemplate($template) {
	echo $template;
}
quando cerco di stampare il template con come segue
eval("PrintTemplate(\"".GetTemplate("summary.htm")."\");");
invece di vedere il contenuto della define, mi viene stampato
{_TESTO}
dove sto sbagliando?
Grazie
P.S. lo so che il sistema di templating che sto usando non è ottimale, e 
si può fare meglio, ma questo è l'unico metodo che mi ha sempre 
funzionato senza problemi.

 sempre funzionato senza problemi.
IMHO questo post contraddice direttamente la tua motivazione.
Identico risultato con molto meno sforzo.
<?php 
define('_TESTO','Questo è il testo');
// $html = file_get_contents('template.htm');
$html = '<div>{_TESTO}</div>';
$constants = array();
$defined_constants = get_defined_constants();
foreach ($defined_constants as $name => $value) {
	$constants['{' . $name . '}'] = $value;
}
$html = str_replace(array_keys($constants), 
                    array_values($constants), 
                    $html);
print($html);
?>
-- 
I am what I am, I do what I can
Do. Or do not. There is not try.

Setec Astronomy ha scritto:
 > Movie Maniac® wrote:
 >
 >
 >> ## This function reads and return the template escaping double quotes
 >> function GetTemplate($template) {
 >>     return str_replace("\"","\\\"",implode("",file($template)));
 >
 >
 >
 > Perche' usare implode e file invece di file_get_contents?
 >
 >
 >> eval("PrintTemplate(\"".GetTemplate("summary.htm")."\");");
 >
 >
 >
 > Perche' usare eval invece di richiamare direttamente PrintTemplate()?
 >
 >
 >> P.S. lo so che il sistema di templating che sto usando non è
 >> ottimale, e si può fare meglio, ma questo è l'unico metodo che mi ha
 >> sempre funzionato senza problemi.
 >
 >
 >
 > IMHO questo post contraddice direttamente la tua motivazione.
Setec, altre volte ho chiesto delucidazioni, e mi sono beccato le tue 
cazziate :D
Per carità, sepre ben accette perchè ho solo da imparare. Ma ho già 
provato a fare come dici tu, e non sono mai riuscitoa  cavare un ragno 
dal buco. E per ciò sono rimasto col metodo che già conosco.
 > Identico risultato con molto meno sforzo.
 >
 > <?php
 > define('_TESTO','Questo è il testo');
 >
 > // $html = file_get_contents('template.htm');
 > $html = '<div>{_TESTO}</div>';
 >
 > $constants = array();
 > $defined_constants = get_defined_constants();
 > foreach ($defined_constants as $name => $value) {
 >     $constants['{' . $name . '}'] = $value;
 > }
 > $html = str_replace(array_keys($constants), 
array_values($constants),                     $html);
 >
 > print($html);
 >
 > ?>
Bene, ho effettuato questa prova:
$constants = array();
$defined_constants = get_defined_constants();
foreach ($defined_constants as $name => $value) {
     $constants['{' . $name . '}'] = $value;
}
$html = file_get_contents("modules/".$ModName."/templates/summary.htm");
autosurfmonitor_PrintTemplate($html);
$html = str_replace(array_keys($constants),
                             array_values($constants), $html);
print($html);
Il guaio è che il template viene stampato in un ciclo quindi più volte.
Bene, mentre prima dal codice:
<div>{_MINIMALSPEND} {$site['minimal_spend']}€</div>
ottenevo un output di questo tipo:
  {_MINIMALSPEND} 6€
ora ottengo il codice
  Minimal spend: {$site['minimal_spend']}€
cioè, esattamente il complemetare del precedente.
E' questo il vero problema. In un modo o nell'altro, non ne vengo a capo :(
Grazie comunque

 dal buco.
Questa volta invece sono arivato al risultato che volevo trasformando la 
funzione GetTemplate in questo modo:
function GetTemplate($template) {
    $html              = file_get_contents($template);
    $constants         = array();
    $defined_constants = get_defined_constants();
    foreach ($defined_constants as $name => $value) {
       $constants['{' . $name . '}'] = $value;
    }
    $html = str_replace(array_keys($constants),
                        array_values($constants),
                        $html);
    return str_replace("\"","\\\"",$html);
}
La domanda ora è? Possibile che io sia costretto a passare attraverso 
quel loop?
Solitamente, se invece di fare il template, usassi codice html immerso 
nel php, in questo modo:
echo "<div>"._MIADEFINE.": ".$mia['variabile']."</div>";
non avrei bisogno di quel loop, ma mi basterebbe fare un "include" del 
file contenente le defines.
Come mai?
Grazie comunque per la disponibilità ;)

 E' questo il vero problema.
IMHO il problema e' che ti ostini ad usare un metodo complicato che tu
stesso non comprendi invece di usare uno dei motori di template che
gia' esistono.


 Come mai?
Per il semplice fatto che il mio codice NON usa eval.


 Per il semplice fatto che il mio codice NON usa eval.
Questa è troppo criptica. :D
Vuoi forse dire che dovrei trovare il modo ora di utilizzare eval 
insieme al resto del codice?
Grazie

 gia' esistono.
Non è che mi ostino. E' semplicemente che ho bisogno di una funzioncina 
davvero elementare, che sia in grado di prendere in pasto un file .thm e 
restituirmi l'output sostituendo variabili e costanti come si deve. Non 
avverto la necessità di "appesantire" lo script con un intero motore di 
templating, non per il momento almeno.
Grazie comunque per la disponibilità :)
Ciao

 variabili e costanti come si deve. 
ob_start();
include('template.htm');
$html = ob_get_contents();
ob_end_clean();
print($html);


 insieme al resto del codice?
No.


 No.
OK
Adesso riporto la soluzione a cui sono pervenuto. Prima però fammi fare 
una piccola premessa.
Non sto sviluppando una applicazione standalone, ma un modulo per un CMS 
(mdpro).
Per quanto riguarda i motori di templating, il panorama è ancora troppo 
variegato, ci sono 4-5 alternative, e i miei moduli preferisco 
svilupparli in maniera indipendente per ora, fino a quando il team di 
sviluppo non avrà deciso con certezza quale di questi adottare. Questo 
per non costringere l'utente poi a mettere sul server 3-4 motori diversi.
Le costanti che sono definite sono tantissime, e per la precisione, 
nella configurazione attuale del CMS sul server di prova, sono ben 1087. 
Per questa ragione cercavo il metodo più "rapido" e meno "esigente" per 
effettuare questa benedetta sostituzione.
Ovviamente lo faccio da inesperto, e quindi il risultato può benissimo 
fare schifo :)
ad ogni buon conto ho fatto in questo modo, e SEMBRA funzionare:
1) ho definito tutte le costanti del mio modulo così:
       define('_ASM_NOMECOSTANTE','Testo costante')
       dove _ASM_ è un prefisso comune a tutte
2) ho cambiato le funzioni che "elaborano" il template e lo stampano così:
## This function reads and return the template escaping double quotes
function GetTemplate($template) {
    $html      = file_get_contents($template);
    $constants = array();
    // Here I keep the defined_constants_array and clean it from all the
    // keys that do not contain _ASM_ prefix
    $defined_constants =array_flip(array_filter(
                                   array_flip(get_defined_constants()),
                                   'defines'));
    $html = str_replace(array_keys($defined_constants),
                        array_values($defined_constants),
                        $html);
    return str_replace("\"","\\\"",$html);
}
## This function prints the template resulting from the above function
function PrintTemplate($template) {
	echo $template;
}
## This function keeps an $array, and returns an array whose key names 
contains the string "_ASM_"
function defines($array) {
	return strstr($array, "_ASM_");
}
3) dal codice, esattamente come priuma, richiamo le funzioni così:
 
eval("PrintTemplate(\"".GetTemplate("modules/".$ModName."/templates/summary.htm")."\");");
Alcuni passaggi, come l'assegnazione di un prefisso, sono stati 
obbligati, perchè altrimenti le sostituzioni venivano effettuate 
maluccio. Ad esempio, definite le costanti
define('_REFERRALS','Referrals');
define('_REFERRALSEARNINGS','Earnings from referrals');
la seconda define veniva sostituita come
ReferralsEARNINGS
facendomi incacchiare non poco.
Il codice senza dubbio può essere migliorato tantissimo.
Ad esempio, l'istruzione
strstr($array, "_ASM_");
penso possa essere sostituita con le regular expressions, che dovrebbero 
garantire prestazioni migliori su grandi moli di dati (o sbaglio?).
Un altro consistente miglioramento, IMHO, si potrebbe lo potrei ottenere 
se riuscissi ad evitare il doppio array_flip, potendo effettuare il 
filtraggio dell'array direttamente sui nomi delle chiavi e non sui 
valori. ma al m omento sono fermo a leggere il manuale per trovare un 
equivalente di array_filter che soddisfi questi requisiti.
Ciao e grazie

    $constants = array();
hem, questa riga ovviamente nel codice che utilizzo è commentata, ma mi 
sono scordato :)
scusate

 print($html);
così come è, mi restituisce l'html senza aver effettuato alcuna 
sostituzione però :(
Ciao

 sostituzione però :(
Ma lo hai almeno provato il codice prima di sparare a zero?
La risposta e' ovviamente no, altrimenti ti saresti accorto che
funziona perfettamente.


 funziona perfettamente.
E' evidente che non c'è fiducia :(
Si, il codice l'ho provato, probabilmente sono talmente schiappa da non 
essere riuscito a farlo funzionare. ma ti posso assicurare che non sono 
così malato di mente da stare qui a ragionarci su se mi avesse 
funzionato alla perfezione. Tutto qui.
Non  ho sparato assolutamente a zero, non sono nella posizione più 
idonea per farlo, e ne sono consapevole. :)
Ciao e grazie ;)

 essere riuscito a farlo funzionare.
mi sono scordato di dire che non è che non funzioni totalmente. Mi 
stampa a video il codice html (stili, tabelle, colori, tutto), senza 
però intepretare e sostituire le variabili e le costanti, tutto qui.
Grazie comunque

 funzionato senza problemi.
scusami, ma hai mai provato ad utilizzare smarty ??
http://smarty.php.net
ciao
Alesi_27