Tvorba snippetu v PHP kodu

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

Ahoj,

mám makro na tvorbu komponenty, protože původní control mi nestačilo. Takže skrze PhpWriter provádím některé další příkazy. Je nějaká možnost vytvořit snippet pomocí PhpWriteru? Spousty komponent totiž parsuji přímo z databáze a nějakého uživatelského obsahu, takže není možnost obalit komponentu ručně, proto bych chtěl aby samotné makro pro tvorbu komponenty obalilo tuto komponentu snippetem, aby byla možnost poté uvnitř komponenty jí samotnou překreslit.

Díky za tipy.

h4kuna
Backer | 740
+
+1
-

Snippet není nic jinného než element s id, mající nějakou konvenci. Takže obalení by neměl být problém. Teď jen jak to pojmenovat, aby název odpovídal názvu elementu který bude u klienta. A k tomu je málo informací.

GEpic
Člen | 566
+
0
-

h4kuna napsal(a):

Snippet není nic jinného než element s id, mající nějakou konvenci. Takže obalení by neměl být problém. Teď jen jak to pojmenovat, aby název odpovídal názvu elementu který bude u klienta. A k tomu je málo informací.

Ano, ale bohužel snippety (i když to tak asi má být) nelze invalidovat, pokud jsou včetně komponent vypsány skrze proměnou v presenteru. Tzn. Obsah stránky mam v proměnné, tu proženu funkcí na přeparsování maker na klasická nette {} makra, včetně snippetu, tuto proměnou pak vypíšu v template.

Komponenty se vykreslí a fungují, snippety už bohužel ne. Jakmile budu trošku ready, pokusím se nastínit kódem.

Editoval GEpic (29. 9. 2016 12:43)

Michal Hlávka
Člen | 190
+
0
-

h4kuna napsal(a):

Snippet není nic jinného než element s id, mající nějakou konvenci. Takže obalení by neměl být problém. Teď jen jak to pojmenovat, aby název odpovídal názvu elementu který bude u klienta. A k tomu je málo informací.

Ano, ale Nette pak nevi jakou cast invalidovat a hodit do payloadu.

h4kuna
Backer | 740
+
0
-

Pokud je obsah snippetu v proměnný, tak si naplň payload ručně, případně si sám vytvoř json odpověď. Zase to musí mít jen nějakou konvenci, aby klient poznal že přichází odpověď se snippetem. Kód by se hodil.

GEpic
Člen | 566
+
+1
-
public function redrawComponent()
{
		$presenter = $this->getPresenter();
		$snippet = $presenter->getSnippetId($this->componentName);

		ob_start();
		$this->component->render();
		$presenter->payload->snippets[$snippet] = ob_get_contents();
		ob_end_clean();
		$this->getPresenter()->sendPayload();
}

Vyřešeno. v $this->componentName je buďto natvrdo (čti ‚zapsané v přímo v šabloně‘) definované jméno komponenty (třeba patička webu, která je na svém místě vždy), nebo generované ID komponenty, pokud je vytvářena dynamicky třeba uvnitř článku (třeba galerie v půlce uživatelského článku). V $this->component je potom jakákoliv komponenta. Veškeré dynamické komponenty dědí od jedné Base, která řeší volání na komponentu nad ní, kde je právě tato metoda implementována. Takže poté stačí kdekoliv zavolat v jakékoliv komponentě po handleXYZ $this->redrawComponent() a do prohlížeče se pošle jen tato komponenta, i přesto že je v proměnné, ve které můžou být další komponenty nebo uživatelsky naťukaný obsah přes wysiwyg.

Editoval GEpic (5. 10. 2016 23:12)