Re-definice blocku v šabloně komponenty

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

Pěkný podvečer.

V layoutu mám definovaný prázdný block title:

<title>Moje aplikace &ndash; {block title|striptags|trim}{/block}</title>

V šabloně default.latte je pak toto:

{block content}

{control myControl}

A konečně v šabloně vkládané komponenty je následující:

<h1 n:block="title">Můj titulek</h1>

O co mi kráčí jest, že mi titulek definovaný v šabloně komponenty neprobublá do layoutu :-(

Dělám něco špatně, resp. existuje nějaké schůdné řešení?

Děkuji…

na1k
Člen | 288
+
0
-

Nedávno jsem na to taky narazil … mám takové tušení, že nešlo o komponentu, ale {include} konkrétního latte souboru. Princip ale bude asi podobný.

Novou dokumentaci jsem četl, ale žádné výjimky z dědičnosti bloků jsem nenašel (anebo mi unikly). Stejně tak v issues nic není.

Takže buď to nikdo nepoužívá (to bych se divil) anebo děláme něco špatně :-P

22
Člen | 1478
+
0
-

hah, to jsem si myslel, že to ani nemá jít, potřeboval jsem jsem například vkládat {block js} s vlastním js controlu, takže potvrzuji, že to nefunguje a těším se na opravu :-)

uestla
Backer | 799
+
0
-

Nová issue nese ID #336.

David Grudl
Nette Core | 8228
+
0
-

Vkládaný control nemůže ovlivňovat bloky nadřazené šablony, to by vedlo k nepříjemným jmenným konfliktům.

uestla
Backer | 799
+
0
-

Tak nějak jsem si to podvědomě taky říkal, stáhnu tedy danou issue a zkusím to vyřešit jinudy…

srigi
Nette Blogger | 558
+
0
-

Mne to tiez nefunguje v {include} sablonach. O tom, ze bloky z komponentov nebublaju hore sa vie uz dlhsie, ale ze to nefunguje aj vo vkladanych sablonach, to ma prekvapilo (aktualna beta).

22
Člen | 1478
+
0
-

a na co je potom makro?

{includeblock 'file.latte'}
srigi
Nette Blogger | 558
+
0
-

22 napsal(a):

Napr. v mojom pripade mi to je na nic:

@layout.latte

...
{block javascripts}{/block}
</body>
</html>

default.latte

bla bla bla
...
{include '@comments.latte'}

@comments.latte

bla bla bla
...
{block javascripts}
	<script src="{$basePath}/js/blaBlaBla.js"></script>
{/block}

Toto mi v bete neprebubla.

22
Člen | 1478
+
0
-

no a nemělo by být teda:

bla bla bla
...
{includeblock '@comments.latte'}

teď jsem z toho makra nějaký zmatený teda..

Editoval 22 (8. 8. 2011 9:55)

srigi
Nette Blogger | 558
+
0
-

22 napsal(a):

Dik, vyskusam to tak. Dufam, ze to inkludne aj neblokovy obsah (bla bla bla).

Editoval srigi (8. 8. 2011 14:28)

uestla
Backer | 799
+
0
-

Zkusil jsem tedy následující „jednoduchý“ workaround:

@layout.latte zůstává stejný

Dále default.latte:

{block content}

{includeblock '../_common/myControl.latte', control => $control['myControl']}

Jako komponentu myControl uvažujme instanci třídy MyControl:

class MyControl extends BaseControl
{
	public function load()
	{
		return array(
			'title' => 'My Title',
		);
	}
}

A finálně šablona _common/myControl.latte:

{var $myControl = $control->load()}
<h1 n:block="title">{$myControl['title']}</h1>

Bohužel ani tutonc nezafunguje, přestože ke vkládání šablony s definicí bloků dochází již v úrovni šablony akce… Defaultní block title definovaný v layoutu tak zůstane nezměněn.

Někdo jakýkoli nápad? :-(

Děkuji.

uestla
Backer | 799
+
0
-

Tak jsem narazil na následující: https://forum.nette.org/…o-block-name#….

Bohužel je v tomhle případě funkce makra {includeblock ...} tak nějak neočekávaná :-(

V tom případě jsem se co se týče bezradnosti moc neposunul…

na1k
Člen | 288
+
0
-

Dovolím si oživit, protože mi tahle funkčnost dost chybí a nechci ji hackovat skrze attached a pomocné proměnné.

Nevidím do šablon do hloubky, ale jestli je problém jen ve jménech bloků, tak to je řešitelné, ne?

Stejně si myslím, že drtivá většina případů užití by byla doplňování dodatečných dat do <head>. Proč by tedy nemohla komponenta udělat něco jako

{block #head}
   {include #parent}
   <script></script>
{/block}

normální výstup komponenty