Blok z šablony do layoutu

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

Je nějaká možnost že z komponenty dostanu nahoru do layoutu definovaný blok?

Mám @layout.latte ve kterém mám definován kontejner pro modální okna:

<!--  PopUp windows -->
<div n:snippet="modalWindowBlock">{block #modalWindow}{/block}</div>
<!--  End PopUp windows -->
<div id="fb-root"></div>

A pak v jedné akci udělám vykreslení formuláře ve view akce:

{layout '../../@layout.latte'}

{control editContributorForm}

Jenže to jak bude vypada form se určí v oné komponentě a form má dvě podoby, klasickou a modální. Takže komponenta rozhodne že chce modální okno a pošle šablonu komponenty v podobě:

{define #modalWindow}
	{include #parent}
	<div n:snippet="formArea" class="modal fade display" data-width="545" data-manager="#snippet--modalWindowBlock">
	//....
	</div>
{/define}

Problém je ale ten že se ten blok nedostane ven z komponenty a tudíž není v šabloně layoutu. Je nějaký způsob jak to probublat z komponenty až do layoutu?

sKopheK
Člen | 207
+
0
-

Odpověď na takhle položenou otázku ti neposkytnu, ale budu kontrovat otázko, zda je nějaký důvod, proč potřebuješ modální okno v té které části HTML a nestačí ti jej pomocí CSS a JS nastylovat a umístit tam, kam potřebuješ, když je jasně identifikovatelné např. přes ID.

akadlec
Člen | 1326
+
0
-

Mno takhle, mám v layoutu prostě pozici určenou pro modály na kterou jsou navěšeny akce, tudíž když se tam něco objeví je patřičně zpracováno atd.

llook
Člen | 407
+
+1
-

Nevidím důvod, proč by to javascript nemohl úplně stejně patřičně zpracovat kdekoli jinde v DOMu. Může to i vzít a přemístit, pokud třeba CSS nebo nějaké live eventy počítají s tím, že to ve stromu bude na určitém místě. Pokud používáš nette.ajax.js, tak to bude cca takto:

$.nette.ext('nevim', {
	'success': function () {
		var $target = $('#modalArea');
		$target.empty();
		$('.modal').each(function () {
			var $content = $(this);
			$target.append($content.html());
			$content.remove();
		});
	}
});
akadlec
Člen | 1326
+
0
-

uf, jasně jde to X způsoby. ale co když to musíš udělat bez js? to pak těžko budeš hýbat DOMem. Ale to byla jen ukázka kde jsem to aktuálně potřeboval vyřešit. Případů může být více, třeba inline JS který se vygeneruje v komponentě na základě nějakých parametrů a bude potřeba jej dostat do hlavního layoutu aby byl tam kde má a né uprostřed stránky.

Editoval akadlec (30. 4. 2014 7:50)

Oli
Člen | 1215
+
0
-

Tohle téma už se tady resilo a jestli mě něco neuniklo, tak jedine jak to jde nasimulovat je udělat si render() renderJs() renderModal()… Kazdou tu šablonu si pak můžeš hodit kam potrebujes. Jine řešení pokud vím není.

akadlec
Člen | 1326
+
0
-

@Oli: No zatím to tak řeším, ale to škoda že to nejde dostat přímo v komponentě nahoru.

Oli
Člen | 1215
+
0
-

No, taky jsem to resil a taky by se me to dost hodilo.