Tvorba snippetu v PHP kodu
- GEpic
- Člen | 566
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.
- GEpic
- Člen | 566
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
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.
- GEpic
- Člen | 566
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)