Jak načíst komponentu samu do sebe?

kuon
Člen | 17
+
0
-

Ahoj,
už jsem vyzkoušel snad všechno, co se dá, takže prosím o radu následujícího problému.

Potřebuji z databáze vypisovat obsah krátkých zpráv (článků) rozdělených do kategorií (rozřazuji do accordion), ke kterým se přidávají komentáře (diskuse). Pokud mám jednu úroveň nebo mohu načíst všechno najednou, tak je to v pohodě. Problém je, že každá kategorie může mít neomezený počet podkategorií a je jich fakt hodně, takže to chci načítat přes ajax tak, že při prvním načtení stránky se načtou pouze kategorie první úrovně a při rozkliknutí jedné z kategorií (položka v accordion) se načte obsah dané kategorie – tzn. zprávy a případné její přímé podkategorie. A zde jsem ztroskotal. Buď to načtu přes block, který mohu pak načítat sám do sebe s předanými parametry, ale toto řešení obsahuje zanořené dynamické snippety, což nefunguje. Nebo to načítám přes komponentu, kde mi fungují snippety, ale tu se mi nepodařilo nijak vložit samu do sebe.

V latte načítám komponentu:

{control uredniDeska 'prvni'}

Obsah komponenty:

{snippet SNI_uredni_deska}
<div id="accordion_{$kod_skupiny}" class="UD_accordion">
	{foreach $kategorie as $KAT_key => $KAT_row}
	<div class="card card-{$KAT_row[kat_barva]}">
		<div class="card-header">
				<a data-toggle="collapse" href="#collapse_{$KAT_key}"></a>
		</div>
		<div id="collapse_{$KAT_key}" class="collapse" data-parent="#accordion_{$kod_skupiny}">
			{control uredniDeska $KAT_key} /*tady bych chtěl znovu načíst tu samou komponentu, která vypíše obsah podkategorie*/
			/*tady bude výpis zpráv dané kategorie*/
		</div>
	</div>
	{/foreach}
</div>
{/snippet}

Jak mám tedy vyřešit to, když potřebuji načítat postupně dané kategorie a jejich příslušné zprávy a podkategorie s tím, že pod každou zprávou mám DIV s tlačítkem na potvrzení přečtení a diskusi – tzn. potřebuji při změně dynamicky načítat jen tento DIV. Děkuji za rady.

Editoval kuon (12. 11. 2022 17:52)

kuon
Člen | 17
+
0
-

Opravdu mi s tím nikdo nedokáže poradit?

Než to zvládnu vymyslet, předělal jsem to tak, aby se obsah skupin načítal ajaxem a podskupiny se přesměrovaly na novou stránku a načetl se jejich obsah jako by šlo o první úroveň. Narazil jsem ale na problém. Když komponentu s výpisem zpráv načítám hned při načtení stránky, tak je vše v pořádku, ale když ji načtu po ajaxovém požadavku a překreslení snippetu, tak mi hlásí, že nemá data, která jsem jí poslal. Kde může být problém? Je možné komponentu načíst uvnitř překresleného snippetu?

Marek Bartoš
Nette Blogger | 1162
+
0
-

Jak jsi zkoušel komponentu vložit samu do sebe? PHP kód vytváření komponenty by nám řekl více.

Instance komponenty by se neměla vypisovat vícekrát, s různými konfiguracemi. Z pohledu Nette to bude pořád tatáž instance a nerozliší je od tebe. Pro každou kategorii by sis instanci komponenty měl vytvořit znova, pak ti budou snippety fungovat správně.

Komponenta může obsahovat vnořenou komponentu, i pokud je téhož typu. Může mít i seznam komponent, přes multiplier https://doc.nette.org/…n/multiplier

Editoval Marek Bartoš (14. 11. 2022 15:59)

kuon
Člen | 17
+
0
-

Marek Bartoš napsal(a):

Jak jsi zkoušel komponentu vložit samu do sebe? PHP kód vytváření komponenty by nám řekl více.

Instance komponenty by se neměla vypisovat vícekrát, s různými konfiguracemi. Z pohledu Nette to bude pořád tatáž instance a nerozliší je od tebe. Pro každou kategorii by sis instanci komponenty měl vytvořit znova, pak ti budou snippety fungovat správně.

Komponenta může obsahovat vnořenou komponentu, i pokud je téhož typu. Může mít i seznam komponent, přes multiplier https://doc.nette.org/…n/multiplier

Přikládám kód z komponenty „uredniDeskaControl“, ve které načítám jinou komponentu „zpravaControl“, která vypisuje zprávy (články):

	protected function createComponentZprava()
	{
		return new \Nette\Application\UI\Multiplier(function ($itemId) {
			return new \App\Presenters\zpravaControl($this->database, $this->SES_ok, $this->user, $itemId);
		});
	}

Když jí potom načítám v latte bez ajaxu, tak se vše provede správně:

{control zprava-{$AKT_key}, $AKT_row, $UD_data['kategorie_NAD']['kat_nazev']}

Ale když ji načtu přes dynamický snippet, který mám ve snippetArea, tak mi to vyhodí chybu, že nezná ty proměnné, které do ní vkládám.

kuon
Člen | 17
+
0
-

Už jsem se možná někam posunul – jde mi už načítat komponentu samu do sebe. Kód je ale nefunkční, protože mi při načtení vnořené komponenty vyhodí chybu, že nezná proměnné, které načítám ve funkci „startup()“ v BasePresenteru. Ať to zkouším jakkoliv, nedaří se mi zařídit, aby zanořená komponenta vykreslila jenom sebe a nepřekreslovala celou stránku? Poradí mi někdo prosím?

Marek Bartoš
Nette Blogger | 1162
+
0
-

Co znamená, že je nezná? Kam ty proměnné nastavuješ, jak je v komponentě získáváš?

kuon
Člen | 17
+
0
-

V komponentě je nijak nezískávám. Jsou to proměnné, kterou jsou určené pro základní latte presenteru jako např. do tagu title, description apod. Když načítám komponentu neajaxově, tak je vše v pořádku, ale při ajaxovém požadavku se z nějakého důvodu snaží překreslit celou šablonu a tyto proměnné z funkce startUp() v BasePresenteru tam chybí.

Obešel jsem to tak, že potřebné komponenty načítám hned s novou stránkou a když potřebuji aktualizovat obsah přes ajax, tak už jen invaliduji jejich vnitřní snippet. Asi to není moc elegantní řešení, ale takto mi to funguje.