Po odeslání formuláře v modal okně se nezavolá metoda na zpracování formuláře

papirek
Člen | 7
+
0
-

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);
            }
        }
    });

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">&times;</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

dakur
Člen | 351
+
0
-

Jak tam iteruješ nad controls a vypisuješ hidden fields – není tam pak dvakrát ten nettí interní _do hidden field? Zkusil bych ten foreach dočasně nahradit jen za {input user_id} (stejně tam víc těch skrytých inputů nemáš) a kouknout, co to dělá.

papirek
Člen | 7
+
0
-

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 ten foreach 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..