Formulář musí být 2× potvrzen

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

Zdravím, postupoval jsem podle návodu od Tomáše Votruby pro vytvoření naplnění selectu při změně selectu jiného (https://blog.nette.org/…-and-pure-js).

Hodnota druhého selectu se mění v pohodě. Problém je při odeslání formuláře. Čekal bych, že po kliknutí na submit se dumpnout hodnoty. To se nestane při první kliknutí. Formulář je potřeba potvrdit podruhé a potom se vyplněné hodnoty vypíší v dumpu (nekdy ani to ne – proste se nevypisi).

Nevíte někdo, proč se to vypisu až po druhém kliknutí na submit místo hned prvního?

Můj kód vypadá následovně

Form factory

public function createNewTerminal( callable $onSuccess ){
        $form = $this->factory->create();

        $merchants = $this->internalRepository->getAllMerchants()->fetchPairs( 'id', 'name' );

        //uid
        $form->addText( 'uid', 'UID' )
            ->setRequired('insert UID')
            ->addRule( Form::INTEGER, 'uid has to be INT ');


        //merchant id
        $form->addSelect( 'merchant_id', 'Merchant', $merchants)
            ->setPrompt( 'select merchant' )
            ->setRequired( 'select merchant' );


        //branch id
        $form->addSelect('branch_id', 'Branch')
            ->setRequired( 'Select branch' )
            ->setPrompt( 'Select merchant first' );

        $form->addSubmit('send', 'Submit');


        $form->onSuccess[] = function (Form $form, $values) use ($onSuccess) {


            dump( $form->getHttpData() );

            $onSuccess(  );

        };

        return $form;
    }

Presenter

 /**
     * form for new terminal
     * @return Nette\Application\UI\Form
     */
    protected function createComponentTerminalForm(){
        return $this->factory->createNewTerminal( function(){

        });
    }

/**
     * filling branch select when merchant select is changed
     * @param $value int
     */
    public function handleMerchantChange( $value ){

        if( $value ){

            $branches = $this->repository->getAllBranches( $value )
                ->fetchPairs( 'id', 'name' );

            $this['terminalForm']['branch_id']
                ->setPrompt( 'Select' )
                ->setItems( $branches );

        } else {
            $this['terminalForm']['branch_id']
                ->setPrompt( 'Select merchant first' )
                ->setItems( [] );
        }

        $this->redrawControl( 'wrapper' );
        $this->redrawControl( 'branchesSnippet' );

    }

LATTE

{* MANULLY RENDERED BECAUSE OF SNIPPET AREAS *}
            {snippetArea wrapper}
                {form terminalForm, class=>'form-horizontal'}

                    <ul class=error n:if="$form->ownErrors">
                        <li n:foreach="$form->ownErrors as $error">{$error}</li>
                    </ul>

                    <div class="form-group">
                        <div class="col-sm-2 control-label">
                            {label uid /}
                        </div>

                        <div class="col-sm-10">
                            {input uid, class=>'form-control'}
                        </div>
                    </div>



                    <div class="form-group">
                        <div class="col-sm-2 control-label">
                            {label merchant_id /}
                        </div>

                        <div class="col-sm-10">
                            {input merchant_id, class=>'form-control'}
                        </div>
                    </div>


                    {snippet branchesSnippet}
                        <div class="form-group">
                            <div class="col-sm-2 control-label">
                                {label branch_id /}
                            </div>
                            <div class="col-sm-10">
                                {input branch_id, class=>'form-control'}
                            </div>
                        </div>
                    {/snippet}


                    {input send, class=>'btn btn-default'}


                {/form}
            {/snippetArea}

            {include jsCallback, input => merchant_id, link => merchantChange}


            {define jsCallback}
                <script>

                    $('#' + {$control["terminalForm"][$input]->htmlId}).off('change').on('change', function () {
                        $.nette.ajax({
                            type: 'GET',
                            url: {link {$link}!},
                            data: {
                                'value': $(this).val(),
                            }
                        });
                    });

                </script>
            {/define}

EDIT
Když dám $form->onSubmit[] namísto $form->onSuccess[] tak to hodnoty vyhodi, takze by byl problem nekde ve validaci?

Editoval Simtrix (28. 6. 2017 15:40)

ali
Člen | 342
+
0
-

Pokud si dobre vzpominam, tak ten select, ve kterem menis dynamicky itemy, tak u neho nesmis mit nastavene setRequired

Simtrix
Člen | 15
+
0
-

ali napsal(a):

Pokud si dobre vzpominam, tak ten select, ve kterem menis dynamicky itemy, tak u neho nesmis mit nastavene setRequired

Super, diky, už to běží. Toho jsem si vůbec nevšiml. Ošetřím si to jinak v callbacku.

Ještě jednou dík :)