Továrna na formulář a AJAX

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

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

Klasicky problem dependent select boxu. Nette totiz vyzaduje, aby odeslana hodnota byla v seznamu „items“ selectboxu. Je nekolik zpusobu, jak to vyresit:

(asi doporucuju to na zeminem.cz)

Bendergast
Člen | 8
+
0
-

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;