komponenta v textu z databáze

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

Ahoj,

řeším následující problém. Mám text z DB a uvnitř bych chtěl něco (např. ///component///) nahradit za komponentu.

TEXT
///component///
TEXT

Hledal jsem zde na foru a jsou tu postupy staré x let. Neexistuje něco aktuálního a jednodužšího?

Děkuji

greeny
Člen | 405
+
0
-

Pokud je jistota, že v každém textu bude jen jedna komponenta (nebo žádná), můžeš použít tohle:

<?php

{capture $component}
	{control fooControl}
{/capture}

{$dbText|replace:'///component///',$component}

?>
batko
Člen | 219
+
0
-

Ta jistota tam není… muze jich tam byt vice 0,1,X

greeny
Člen | 405
+
0
-

No ale pokud jsou všechny stejné, pak tohle bude fungovat. Asi mi tam vypadlo slovíčko „různé“ :D

David Matějka
Moderator | 6445
+
0
-

asi takhle:

$presenter = $this;
$text = preg_replace_callback('~///(\w+)///~', function($matches) use($presenter) {
	ob_start();
	$presenter->getComponent($matches[1])->render();
	return ob_get_clean();
}, $text);
batko
Člen | 219
+
0
-

ano mohou být i naprosto různé, je to docela zapeklitý problém

batko
Člen | 219
+
0
-

matej21 napsal(a):

asi takhle:

$presenter = $this;
$text = preg_replace_callback('~///(\w+)///~', function($matches) use($presenter) {
	ob_start();
	$presenter->getComponent($matches[1])->render();
	return ob_get_clean();
}, $text);

uf :-) děkuji za nástřel, jdu to zkusit, ale jsem z toh na první pohled nemoudrý :-)

batko
Člen | 219
+
0
-

tak bohužel mi tohle nic nededělá. Mohl bys mi prosím dát nástřel použití?

David Matějka
Moderator | 6445
+
0
-

„nic nedela“ znamena co? neupravi to ten text? zkusil jsem to a funguje mi to bez problemu. dej to do nejaky render* metody v presenteru a uprav tim ten text, cos vybral z databaze

Editoval matej21 (21. 3. 2014 16:42)

batko
Člen | 219
+
0
-

uz mi to jde. Ještě dotaz, zda jde nějak dostat tuto funkci do šablony. Abych to mohl volat až v šabloně.

příklad

<?php

<h1>{$article->name}</h1>
<p>
{potrebnaFce($article->text)}
</p>

?>

Editoval batko (21. 3. 2014 17:45)

jiri.pudil
Nette Blogger | 1029
+
0
-

Ideálně jako helper

batko
Člen | 219
+
0
-

bohužel to nic nevypíše a nic se nestane

basepresenter:

<?php
    protected function startup() {
	parent::startup();

	$this->template->registerHelper('components', function ($text) {
	    $presenter = $this;

	    $text = preg_replace_callback('~///(\w+)///~', function($matches) use($presenter) {
		ob_start();
		$presenter->getComponent($matches[1])->render();
		return ob_get_clean();
	    }, $text);
	});
    }
?>

pagepresenter

<?php
 function renderDetail() {
	$this->template->a = "text ///menu/// text";
    }
?>

latte

<?php
{$a|components}
?>
jiri.pudil
Nette Blogger | 1029
+
0
-

Helper musí vrátit transformovaný výstup. Tzn. místo

$text = preg_replace_callback(...

má být

return preg_replace_callback(...

Editoval jiri.pudil (22. 3. 2014 9:25)