sablona komponenty – prebublanie bloku

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

Hello, PLS poradte ako nejaky blok zo sablony komponenty prebublam do @layout.phtml.Alebo ako najjednoduchsie podedim sablonu komponenty od sablony Presenter:View, kde sa komponenta vkladala?

@layout.phtml

...
  <div id="footer">
    <p>Copyright &copy;2010 Igor Hlina</p>
  </div><!-- #footer -->
</div><!-- #wrapper -->
{block #javascripts}{/block}
</body>
</html>

components/templates/graph.phtml

...
{block #javascripts}
  <script type="text/javascript" src="{$basePath}/js/EFlot/excanvas.min.js"></script>
  <script type="text/javascript" src="{$basePath}/js/EFlot/jquery.flot.js"></script>
{/block}

Editoval srigi (19. 6. 2010 23:10)

Ondřej Mirtes
Člen | 1536
+
0
-

Tohle bohužel zatím Nette neumí, ale bylo by to moc fajn no :)

Tharos
Člen | 1030
+
0
-

Jinak nejjednoduššeji lze tohle momentálně vyřešit asi tak, že presenter obsahuje například pole $scripts, které může předávat šabloně například v beforeRender(), a komponenta do tohoto pole může přidávat své skripty přes attached().

Já se tomuto systému snažím většinou ještě něco málo přidat na kráse tak, že presenter implementuje cosi jako například IScriptsHolder a v attached() se testuje, zda je komponenta připojována právě k implementaci tohoto rozhraní.

Dr.Diesel
Člen | 53
+
0
-

Ahoj vsem,

zkousel jsem se danou veci zabyvat, protoze jsme narazili na identicky problem s javascripty. Alespon jsem se vic dozvedel o tom, jak v realu funguji sablony, ono se to hodi. Imho jsem pri pokusech s implementaci narazil na to samy, na co narazi zavinacova magie:

  • Klicove: komponenta se zpracovava az v ramci daneho bloku sablony (nelze jiz prepsat bloky, ktere uz sou vypsane, typicky javascripty v hlavicce)
  • podarilo se mi upravit LatteMacros, aby se zpracoval render komponenty pred zpracovanim sablony (se zachovanim stavajici podoby zdrojove sablony). Nasledne i prenos pretizeneho bloku z komponenty do sablony byl mozny. Ale: {control} fungoval jen do chvile, nez byl obaleny do {if}, {for}, {foreach}, {while} apod., pak se samozrejme pristup se „zpracovanim komponenty napred“ hrouti (podobne jako se zavinaci).
  • Aktualni stav: Bylo by mozne v LatteMacros umoznit pretizeni bloku z komponenty, pokud {control} nebude uvnitr zadneho ridiciho cyklu, tj. „komponenta v sablone, ktera umi pretizit jeji blok (imho pouzitelne predevsim pro javascripty)“. To se mi podarilo a pokud myslite, ze je to uzitecne, muzu se podelit o stavajici upravu, ktera chce jeste doladit co do zavinacove magie/snippetu.

Editoval Dr.Diesel (15. 8. 2010 1:24)

Lopo
Člen | 277
+
0
-

neviem ci to je ono (ci som spravne pochopil), ale neni riesenim {include #parent} ?

@{block #javascripts}
{include #parent}
  <script type="text/javascript" src="{$basePath}/js/EFlot/excanvas.min.js"></script>
  <script type="text/javascript" src="{$basePath}/js/EFlot/jquery.flot.js"></script>
{/block}

tento sposob pouzivam na rozsirenie definicie stylov pri renderovani Excel XML

v layoute @xml.phtml mam nadefinovane zakladne styly

<Styles>
	{block #styles}
		<Style ss:ID="Top">
			<Font ss:Bold="1"/>
			<Alignment ss:Horizontal="Center" ss:WrapText="0"/>
			<Interior ss:Color="#B8CCE4" ss:Pattern="Solid"/>
		</Style>
		<Style ss:ID="Integer">
			<Alignment ss:WrapText="0"/>
			<NumberFormat ss:Format="0"/>
		</Style>
	{/block}
	</Styles>
@{include #content}

a potom v sablone konkretneho renderu v pripade potreby rozsirujem o dalsie styly

@{block #styles}
	{include #parent}
		<Style ss:ID="Int_sum">
			<Alignment ss:WrapText="0"/>
			<NumberFormat ss:Format="0"/>
			<Interior ss:Color="#92D050" ss:Pattern="Solid"/>
		</Style>
{/block}
@{block #content}
srigi
Nette Blogger | 558
+
0
-

Lopo napsal(a):

neviem ci to je ono (ci som spravne pochopil), ale neni riesenim {include #parent} ?

V sablone renderu to tak pouzivam aj ja. Problem je sablona komponenty. Ta nedokaze „bublat“ bloky hore.

Lopo
Člen | 277
+
0
-

aha, takze som nepochopil presne …