Zakázání validace při addSelect onChange
- Bohosu
- Člen | 24
PHP 5.2
Nette 2.0 stable
Ahoj, rád bych Vás poprosil o pomoc s následujícím problémem, na který jsem tady zatím nikde neobjevil řešení.
Mám formulář kde chci, aby se mi při změně vybrané položky u Selectu
vykreslil adekvátně zbytek formuláře. Ten zbytek formuláře tvoří různý
počet Selectů s různými nabízenými parametry. Kolik, jakých a s jakými
parametry – to mám pomocí databáze, v tom není problém.
Řeším to ale tak, že u Selectu mám
->onChange(submit());
Ve formuláři mám validační pravidlo u jednoho text inputu, ale rád bych, aby se tato validace kontrolovala pouze při odesílání tlačítkem a ne při změně toho Selectu. Přikládám následující kód:
public function createComponentFormular() {
$form = new NAppForm();
$form->addText('nazev','Název:')->addRule(NForm::FILLED, 'Není vyplněn název!');
$form->addSelect('kategorie','Kategorie:', array(...kategorie načtené z DB...)->getControlPrototype()->OnChange('submit()');
// nyní podle Session Kategorie vykreslím zbytek formuláře
$session = $this->getSection('formular');
if ($session->kategorie == 1) {
// zde není ted podstatné co se má navíc vykreslit...
$form->addSelect(.......
} else {
// zde také není teď podstatné co by se vykreslilo nyní...
$form->addText(.....
}
unset($session->kategorie);
$form->addSubmit('uloz','Uložit!');
$form->onSuccess[] = callback($this, 'handleOdeslanyFormular');
return $form;
}
public function handleOdeslanyFormular(NAppForm $form) {
// Jestli tuto funkci spustil Select, tedy ji NEspustil Button "uloz"
if ( ! $form['uloz']->isSubmittedBy() ) {
// tak přesměruj sám na sebe (refresh)
$session = $this->getSection('formular');
$session->kategorie = 1;
$this->redirect('Homepage:formular');
} else {
// Pokud to bylo odesláno tlačítkem, tak to ulož do databáze
...
}
}
Otázka zní: Jak a kde vypnout validaci při změně Selectu?
setValidationScope(false);
Nelze volat u ničeho jiného než u SubmitButtonu :-(
Díky moc předem za jakýkoliv nápad.
P.S. Preferoval bych nejraději řešení bez JS :-)
- David Matějka
- Moderator | 6445
ja to resim tak, ze pridat button, napr confirmCategory, kterej ma validationScope = false. v sablone potom button skryju a pri onChange to odeslu pres nej. ta uprava formulare je potom vazana na ->onClick u toho buttonu
- xxxmisko
- Člen | 140
aha.
No to by takisto šlo. Prosím, ako vieš select onChange odkázať na button?
$form->addSelect('id_sablona', 'Použitá šablóna', $sablona)
->setPrompt($prompt)
->getControlPrototype()->OnChange('submit()');
toto spustí nejaký submit, ale neviem, aký. Keď som tam dal niečo iné,
vypísalo mi to error :(
som z nette zatiaľ magor, tak prepáč za sprostú otázku
- akadlec
- Člen | 1326
Co takhle to udělat jak píše @matej21 pomocí toho buttonu tak, že jej normálně přidáš do šablony a když budeš mít aktivní JS tak tento button skryješ a na ten select navěsíš akci on change co udělá submit toho buttonu? takže né klasikcý ochange=„this.submit()“ ale submitnout přímo ten button. A bude ti to fungovat i bez js
- tmysik
- Člen | 16
Díky za radu, dávám sem pro případné další tápající:
use \Nette\Forms\Controls\SelectBox;
use \Nette\Utils\Html;
use \Nette\Utils\Strings;
/**
* SelectBox which submits on change.
*/
class SubmitSelectBox extends SelectBox {
public function getControl() {
// submit button
$submit = $this->getForm()
->addSubmit($this->getName() . '_confirm_' . Strings::random(3), 'Confirm')
->setValidationScope(false)
->getControl();
// select box
$selectBox = parent::getControl()
->submitonchange($submit->id);
// control itself
$control = Html::el('span')
->id($selectBox->id . '-container')
->addClass('.submitselect')
->add($selectBox)
->add($submit);
return $control;
}
}
A příslušný JavaScript (nutno upravit, samozřejmě):
<script type="text/javascript">
$(document).ready(function() {
$('form select[submitonchange]').next().hide();
});
$(document)
.off('change', 'form select[submitonchange]')
.on('change', 'form select[submitonchange]', function(event) {
event.preventDefault();
var form = $(this.form);
var submit = $('#' + $(this).attr('submitonchange'));
if (!submit) {
return;
}
if (form.hasClass('ajax')) {
submit.ajaxSubmit();
} else {
submit.click();
}
});
</script>
Díky!