Jak upravit obsah latte šablony při ajax požadavku?

forkman
Člen | 72
+
0
-

Mám latte šablonu, která nemá {block content} a načítám si ji ajaxem do modal okna, potíž je v tom, že když je ten request „neajaxový“, tak trochu tam chybí layout :-) Zkoušel jsem do šablony dávat podmínku, že když je to ten neajaxový request, dám tam {block content}, ale očividně to tak udělat nejde. Je na to nějaká finta?

forkman
Člen | 72
+
0
-

@Pepino Omlouvám se za svoji natvrdlost, ale jak mi ty odkazy vyřeší můj problém? Možná to dělám úplně špatně, ale řešení jsem tam nenašel.

Pepino
Člen | 245
+
0
-

@forkman Jde o to, že tu stránku uděláš normálně s layoutem a obsah, který chceš mít v modalu obalíš blockem.

Např:

{block content}
	{block modal}
	obsah do modalu
	{/block}
{/block}

Kód modalu dáš do snippetu:

{snippet modal}
	{if $presenter->isAjax()}
		{ifset modal}
			<div class="modal fade modal-ajax">
				{include modal}
			</div>
		{/ifset}
	{/if}
{/snippet}

V akci té stránky kterou chceš otevří do modalu dáš:

if ($this->isAjax()) {
	$this->payload->isModal = TRUE;
	$this->redrawControl('modal');
}

Plus musíš mít javascript pro obsluhu.. Na těch odkazech co jsem poslal jsou hotové řešení.

Editoval Pepino (19. 5. 2022 14:12)

Šaman
Člen | 2632
+
+1
-

Koukám, že přesně to už jsem jednou řešil. Stránka detail, která může být vykreslená bez layoutu do modalu, nebo jako samostatná stránka:

public function renderDetail(int $id, $layout = true)
{
	$this->setLayout($layout);
	$this->template->layout = $layout;
	// 	…
}
{block content}

	<a n:href="executeDownload!, $id"
		n:if="!$layout"
		id="downloadButton">
		Uložit jako PDF
	</a>

Takže {block content} tam měj. Proměnnou máš v šabloně vlastní a nastaví ji presenter. U mě se defaultně vykresli celá stránka s layoutem a pokud chci modal, mám to takhle:

data-remote="{plink FooPresenter:detail, $id, false}"
data-toggle="modal"

Dokonce mám dojem, že bych mohl i nastavit jiný layout, když ho použiju jako parametr, ale to teď nemám čas zkoušet.

Editoval Šaman (19. 5. 2022 14:23)

forkman
Člen | 72
+
0
-

@Pepino Já právě tu celou stránku potřebuju jako modal, nebo jako obyčejnou stránku, podle typu requestu.

@Šaman mi na to odpověděl, nenapadlo mě to řešit v presenteru. Nakonec jsem to udělal takto a funguje to přesně jak potřebuju. Díky!

	public function renderKontakt()
	{
	    if($this->isAjax())
	    {
			$this->setLayout(false);
	    }
	}

A metodou setLayout se opravdu dá nastavit jiný layout :-)

emololftw
Člen | 79
+
0
-

Já na dynamický obsah modal okna používám snippety. V *.latte šabloně mám něco ve stylu:

{block content}

	{snippet modal}
		{if $presenter->isAjax()}
			{control form}
		{/}
	{/}

A libovolně na stránce mám link na signál (Add, Edit, Delete), který volá $this->redrawControl('modal') a je tam js trigger na otevření modalu/inicializace spinneru. Tím pádem neřeším vůbec layout apod.

Vlastně téměř totožně jak psal @Pepino nahoře

Editoval emololftw (20. 5. 2022 14:53)

Šaman
Člen | 2632
+
0
-

@forkman: Jj, metodou setLayout() se dá nastavit jiný layout, myslel jsem tím že si v tom mém řešení mohu nastavit layout v odkazu na tu stránku.

Moje řešení funguje i pro generování pdf, kde potřebuji jiný layout, než standardní. Takže jedna stránka (render metoda + latte) může být vykreslena:

  • bez layoutu do modalu (volání s parametrem false)
  • s defaultním layoutem jako běžná stránka (volání bez parametru, případně true)
  • jako html zdroj pro pdf s čistým layoutem bez menu apod. (se jménem layoutu jako parametrem)