Komponenty – odkazování na jiné a renderování (jiné)-

Klobás
Člen | 113
+
0
-

Ahoj,

rád bych si ujasnil 2 věci:

  1. Lze vůbec nějak rozumně odkazovat z jedné komponenty na druhou? (pro jednoduchost komponenta A, B)
    1. pokud jsou obě komponenty v presenteru
    2. pokud jsou vytvořeny v jiných komponentách

Co jsem si tak zkoušel hrát s URL (tak když pošlu v GETu správnou URL (?komponenta-nejakyparametr=hodnota&do=komponenta-handle), tak to funguje, tak mě tedy asi jenom zajímá, dá se udělat přes nějakou metodu či makro smysluplný link?
(Vím, že v komponentě funguje {link handle!, params}, na presenter je to {plink), ale nic z toho mi nezacílí komponentu B odkazem volaným z A).

  1. V komponentě si můžu udělat víc render metod, renderFoo, renderBar… a pak controlku zavolat {control:foo}, {control:bar), to je fajn. Ale když ji překreslím ajaxem, tak se volá default, což je tedy jen render(), dá se to nějak smysluplně obejít, resp. nastavit.

Díky.

duke
Člen | 650
+
0
-

ad 1) Komponenty jsou samostatné jednotky a jako takové by se vůbec neměly spoléhat na to, co je mimo ně (včetně jiných komponent, které nejsou jejich subkomponentami). Chceš-li zajistit komunikaci s paralelně existujícími komponentami, řeš to pomocí reakcí na události v nadřazené komponentě (presenteru).

ad 2) Pokud vím, tak to nejde. Proto tyto specifické render metody komponent příliš nepoužívám (rozhodně ne tam, kde vím, že budu chtít používat ajax).

CZechBoY
Člen | 3608
+
0
-

Jetsli máš komponentu závislou na nějaký druhý tak je něco špatně. Jedině že bys měl jednu komponentu subkomponentou té druhé.

Klobás
Člen | 113
+
0
-

duke napsal(a):

ad 1) Komponenty jsou samostatné jednotky a jako takové by se vůbec neměly spoléhat na to, co je mimo ně (včetně jiných komponent, které nejsou jejich subkomponentami). Chceš-li zajistit komunikaci s paralelně existujícími komponentami, řeš to pomocí reakcí na události v nadřazené komponentě (presenteru).

ad 2) Pokud vím, tak to nejde. Proto tyto specifické render metody komponent příliš nepoužívám (rozhodně ne tam, kde vím, že budu chtít používat ajax).

  1. Jasně, myslel jsem si, že to bude mít nějaký takový důvod.
  2. Na tuto bariéru jsem taky narazil, čím víc nad tím přemýšlím, tak si myslím, že komponenta by měla mít pouze render metodu a žádnu další vykreslovací a v případě, že bych chtěl mít víc renderMetod, tak to řešit vícero komponentami, to je v pořádku ne?
  3. Rád bych ještě jednu věc, jak efektivně řešit výměnu šablony v renderu na základě např. handleMetody?

Např. Kontaktní formulář se vyrenderuje, a po odeslání ho handle metoda vrátí zase na „this“, ale chci zobrazit např. jen hlášku, že byl odeslán (tj. 2 šablona).

takže ideálně ContactFormComponent
 – default.latte (formular)
 – success.latte (jen hlaska o odeslani a pripadne merici kod atd.)

Nechci to resit nejakou pomocnou promennou a ifovat to v sablonach, takže mě napadlo toto:

<?php

class B extends Nette\Application\UI\Control {

	/** @persistent */
	public $view = 'b1';

	public function setView($view)
	{
		$this->view = $view;
	}
	public function render()
	{

		$this->template->setFile(__DIR__ . '/../templates/components/'.$this->view.'.latte');
		$this->template->render();

	}
.
.
.
// uz nepodstatny kod

?>

Samozřejmostí by bylo ošetření a „whitelist“ šablon.

Je to v pořádku, nebo řešit jinak / lépe?

Klobás
Člen | 113
+
0
-

CZechBoY napsal(a):

Jetsli máš komponentu závislou na nějaký druhý tak je něco špatně. Jedině že bys měl jednu komponentu subkomponentou té druhé.

Tak úplně to není, ale zdědil jsem projekt na Nette 2.0, který je z části modifikován (hlavně komponenty jsou tam dosti magické) a vznikla mi potřeba překreslit kontrolku A z

  • nějaké metody v nějakém presenteru
  • z komponenty X
  • z komponennty Z … atd

Takže jsem hledal co nejsnažší způsob, a nakonec jsem vytvořil klasickou továrnu v BasePresenteru + handle v BP a teď už si na ní snadno dostanu a můžu s ní pracovat.

Jen mě to zajímalo jak to je.

duke
Člen | 650
+
0
-

Je to v pořádku, nebo řešit jinak / lépe?

Může být. Nenapadá mě teď nic lepšího.

Klobás
Člen | 113
+
0
-

duke napsal(a):

Je to v pořádku, nebo řešit jinak / lépe?

Může být. Nenapadá mě teď nic lepšího.

No mě taky ne, ale já nejsem žádný Nette matador.
Tak moc díky za konzultace.