Zpracování formuláře – formData

jokas
Člen | 14
+
0
-

Ahojte,

při zpracovávání formuláře používám již namísto $form->getValues() formData (TestFormData) entitu. Při události na onSuccess vše funguje bez problému, ale v případě změny události na onSubmit dotávám error:

Too few arguments to function Module\Web\WebPresenter::formTestSucceeded(), 1 passed in C:\xampp\htdocs\portal\vendor\nette\utils\src\Utils\SmartObject.php on line 35 and exactly 2 expected

public function formTestSucceeded(Form $form, TestFormData $testFormData): void
358: {
359: Debugger::barDump($form->values);
360: Debugger::barDump($testFormData);
361: try {…

Je možné, že entita sa nemůže používat s události onSubmit?

Děkuji

David Grudl
Nette Core | 8136
+
0
-

Je to tak, pokud formulář není validní, nevytváří se entita.

jokas
Člen | 14
+
0
-

Ďekuji Davide.

jokas
Člen | 14
+
0
-

Ahojte,

ještě rozšířím dotaz ohledně zpracovávání formuláře pomocí formData. Při využívaní formData(entita) s události onSuccess, vytvářím i kontejnery. Problém nastává u použití snippetů v kombinací s kontajnerama.

Dostávám chybu po překleslení v handle:
Component with name ‚city‘ does not exist. – jedná se o city kontejner.
$this->global->formsStack[] = $formContainer = $_form = end($this->global->formsStack)[„city“];

Tuhle chybu odstráním, když obalím celej form do snippetu a v handle překreslím jak celej form, tak daný kontejner.
Problém je v tom, že při překreslení celého formuláře přicházím o již vyplněné hodnoty.

Kód:

public function renderCarrier()
    {
        $this->template->getLatte()->addProvider('formsStack', [$this['carrierForm']]);
        $this->template->getLatte()->addProvider('formsStack', [$this['carrierForm-state']]);
        $this->template->getLatte()->addProvider('formsStack', [$this['carrierForm-city']]);
        $this->template->getLatte()->addProvider('formsStack', [$this['carrierForm-user']]);
    }
$state = $form->addContainer('state');
        $state->addSelect('id_state', 'Štát:', $stateItems)
            ->setRequired();

        $city = $form->addContainer('city');
        $city->addSelect(CityFormData::ID_CITY, 'Město:', ['' => ''] + $this->selectCities())
            ->setRequired();

        $form->addText(CarrierFormData::FOREIGN_CITY, 'Zahraničí')
            ->addRule($form::MAX_LENGTH, null, CarrierFormData::FOREIGN_CITY_LENGTH);
public function handleChangeState($id_state): void
    {
        $form = $this['carrierForm'];
        $city = $form['city'];

        $city['id_city']->setItems(['' => ''] + $this->selectCities());
        if ($id_state == 1) {
            $form['foreign_city']->setDisabled(true);
            $city['id_city']->setDisabled(false);
        } else {
            $form['foreign_city']->setDisabled(false);
            $form['foreign_city']->setRequired(true);
            $city['id_city']->setDisabled(true);
        }
        if ($this->isAjax()) {
            $this->redrawControl('s_city');
            $this->redrawControl('s_foreignCity');
        }
    }
<div class="form-row" n:snippet="s_city">
                                    {formContainer city}
                                        <div class="form-group col-md-12">
                                            <label n:name="id_city">Město</label>
                                            <select n:name="id_city" class="form-control form-control-sm"></select>
                                        </div>
                                    {/formContainer}
                                </div>

Pointa je, že pro města ČR používám select2 a pro zahraniční města textové pole. Na základě státu (selectBox) skrývám a odkrývam div a zárověň nastavuji povinnost polí.

Při použití události onSubmit funguje zpracování, ale vypadne mi formData.
Nějaký nápad v čem dělám chybu, že kontejner city po překreslení nezná?

Děkuji