Komponenta s argumenty dynamicky v textu

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

Chci mít v článcích možnost mít dynamicky vkládané šablony, používám toto v BasePresenteru, inspirovane zde na fóru od někoho:

$this->template->registerHelper('components', function ($text) {
			return preg_replace_callback("@\|\|\|(\w+) '(.+?)'\|\|\|@s", function($matches) {
				ob_start();
				$component = $this->getComponent($matches[1]);

				if (isset($matches[2])) {
					$this->args = $matches[2];
					$component->setArguments($matches[2]);
					$component->render();
				} else {
					$component->render();
				}
				return ob_get_clean();
			}, $text);
		});

funguje to tak, že v článku pak mohu mít např. |||survey ‚1‘||| a zavolá mi to továrnu pro kompoentnu survey a nastaví argument 1. Vše v pořádku, pokud je to komponenta pro vykreslení apod. Problém je, když tam chci mít odkazy. Musím si ten argument s id předávat ve všech odkazech, protože jinak jak se klikne, tak zmizí informace o tom, o jakou anketu jde. Je nějaké lepší řešení, abych nemusel ten argument vzdy predavat?

Unlink
Člen | 298
+
0
-

A ten argument máš ako persistentný parameter?

Jiří Nápravník
Člen | 710
+
0
-

Nemám, ale když jsem to zkoušel tak mi to s ním taky nechtělo fungovat, ale to jsem zkoušel s formulářem.

David Matějka
Moderator | 6445
+
+1
-

resil bych to asi pomoci multiplieru, tedy ze bys tu survey mel definovanou jako

protected function createComponentSurvey()
{
	return new Multiplier(function ($id) {
		return $this->surveyFactory->create($id);
	});
}

a v tom filtru bys zjistil, jestli se jedna o multiplier proved tam:

$component = $component[$id];
Jiří Nápravník
Člen | 710
+
0
-

@DavidMatějka Tohle ale řeší spíše předání toho id ne? Je pravda, že to je lepší než ten setter, co mám já, ono to ale takhle snadno ani nejde, ty argumenty nejsou jenom id, ona je to casto i nejaka zmet typu survey 1##left##3OO a pak si to rozberu a udelam z toho id, zatekani, sirka. neni to moc pekne, ale nic lepsiho jsem zatim nevymyslel.

Nicméně mě jde hlavně o to, aby se pak ten argument předal i po překreslení snippetu, odeslání formuláře. Tak nějak mě napadá, že to asi nepůjde, prootže ten argument a vlastně celá ta komponenta se poprvé řeší až na úrovni šablony (render metodě), tak to tam asi nijak jinak nedostanu. Zatím to předávám vše v odkazu či v hidden polích, ale bylo by lepší to řešit nějak lépe. Je to nějak řešitelné?

David Matějka
Moderator | 6445
+
0
-

@JiříNápravník ano, resi to jen ID. Ale to bude vetsinou asi jedine, co potrebujes pro ten signal – ty dalsi argumenty jsou dulezite jen pro render. Takze bude stacit nejak sikovne zjistit ID, ktere posles do multiplieru a zbytek posles jako nyni.

Jiří Nápravník
Člen | 710
+
0
-

Ok, to ID v tomhle pripade jde, ale pokud to chci trochu univerzalneji, tak asi bude lepsi to setArguments, jak mam. Protože tam volam treba i komponentu, kdy potrebuji seznam clanku, takze tam predavam argument s nekolika idcky.

Nicméně fungují vůbec v komponentách persistentí parametry. Že když sio tam pošlu to id, tak se mi předá automaticky a nemusím to řešit? Já když ten persistentní parametr v nastavím přes setter, tak se mi do odkazů vůbec nepředá. Dokonce jsem zkusil defaultní nastavení

/**
* @persistent
*/
public $id = '5';

a pak v render si pro zkoušku zavolal
$this->link('test!');

a id mi to tam nepředvyplní, jak bych čekal. Dělám něo špatně?