Dynamický závislý selekt – problém s „SetRequired“
- premek_k
- Člen | 172
Dobrý den, pánové.
Podstatnou část noci jsem se snažil do přihlašovacího formuláře
(naspaného dle kuchařky) implementovat dva závislé selektboxy podle tohoto
návodu: https://blog.nette.org/…-and-pure-js
. Možná mi něco nedochází nebo to po té době už nevidím, ale mám
problém s SetRequired na těch selektboxech. Pokud jsou ty selektboxy
required, odeslání formuláře není validní (neprovede se onSuccess, ale
onError) z toho mi vyplývá, že vybraná hodnota těchto polí není validní
a já nemůžu přijít na to proč a kde se tomu tak děje. Pokud na těch
selektboxech to require vyhodím, onSuccess se sice provede, ale mezi hodnotami
formuláře z nějakého důvodu chybí checkbox remember a metoda spadne na
ifu pro nastaveni expirace. Už nevím, co s tím dál. Poradíte mi
někdo ?
Presenter:
// ------------------------------------------------------------------
/**
* Render formulare
*/
public function renderIn ($id) {
if(!$this->isAjax()){
$form = $this->getComponent("signInForm");
if($id == null) {
$id = 1; //Prvni zaznam
}//end if
$form["Game"]->setItems($this->gamesRepository->getGamesList());
$form["Game"]->setDefaultValue($id);
$form["GameVariant"]->setItems($this->gameVariantsRepository->getGameVariantsList($id ));
}//end if
$this->template->_form = $this['signInForm'];
}// end function
// ------------------------------------------------------------------
/**
* Ajaxove plneni hernich variant
*/
public function handleSelectLoad($gameId)
{
$form = $this->getComponent("signInForm");
$form["GameVariant"]->setItems($this->gameVariantsRepository->getGameVariantsList($gameId));
$this->invalidateControl("form"); // invalidate ajax snippet
}// end function
// ------------------------------------------------------------------
/**
* Sign-in form factory.
* @return Nette\Application\UI\Form
*/
protected function createComponentSignInForm()
{
$form = new UI\Form;
$form->addSelect('Game','Hra:');
->setRequired('Vyber si hru.');
$form->addSelect('GameVariant','Lokalita:')
->setRequired('Vyber si lokalitu.')
->setPrompt("Vyber si lokalitu");
$form->addText('UserName', 'Nick:',25,30)
->setRequired('Vložte herní přezdívku.')
->setAttribute('class','input-block-level')
->setAttribute('placeholder','Nick');
$form->addPassword('UserPassword', 'Heslo:',25,30)
->setRequired('Vložte heslo.')
->setAttribute('class','input-block-level')
->setAttribute('placeholder','Heslo');
$form->addCheckbox('remember', 'Pamatovat přihlášení');
$form->addSubmit('send', 'Přihlásit')
->setAttribute('class','btn btn-large btn-primary');
// call method signInFormSucceeded() on success
$form->onSuccess[] = $this->signInFormSucceeded;
return $form;
}//end function
// ------------------------------------------------------------------
/**
* Uspesne prihlaseni
*/
public function signInFormSucceeded($form)
{
$values = $form->getHttpData();
unset($values["send"]);
if ($values->remember) {
$this->getUser()->setExpiration('+ 14 days', FALSE, TRUE);
} else {
$this->getUser()->setExpiration('+ 20 minutes', TRUE, TRUE);
}
try {
:
:
Šablona:
{block content}
{* generovani prihlasovaciho formulare *}
{form signInForm}
<div class="form-signin">
<h2 class="form-signin-heading">Přihlášení</h2>
{input Game}
{snippet form}
{input GameVariant}
<script type="text/javascript">
$("form").delegate('#'+{$control["signInForm-Game"]->htmlId}, 'change', function() {
$.get("?do=selectLoad", {"gameId": $(this).val()});
});
</script>
{/snippet}
{input UserName}
{input UserPassword}
<label class="checkbox">
{input remember} {label remember /}
</label>
{input send}
</div>
{/form}
{/block}