Továrna na formulář a AJAX
- Bendergast
- Člen | 8
Zdravím všehny.
Mám takový problém: Vytvořím si formulář pomocí továrny (vlastní
šablona atd.). Potom pomocí Ajaxu v presenteru naplním selectboxy, vše OK.
Jakmile dám formulář odeslat, neprojde onSuccess, formulář bere selectboxy
jako prázdné, chyba se objeví až pod vypsání getErrors(), po Ajaxu funguje
validace všechno v pořádku. V šabloně mám uvnitř formuláře dva
snippety, pro každý select jeden
Prošel jsem spoustu rad na fóru, zkoušel různě přepisovat továrnu a nic nezabralo.
Továrna formuláře
class VehicleFormFactory extends UI\Control {
public function createComponentForm() {
$form = new UI\Form;
$form->addSelect('id_car_producer', $this->translator->translate('car_producer'))
->setPrompt($this->translator->translate('select_type'))
->setRequired('car_producer_req')
->setAttribute('data-select-handler', '1')
->setTranslator(null);
$form->addSelect('id_car_model', $this->translator->translate('car_model'))
->setPrompt($this->translator->translate('select_producer'))
->setRequired('car_model_req')
->setTranslator(null);
return $form;
}
public function render() {
$path = dirname(__FILE__) . '/template.latte';
if (file_exists($path)) {
$this->template->setFile($path);
$this->template->setTranslator($this->translator);
$this->template->_form = $this->template->form = $this['form'];
$this->template->render();
} else {
throw new \Nette\UnexpectedValueException('Form template not found!');
}
}
}
V presenteru
/** @var VehicleModel @inject */
public $VehicleModel;
public function createComponentVehicleForm() {
$form = $this->VehicleForm;
return $form;
}
Jeden z handleru
public function handleSetCarProducer() {
if (!$this->isAjax()) {
$this->redirect('this');
}
$request = $this->getHttpRequest();
if (!$request->getPost('car_type')) {
$this->terminate();
}
$items = $this->VehicleModel->GetProducers($request->getPost('car_type'));
$component = $this['vehicleForm']['form']['id_car_producer']
->setAttribute('data-handler', $this->link('setCarModel!'))
->setItems($items);
if ($items) {
$component->setPrompt('---');
}
$this->redrawControl('snippetWrapper');
$this['vehicleForm']->redrawControl('car_producer');
$this['vehicleForm']->redrawControl('car_model');
}
Za každé nakopnutí budu vděčný, bez tak jde o nějakou kravinu.
- David Matějka
- Moderator | 6445
Klasicky problem dependent select boxu. Nette totiz vyzaduje, aby odeslana hodnota byla v seznamu „items“ selectboxu. Je nekolik zpusobu, jak to vyresit:
- http://www.zeminem.cz/…t-select-box
- https://forum.nette.org/…-setrequired#…
- https://blog.nette.org/…-and-pure-js
(asi doporucuju to na zeminem.cz)
- Bendergast
- Člen | 8
Zkoušel jsem použít zeminem.cz a nedaří se to rozchodit, továrnu injektuju a vytvářím pomocí DI. Nevím jestli v tom nemůže být zádrhel. Jediný rozdíl mezi ukázkou na zeminem je to že používám DI a chybělo mi tam:
$this[$name] = $form;