Autor Zpráva
na1k
Profil
Název je možná trochu nejasný, nevím jak přesně nazvat svůj problém.
Snažím se o jednoduchý šablonovací systém. Funkce, která nahrazuje proměnné v šabloně za obsah, hledá tvar {promenna} a tu potom nahradí z předem naplněného pole hodnot (např. obsahem $data['promenna']). Tuto funkci se snažím rozšířit tak, abych mohl ze šablony "odkazovat" na skutečné proměnné z celého skriptu.
Obsah, kterým nahrazuju šablonové proměnné je potom ${promenna}. Toto funguje, ale pouze v rámci funkce. Dostanu se tedy jenom k lokálním proměnným funkce. Napadlo mě jediné řešení, a to pokusit se před nahrazením danou proměnnou "zglobálnit", tzn.
if (!isset(${$nazev_promenne})) global ${$nazev_promenne};


Toto ale nefunguje... mám někde nějakou technickou nebo logickou chybu? Napadá vás jak toto řešit?
Kcko
Profil
tady mas myslim neco lepsiho




<?php


function getTemp($template, $data)
{
$template = file_get_contents($template);
$pattern[] = '~{$(.+?)}~ei';
$replacement[] = "$data['\1']";

$template = preg_replace($pattern, $replacement, $template);

return $template;
}




$data["hrac"] = "Kcko";
$data["vek"] = "25";

$sablona = null;
foreach ( array(1, 2) as $k )
{
$sablona .= getTemp("radek.html", array("hrac" => "Kacak", "vek" => 26) );
}


echo getTemp( "tabulka.html", array("radek" => $sablona) );

?>

na1k
Profil
Ale to je nahrazení obsahem, který je předem načtený v poli. To už ta moje funkce umí :-)
To co potřebuju udělat je, aby se nenahrazovalo obsahem pole (tzn. proměnná ze šablony = klíč prvku v poli), ale aby se nahradila obsahem proměnné, která je kdekoliv jinde ve skriptu.

Něco ve smyslu:

$prom1 = 'pokus';
.
.
.
function nahradit() {
$prom2 = 'jenom lokalni';
$sablona = 'obsah promenne prom1={prom1}'; // nacteno napr. ze souboru
$sablona = ereg_replace('{(.+)}',${'1'},$sablona); // nahradi {prom1} za skutecne $prom1
echo $sablona;
}


Toto je samozřejmě zjednodušený zápis (a možná i nefunkční), ale tak nějak bych potřeboval aby funkce fungovala. Hlavní je, aby uměla nahradit nejenom lokální $prom2 (to už moje funkce taky umí), ale i $prom1, která je mimo funkci a bylo by tudíž potřeba použít global.
Alphard
Profil
tak to hned nenahrazuj, ale projdi šablonu, najdi proměnné, definuj je jako globální a nahraď
na1k
Profil
No jasně, toto jsem napsal jenom jako ukázku. Ve skutečnosti procházím šablonu a postupně nahrazuju. Problém mám při definování proměnných jako globální.

global ${$jmeno_promenne}


..mi nechce fungovat
nightfish
Profil
na1k
a co na začátku funkce použít toto:

if (!isset(${$nazev_promenne})) ${$nazev_promenne} = $GLOBALS[$nazev_promenne];
na1k
Profil
nightfish
To je dobrý nápad, to mě nenapadlo :)
Funguje to sice jenom na proměnné, které byly dříve zglobálněné přes global, ale je to lepší než nic.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0