Problém s nefunkční callbackem
- Jadro007
- Člen | 8
Ahoj,
začínám s Nette a potřeboval bych pomoct.. V presenteru jsem vytvořil
jednoduchý formulář, který pomocí latte vykresluju do šablony – tohle
mi všechno funguje, ale když formulář odešlu, tak se nezavolá callback
funkce.. Zkoušel jsem všechno možný, GET, POST a nic mi z toho
nefungovalo..
/**
* Inventary presenter.
*/
use Nette\Application\UI;
use Nette\Forms\Controls\SubmitButton;
class InventaryPresenter extends BasePresenter
{
protected function createComponentCompanyFilterForm()
{
$form = new UI\Form;
$form->setAction($this->link("Inventary:"));
$form->setMethod('POST');
$form->addSelect("country", '', array(
"CZ",
"SK"
));
$form->addSelect("city", '', array(
"Praha",
"Jihlava"
));
$form->addSelect("service", '', array(
"Webdesign",
"Programming"
));
$form->addSubmit("submit", "Filter");
$form->onSubmit[] = callback($this, 'filterSubmitted');
return $form;
}
public function renderDefault()
{
if($this->presenter->isAjax()) {
$this->invalidateControl("company");
$this->invalidateControl("company_filter");
}
$this->template->formFilterForm = $this->createComponentCompanyFilterForm();
}
public function filterSubmitted(UI\Form $form){
$values = $form->getValues();
var_dump($values);die;
}
}
V šabloně to vykreslím pak takto:
{control $formFilterForm}
Editoval Jadro007 (15. 9. 2012 13:33)
- duke
- Člen | 650
Tento řádek vyhoď:
$this->template->formFilterForm = $this->createComponentCompanyFilterForm();
V šabloně použij:
{control companyFilterForm}
Pokud někde v presenteru potřebuješ objekt této komponenty, obstarej si ho standardním způsobem, tj.:
$form = $this['companyFilterForm'];
V dokumentaci je o tom řeč zde.
A mimochodem, inventář se řekne anglicky „inventory“, nikoli „inventary“.
Editoval duke (15. 9. 2012 14:04)
- duke
- Člen | 650
Jadro007 napsal(a):
duke: přesně tohle už jsem zkoušel, ale Component with name ‚formFilterForm‘ does not exist
Jinak za tu angličtinu díky, jsem se přehlídl :)
Uvedenou chybu ti nemohl vyhodit doporučovaný řádek:
{control companyFilterForm}
…nýbrž řádek:
{control formFilterForm}
- Jadro007
- Člen | 8
Duke, vvoody – super, díky moc, už to funguje.. ještě jsem teda musel přepsat onSubmit na onSuccess ale už to jede :)
duke napsal(a):
Jadro007 napsal(a):
duke: přesně tohle už jsem zkoušel, ale Component with name ‚formFilterForm‘ does not exist
Jinak za tu angličtinu díky, jsem se přehlídl :)Uvedenou chybu ti nemohl vyhodit doporučovaný řádek:
{control companyFilterForm}
…nýbrž řádek:
{control formFilterForm}
- duke
- Člen | 650
Pro úplnost: Makru control lze předat buď název komponenty (pod kterým je vedená v presenteru, tj. pro který existuje továrnička), či přímo objekt komponenty. Když předáváš název, o vytváření se nestaráš (jen poskytneš továrničku). Když předáváš objekt, je potřeba ho vytvářet přes presenter, tj. stylem:
$component = $this['companyFilterForm']; // což je totéž jako: $component = $this->getComponent('companyFilterForm', TRUE);
Pokud ji vytváříš jinak, např. přímým voláním továrničky, tak se ti nezaregistruje v presenteru, což má za následek nefunkčnost signálů. Navíc by se ti takto továrnička mohla volat zbytečně vícekrát.
Čili tvůj původní příklad by šel opravit ještě alternativně takto. Řádek:
$this->template->formFilterForm = $this->createComponentCompanyFilterForm();
…nahradit za:
$this->template->formFilterForm = $this['companyFilterForm'];
Ale doporučuji prvně navrhované řešení.
Editoval duke (19. 9. 2012 6:11)