Vyplnění fomuláře s dependecy-selectboxem

adam_frajer
Člen | 14
+
0
-

Ahoj,
nedávno jsem narazil na problém ohledně dosazení hodnot formuláře s dependency-selectboxy.
Můj formulář vypadá takto:

class WorldForm extends Control{

    /** @persistent */
    public $country = NULL;

    /** @persistent */
    public $city = NULL;

    public function render(){
        if($this->country !== null && $this->city !== null){
            $this->template->country = $this->country;
            $this->template->city = $this->city;
        }
        else{
            $this->template->country = null;
            $this->template->city = null;
        }
        $this->template->setFile(dirname(__FILE__) . '/template.latte');
		$this->template->render();
    }

    protected function createComponentForm()
	{
		// data pro countries
        $countriesArr = [
            1 => 'Česká republika',
            2 => 'Slovensko',
            3 => 'Německo'
        ];
		// data pro cities
        $citiesArr = [
            1 => [
                'Praha',
                'Brno',
                'Ostrava'
            ],
            2 => [
                'Bratislava',
                'Košice',
                'třetí město'
            ],
            3 => [
                'Berlín',
                'Mnichov',
                'Hamburk'
            ]

        ];
		$form = new Form();
		$country = $form->addSelect('country', 'Stát:', $countriesArr)
			->setPrompt('----');

        $items = [];
        foreach ($countriesArr as $id => $name) {
            $items[$id] = $citiesArr[$id];
        }

		$city = $form->addSelect('city', 'Město:')
            ->setHtmlAttribute('data-depends', $country->getHtmlName())
            ->setHtmlAttribute('data-items', $items);

		$form->onAnchor[] = function() use($country, $city, $citiesArr) {
			$city->setItems($country->getValue()
				? $citiesArr[$country->getValue()]
				: []);
        };
        $form->addSubmit('send', 'Hledat');

        $form->onSuccess[] = [$this, 'formSucceeded'];

		return $form;
	}
    public function formSucceeded($form, $values)
    {
        $this->template->values = $values;
        $this->city = $values->city;
        $this->country = $values->country;
        $data = array(
            'country' => $values->country,
            'city' => $values->city
        );
        $this->presenter->redirect("this", $data);
    }

    public function fillData($data){
        $this['form']->setDefaults($data);
    }

}

Presenter takto:

    protected function createComponentForm(){
		return $this->wordForm;
	}

    public function renderDefault($country = null, $city = null){
        if (!is_null($country) && !is_null($city)){
            $this->wordForm->fillData(['country' => $country, 'city' => $city]);
        }
    }

Script jsem použil stejný, jako je na nette-foru

Problém je, že když se pokusím formulář znovu načíst a vyplnit data, data se do city nedoplní, protože toto pole je onAnchor[].
Chybu mi to hází tuto:

Nette\InvalidArgumentException
Value ‚2‘ is out of allowed set [] in field ‚city‘.

Poradíte prosím jak do pole dosadit defaultní hodnoty?

Editoval adam_frajer (30. 8. 2022 12:04)

kajinek32
Člen | 31
+
0
-

Jediný, co mě napadá, je nastavovat defaultní hodnoty javascriptem až po načtení, ale určitě existuje lepší řešení…