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