Nápad jak dostat styly a scripty do hlavičky stránky

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

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)

Ascaria
Člen | 187
+
0
-

No tak si zase sestřelil další můj nápad, ale nepoužívám Kdyby.

Tharos
Člen | 1030
+
0
-

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.

Ascaria
Člen | 187
+
0
-

@Tharos: vidíš, nad tím jsem nepřemýšlel, tak to padá. Proč jen nemůže komponenta používat bloky ze šablony.

Editoval Ascaria (23. 4. 2012 13:23)

Tharos
Člen | 1030
+
0
-

@Ascaria: Pokud bys hledal nějaké skutečně light weight řešení, můžeš se podívat třeba ještě na tohle. Za určitých okolností to taky není úplně k zahození.

Filip Procházka
Moderator | 4668
+
0
-

@**Ascaria**: Snažím se, aby tohle šlo použít i bez celého Kdyby :)

Ascaria
Člen | 187
+
0
-

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é..

Tharos
Člen | 1030
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-
{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.