Stránka s formulářem a gridem ve snippetech překreslení
- svobodai
- Člen | 136
V prezenteru mám definovaný formulář a grid, v šabloně je oboje
v samostatné snippetu.
Ve formuláři mám závislé selecty. Prvotní vykreslení je v pořádku.
Problém nastane, pokud vyberu novou hodnotu v nadřazeném selecty tak při
zpracování handlu dojde k tomu, že se mi překreslí zk¨pátky defaultní
informace ve formuláři.
použitý kód
protected function createComponentFilterForm() {
$form = new Form;
$this->getUser()->getStorage()->setNamespace('front');
if ($this->getUser()->isLoggedIn()) {
$guid = $this->getUser()->storage->getIdentity()->getId();
$userSelect = $this->getUserSelect($guid);
$users = $userSelect->fetchPairs('UID', 'FullName')
$userSelectKod = array_keys($users);
$form->addSelect('userinterpret', 'Jméno uživatele', $users);
$interpretSelect = $this->getInterpretSelect($userSelectKod[0]);
$form->addSelect('interpret', 'Umělec/soubor', $interpretSelect->fetchPairs('Id', 'Name'));
$form->addSubmit('filter', 'Filtrovat')
->setAttribute("class", "btn btn-sm btn-primary");
$form->addSubmit('reset', 'Vymazat filtr')
->setAttribute("class", "btn btn-sm btn-danger");
}
return $form;
}
public function handleUserChange($userinterpret) {
if ($userinterpret) {
$interpretSelect = $this->getInterpretSelect($userinterpret);
$this['filterForm']['interpret']
->setItems( $interpretSelect->fetchPairs('Id', 'Name')));
$this['filterForm']['years']->setValue($years);
$this['filterForm']['userinterpret']->setValue($userinterpret);
} else {
$this['filterForm']['interpret']->setPrompt('Vyberte nejdříve umělce')
->setItems(array());
}
$this['grid']['filter']->redrawControl();
}
Když si v tom handleru vypíšu ty hodnoty, které chci změnit tak je mám
správně vyplněné
Když se podívám na JSON tak je tam správné jméno snippetu, ale je v něm
defaultně vyplněný formulář.
Divné na tom je, že minulý týden mi to fungovalo.
verze PHP 5.5.15, nette 2.2.0
- Ot@s
- Backer | 476
Chybí tu ukázka kódu, kde navazuješ událost UserChange
(ve
formuláři). Podle všeho spustíš signál UserChange
s hodnotou
prvního selektu. To je ale GET request, který ignoruje zbylý obsah
formuláře. Řešením je při změně prvního selektu postovat celý
formulář. Detekovat to a generovat podle toho obsah druhého selektu. Bonusem
automaticky zachováš celý obsah formuláře.
- svobodai
- Člen | 136
Aha na to jsem zapomněl
ve formuláři je tento javacript
<script type = "text/javascript" >
$('#frm-filterForm-userinterpret').on('change', function (event) {
$.ajax({
type: 'GET',
url: '/?do=userChange',
data: {
'userinterpret': $('#frm-filterForm-userinterpret').val(),
'interpret': $('#frm-filterForm-interpret').val(),
}
});
});
</script>
v Konzoli firefoxu vidím, že se ty hodnoty správně předají.
Editoval svobodai (12. 11. 2014 9:28)
- Ryky
- Člen | 14
smaž ten javascript a použíj toto
$form->addSelect('userinterpret', 'Jméno uživatele', $users)
->setAttribute('class', 'ajax')
->getControlPrototype()
->onClick('$(this).closest("form").submit()');
$form->addSelect('interpret', 'Umělec/soubor', $interpretSelect->fetchPairs('Id', 'Name'))
->setAttribute('class', 'ajax')
->getControlPrototype()
->onClick('$(this).closest("form").submit()');
$form->onSuccess[] = callback($this, 'UserChangeFormSubmitted');
a v metodě si pak předáš vlastně celý formulář a můžeš zjístit jak interpret tak userinterpret pak překreslíš :)
- Ryky
- Člen | 14
ummm tak na to ti poradím jednu věc použíj kdyby/replicator
https://componette.org/search/?…
suprová věcička a tohle se na to bude hodit když máš ve formuláři
víc submit tlačítek :)
udělej hlavní formulář(replicator)
a do něj přidej dynamické containery a rozděl si to každej container
s formulářem a jedno tlačítko :)
- Ryky
- Člen | 14
svobodai napsal(a):
To je zajímavé řešení, ale na tom formuláři mám ještě dvě tlačítka a není mi jasné jak by to pracovalo.
Ještě se ten formulář má rozšířit o další položky a vyvstane nutnost volat i jiné funkce, nebo alespoň nějakým parametrem určit co se bude dělat.
btw jedním formulářem tohle neuděláš … :D
- svobodai
- Člen | 136
Ryky napsal(a):
svobodai napsal(a):
To je zajímavé řešení, ale na tom formuláři mám ještě dvě tlačítka a není mi jasné jak by to pracovalo.
Ještě se ten formulář má rozšířit o další položky a vyvstane nutnost volat i jiné funkce, nebo alespoň nějakým parametrem určit co se bude dělat.btw jedním formulářem tohle neuděláš … :D
No když tam jsou další závislé selecty tak to udělám.