Jak upravit obsah latte šablony při ajax požadavku?
- forkman
- Člen | 72
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?
- Pepino
- Člen | 256
@forkman už se řešilo na fóru mockrát např:
https://forum.nette.org/…im-okne-ajax
https://forum.nette.org/…ani-promenne
https://forum.nette.org/…te-form-naja
- Pepino
- Člen | 256
@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 | 2659
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
@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 | 82
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 | 2659
@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)