Ako ovplivnit blok v layoute z komponenty

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

Caute, akoby ste riesili situaciu ked mate nejaku komponentu a potrebujete vlozit napr. meta tag do head, ale len ked sa ta komponenta zavola? Uvazoval som ze si v komponente urobim static paraneter a na konci layoutu zi zavolam render tej komponenty ktora mi vrati to co ma do header vlozit. Ale velmi sa mi to nepaci. Neriesili ste to niekto?

class MyControl extends Control
{
	private static $header = array();

	public function render()
	{
		// render control
		// add data for header
		$this->header[] = '<meta ...>'
		$this->template->render();
	}


	public function renderHeader()
	{
		// data for header
		$this->emplate->header = $this->header;
		$this->template->render();
	}
}
<head>
	{include #header}
</head>
<body>
	{control myControl}
	...
	{block #header}
		{control myControl:header}
	{/block}
</body>
Michal Vyšinský
Člen | 608
+
0
-

Já bych na to šel asi takto:

  1. V presenteru si vytvořím array property headers (předpokládejme, že víme, v kterém presenteru budeme komponenty potřebovat/vkládat)
  2. V render metodě komponenty bych přes $this->presenter->header naplnil data, která chci vložit.
public function render() {
	$this->presenter->header[] = "<meta ...>";
}
  1. Abych zajistil, že se změny pomocí komponent projeví vždy (i když budu komponentu vkládat třeba před </body> tak bych layout upravil takto:
<head>
{capture $html}
</head>
<body>
    {control myControl}
    ...
    {block #header}
        {control myControl:header}
    {/block}
</body>
{/capture}
{foreach $headers as $header}
	{!$header}
{/foreach}
{!$html}

Editoval CherryBoss (24. 5. 2013 15:41)

duskohu
Člen | 778
+
0
-

To znie celkom fajn. Len som chcel aby to nebolo v presentru, ale aby som mal na vkladanie do header zvlast komponentu ktoru si injectnem kdekolvek do presenteru alebo dalsej komponenty napumpujem ju vsetkym co chcem do header dat a ona sa potom vypise v savlone. Alebo aby to bola funkcionalita danej komponenty ktora si do header potrebuje nieco vlozit.

Michal Vyšinský
Člen | 608
+
0
-

Tak není problém místo toho cyklu vložit vlastní komponentu a property dát do komponenty:

class HeaderControl extends Control {
	public static $headers = array();

	public function render() {
		foreach(self::$headers as $header) {
			echo $header . "\n";
		}
	}
}

Šablona:

<head>
{capture $html}
</head>
<body>
    {control myControl}
    ...
    {block #header}
        {control myControl:header}
    {/block}
</body>
{/capture}
{control header}
{!$html}

A pak v některé komponentě jen:

HeaderControl::$headers[] = "<meta...>";

Edit: Možná by pak stálo za to ošetřit vstupy do toho headeru, aby se ti tam nedostal z nějaké komponenty škodlivý kód, ale jestli budeš komponenty tvořit jen ty tak to asi není potřeba.

Editoval CherryBoss (24. 5. 2013 15:52)

duskohu
Člen | 778
+
0
-

No minimalne za skusku to stoji, dik za nakopnutie, idem to skusit :-)

duskohu
Člen | 778
+
0
-

este som dospel k jednemu problemu ked pouzivam skladanie sablon cez:

<!DOCTYPE html>
<html>
    {includeblock head.latte}
    <body>
    </body>
</html>

// head.latte
<head>
	....
</head>

tak pouzitie capture nie je mozne:

<head>
{capture $html}
</head>
<body>
    {control myControl}
    ...
</body>
{/capture}
{control header}
{!$html}

toto tiez nie, lebo include sa zavola skor ako sa vsetko vygeneruje do header


<head>
    {include #header}
</head>
<body>
    {control myControl}
    ...
    {block #header}
        {control myControl:header}
    {/block}
</body>

Editoval duskohu (26. 5. 2013 20:56)