Nahrazení obsahu proměnné z databáze

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
wise
Člen | 161
+
0
-

Zdravim,

potřeboval bych trošku poradit.

Z db tahám pole hodnot (key ⇒ value,…), kde value je nějaký text, který i např. obsahuje nějaké proměnné „{$investors}“ atp.

momentálně toto pole do šablony předám klasicky jako pole a v šabloně
hodnoty zobrazuju jako array[key]. Nicméně se samozřejmě nenahradí proměnné za jejich hodnoty.

Poradíte jak na to? Díky moc.

vvoody
Člen | 910
+
0
-

Skus znovu :) najlepsie nam sem skopiruj

  • nejakou ukazkou ako sa ti zobrazuje vystup teraz
  • aky vyskup by si chcel mat
  • kusy kodu od miesta kde tahas data z databaze az po samotnu sablonu kde ich vypisujes
wise
Člen | 161
+
0
-

Ok :-)

$this->template->text = $this->model->user->getText();

Text je např. array('foo' => 'bar', 'foo2' => '<p>Bar2 {$var}</p>')

a v template {!$text['foo2']} a samozřejmě jako výpis dostanu Bar2 {$var}

a ve výstupu bych samozřejmě chtěl mít hodnotu proměnné $var.

Editoval wise (20. 6. 2012 15:55)

vvoody
Člen | 910
+
0
-

tak to ta nepotesim, tak to nefunguje :)

wise
Člen | 161
+
0
-

A co je potřeba udělat pro to, aby to fungovalo? Resp. je-li to možný :-)

jtousek
Člen | 951
+
0
-

Možný je všechno, ale doporučit to opravdu nelze. ;-) Raději to vymysli lépe.

vvoody
Člen | 910
+
0
-

Riesit sa to da rozne, ale kazde riesenie je vhodne na inu situaciu a predpokladam ze to nechces len na fu bar testovanie :) Opis nam funkcionalitu aplikacie ktoru programujes a preco take nieco v nej potrebujes. Skusime ti navrhnut vhodnejsie riesenie.

wise
Člen | 161
+
0
-

Jde o text, který si chce klient sám upravovat, ale jsou tam proměnné. Teď mě napadlo, že to udělám nějak ((var)) a potom to nahradím za tu hodnotu. Co myslíte?

Editoval wise (20. 6. 2012 17:11)

jtousek
Člen | 951
+
0
-

Uživatel (klient) by neměl mít možnost přistupovat k proměnným jako $presenter nebo psát si tam vlastní PHP kód (který by vložit mohl kdybys to prohnal přes Latte). Vhodný přístup tedy je napsat si nějaký vlastní filter či nahrazovací fci a dát klientovi k dispozici jen několik proměnných které potřebuje, ale určitě ne celé PHP/Latte.

wise
Člen | 161
+
0
-

Jasně, jde mi jen právě o těch pár proměnných.

bojovyletoun
Člen | 667
+
0
-

napadlo mě toto:

1 řešení

  • v šabloně použít {!$text['foo']|subst}
  • využít fakt, že přístup k proměnným bude $template->$attr
  • a nakonec přidat helper, který provede nahrazení…
$template->text = array("tale" => "In one country was a {person}.");
$template->subst = array("person" => "thief");
$template->registerHelper('subst', function($s)use($template) {
		return \Nette\Utils\Strings::replace($s, '#\{([^\}]+)\}#', function($m)use($template) {
					return $template->subst[$m[1]];
				});
	});

			$s = <<<'AAA'
{!=$text[tale]|subst}
AAA;
$template->setSource($s);
echo $template;

2. řešení

(pro ty, kteří neradi znovu vymýšlejí kolo)

případně si můžeš v presenteru vyrobit (Template), nastavit jí setSource('Hello, {$person}')pak ji předat do hlavní šablony ($template->part=$part;), předat jí parametry($part->setParameters(araay(person=>nixon)) A v hlavní šabloně {include $part}.

Je to jen nástřel, některé věci jsou nedořešené…

Editoval bojovyletoun (20. 6. 2012 17:58)