Po odeslání formuláře v modal okně se nezavolá metoda na zpracování formuláře
- papirek
- Člen | 8
Zdravím všechny,
použil jsem do projektu tento návod https://forum.nette.org/…ani-promenne a pridal si univerzalni reseni pro modal do ktereho includuji potrebnou sablonu…
modal se zobrazuje, formular se vykresli, vse se chova spravne, az na to, kdyz chci formular odeslat, jakoby vubec nevolal tu metodu z presenteru na zpracovani… pridavam svuj kod a děkuji za pripradne rady…
v @layout.latte mam toto na konci
{snippet modal}
{if $presenter->isAjax()}
{ifset #modal}
<div class="modal modal-ajax" tabindex="-1">
{include #modal}
</div>
{/ifset}
{/if}
{/snippet}
do nette.ajax.js sem podle navodu pridal toto
$.nette.ext("modals", {
success: function(payload) {
if (payload.redirect) {
$(".modal-ajax").modal("hide");
} else if(payload.isModal) {
$('.modal-ajax').modal('show');
}
}
});
$.nette.ext("ajaxRedirect", {
success: function (payload) {
if (payload.redirect) {
$.nette.ajax(payload.redirect);
}
}
});
v presenteru mam toto, vytvoreni componenty a metodu pro jeji zpracovani
<?php
public function createComponentChangePositionForm(): Form
{
$positions = $this->users->getAllPositions()->fetchPairs('id', 'nazev');
$user_id = (int) $this->getParameter('params')['user_id'];
$id_pozice = $this->users->getUserInfo($user_id)->id_pozice;
$form = $this->createForm();
$form->addSelect('position', 'Pozice', $positions)
->setDefaultValue($id_pozice);
$form->addHidden('user_id', $user_id);
$form->addSubmit('send', 'Uložit');
$form->onSuccess[] = [$this, 'ChangePositionFormSucceeded'];
return $form;
}
public function ChangePositionFormSucceeded(Form $form, \stdClass $values): void
{
if ($this->getUser()->isInRole('superadmin') || $this->getUser()->isInRole('admin')) {
$this->users->updatePositionByUser($values->user_id, $values->position);
$this->flashMessage('Pozice změněna');
}
}
?>
a nakonec sablona pro samotny modal @changePosition.latte obsahuje toto
{define modalTitle}Změna pozice{/define}
<div class="modal-dialog modal-dialog-centered modal-lg">
<div class="modal-content">
<div class="modal-header">
{block modalHeader}
<h5 class="modal-title">
{include #modalTitle}
</h5>
{/block}
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">×</span>
</button>
</div>
{form changePositionForm}
<div class="modal-body">
<div class="form-group row">
{label position class => 'col-sm-2 col-form-label' /}
<div class="col-sm-10">
{input position class => 'form-control'}
</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-dismiss="modal">Zavřít</button>
{foreach $form->controls as $name => $field}
{if $field->options['type'] == 'hidden'}
{input $name}
{/if}
{/foreach}
{input send class => 'btn btn-primary'}
</div>
{/form}
</div>
</div>
podle Tracy se po kliknutí na uložit v modalu vůbec nezavolá metoda ChangePositionFormSucceeded
Děkuji za každou radu
- papirek
- Člen | 8
dakur napsal(a):
Jak tam iteruješ nad controls a vypisuješ
hidden
fields – není tam pak dvakrát ten nettí interní_do
hidden field? Zkusil bych tenforeach
dočasně nahradit jen za{input user_id}
(stejně tam víc těch skrytých inputů nemáš) a kouknout, co to dělá.
v tom to asi nebude, kdyz necham formular vypsat pres control
{control ChangePositionForm}
primo latte, tak to taky nejde… mam podezreni na neco v tom nette.ajax.js – protoze se mi zda ze ten klasicky submit neprobehne, ale snazi se to asi delat jen handle..