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)