Nápad jak dostat styly a scripty do hlavičky stránky
- Ascaria
- Člen | 187
Zdravím,
napadlo mě, že jedním ze způsobů, jak dostat scripty a styly do hlavičky templatu z komponenty by mohlo být například normálně vypsat je do toku dokumentu:
<html>
<head>
</head>
<body>
- zacatek komponenty -
<div class="component">
<script type="text/javascript" src="/js/admin/domReady.js"></script>
</div>
- konec komponenty -
</body>
</html>
A speciální filter, nebo komponenta, nebo cokoliv (je těžký to správně nazvat, jelikož po zkoumání fungování šablon si nejsem jistý, zda-li to vůbec jde), by po renderu šablonu vzala, a všechny připojené scripty a styly uvnitř body by vyjmula regulárním výrazem, a následně třeba přez str_replace nebo jinou fci vložila do hlavičky dokumentu.
Muselo by se to nějak ošéfovat i pro ajax, aby bylo možné při ajaxovém načtení komponenty její styly a scripty přesunout do hlavičky, a kontrolovat duplicity třeba pomocí atributu src.
Jelikož jsou dědičnost šablon a napojování komponent do hlavní šabony dosti komplikované (že není ani po dlouhém zkoumání možné zjistit, jestli takto vůbec může komponenta do hlavičky něco „vložit“), tak se vás ptám, jestli má cenu nad takovýmto approachem vůbec přemýšlet a snažit se ho realizovat.
Editoval Ascaria (23. 4. 2012 12:12)
- Tharos
- Člen | 1030
Ascaria napsal(a):
A speciální filter, nebo komponenta, nebo cokoliv (je těžký to správně nazvat, jelikož po zkoumání fungování šablon si nejsem jistý, zda-li to vůbec jde), by po renderu šablonu vzala, a všechny připojené scripty a styly uvnitř body by vyjmula regulárním výrazem, a následně třeba přez str_replace nebo jinou fci vložila do hlavičky dokumentu.
Jenomže jak chceš tohohle docílit v okamžiku, kdy už byla část
výstupu (pravděpodobně tedy i head
element) odeslána
klientovi. :)
Pokud vygenerovaný HTML kód odesíláš až úplně na závěr a celý najednou, můžeš se na celý lazy loading komponent vykašlat, protože pak je stejně k ničemu.
- Filip Procházka
- Moderator | 4668
@**Ascaria**: Snažím se, aby tohle šlo použít i bez celého Kdyby :)
- Tharos
- Člen | 1030
Ascaria napsal(a):
Já se snažím najít co nejjednodušší řešení, co by umělo podporovat samotné Nette v základu. Ideální by bylo, aby David nějak zpřístupnil bloky šablony komponentě, což jak se zdá není prakticky možné..
Je tam principiální problém právě kvůli lazy vytváření komponent. Komponenta by se pak mohla snažit přepsat blok, který již má klient vykreslený v prohlížeči (v krajním případě).
Pokud ale tohle oželíš, není IMHO nijak složité napsat si nějaké
opravdu light weight řešení. Například v okamžiku připojení komponenty
do stromu presenterů se volá metoda attached
komponenty, která
má plný přístup i k šabloně presenteru.
Sesmolit light weight řešení není těžké. Trochu obtížnější je spíše napsat řešení nemagické, transparentní, dobře čitelné…
Editoval Tharos (23. 4. 2012 14:04)
- Ascaria
- Člen | 187
Tharos napsal(a):
Sesmolit light weight řešení není těžké. Trochu obtížnější je spíše napsat řešení nemagické, transparentní, dobře čitelné…
Tím vlastně ale říkáš, že celý ten event attached je magický… A pokud se komponenta zavolá až při renderu šablony tak attached proběhne stejně až po vykreslení hlavičky.
Pohrávám si v hlavě ale s jiným řešením:
nejakyView.latte
{block #head}
{if $chciVykreslit}
{control komponenta:head}
{/if}
{/block}
{block #content}
{if $chciVykreslit}
{control komponenta}
{/if}
A komponenta samozřejmě poskytuje dvě render metody, normální render() a pak renderHead(). Předpokládá se, že kvůli minimálnímu zatížení bude konstruktor komponenty pouze inicializovat nejnutnější proměnné.
. + Komponenta poskytuje dvě šablony, které vykreslí požadovaný obsah na požadovaných místech
. – Pokud je komponenta ve složité struktuře ifů, bude problém s dvojtým tvořením stejných podmínek
. ? jak o renderHead informovat ajax požadavek?
Editoval Ascaria (23. 4. 2012 14:35)
- Tharos
- Člen | 1030
@Ascaria: Ono nejsnazší by pro Tebe bylo dané komponenty vůbec nevytvářet pomocí továrniček, ale přímo v action metodách. Je-li vytvoření a nastavení komponenty rozsáhlejší, samozřejmě je vhodné vyčlenit jej do samostatné metody, ale k vlastnímu vytvoření (a tedy i připojení do stromu komponent) by mělo dojít v action metodě. Tam se můžeš spolehnout na to, že odesílání výstupu ještě nepropuklo.
Co se magie/nemagie týče, to je hodně subjektivní… Ale třeba mně se praktika, že si komponenta při připojení k presenteru sáhne na jeho šablonu a něco v ní upraví, tak úplně nelíbí. Ale účel světí prostředky – dokázal bych s tím žít, kdyby to prostě nešlo jinak. :)
- Ascaria
- Člen | 187
{block #title}{_'_zadost_o_certifikat_prislib'} | {include #parent}{/block}
{block #head}
{control promiseCertificate:head}
{/block}
{block #content}
<div class="certification">
<h2>{_'_zadost_o_certifikat_prislib'}</h2>
{control promiseCertificate}
</div>
Finální řešení, nelíbí se mi, ale lepší lightweight asi nebude.