Zakázání validace při addSelect onChange

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

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

tmysik
Člen | 16
+
0
-

Mám stejný problém; navíc nevím jak po odeslání tím selectem zjistit jeho hodnotu abych mohl (dle DB) do formu přidat dašlí políčka ($form->getValues() je prázdný, sahám přímo do $_POST).

Díky za jakýkoliv nápad.

xxxmisko
Člen | 140
+
0
-

ahojte chlapi!

Riešim niečo podobné, ako Bohosu, prosím vedeli by ste ma nakopnúť?
Zatiaľ nemám nič, čerpám odtiaľto z fóra, ale bude potrebovať podobnú funkcionalitu. Nechcem to riešiť cez toggle, lebo v selectoch budem mať možno veľmi veľa položiek.

Ďakujem za nákop.

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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!