Hodnoty pro Select vložené přes AJAX a jejcih validace

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

Ahoj,

trochu tu válčím s jedním úkolem a potřeboval bych poradit.

Cíl je, aby existoval formulář, do kterého když napíšu formulář číslo dílu, tak si přes AJAX stáhnu všechny data k danému dílu a předvypním Selecty (např. dodavatel, zákazník, …) pouze správnými daty.

V komponentě mám teď pouze toto:
$form->addSelect('customer', 'Zákazník', ['' => 'doplní se automaticky ...']);

Což je v pohodě, když vyplním číslo dílu, AJAXem se mi dotáhnou pouze dodavatelé pro konkrétní díl ale problém nastane při validaci formuláři. Tam mi to skončí na chybě, že tato hodnota není přípustná, protože neexistovala v době vytváření formuláře.

A tady nevím jak postupovat, … napadá mě kacířská myšlenka, že při vytvoření formuláře naplním Select všemi dodavateli (ale je jich kolem 6.000), ty pak v šabloně přes jQuerty smažu. To se mi ale nelíbí, nechce se mi načítat tolik záznamů zbytečně. A to jsou pouze dodavatelé.

Existuje nějaká možnost dodatečného naplnění Selectu při validaci podle hodnoty ve formuláři (resp. si zavolám znovu metodu na získání dat podle čísla dílu)?

Díky moc a klidný víkend :)

 
 
 
Formulář vypadá jednoduše takto:

Jan Tvrdík
Nette guru | 2595
+
0
-

Není jednoduší tu validaci na tom selectu přeskočit s pomocí https://phpfashion.com/…-v-nette-2-1#… nebo https://api.nette.org/…Control.html#… ?

igor.pocta
Člen | 100
+
+1
-

@JanTvrdík,

díky za tip. Nakonec jsem to vyřešil tak, aby mi to i při chybě hodilo zpět vyplněný formulář

Nechám si prázdné Selecty

$form->addText('matnr', 'Číslo materiálu')
           ->setRequired('Zadejte číslo dílu')
           ->setAttribute('class', 'form-control');
       $form->addSelect('teami', 'Tým')
           ->setAttribute('class', 'form-control');
       $form->addSelect('customer', 'Zákazník')
           ->setAttribute('class', 'form-control');
       $form->addSelect('supplier', 'Dodavatel')
           ->setAttribute('class', 'form-control');
       $form->addSelect('workplace', 'Číslo pracoviště')
           ->setAttribute('class', 'form-control');

       $form->onValidate[] = [$this, 'alertFormValidated'];
       $form->onSuccess[] = [$this, 'alertFormSucceeded'];

(AJAXEM naplním, necham uživatele vybrat a odešlu formulář)

Validace formuláře:

public function alertFormValidated(Form $form) {

        /** @var \Nette\Forms\Controls\SelectBox $component */
        foreach ($form->components as $component) {
            if (get_class($component) == 'Nette\Forms\Controls\SelectBox' ) {

                Switch( $component->name ) {
                    Case 'teami';
                        $component->setItems(
							$this->orm->teams->findByMatnr(['matnr' => $form['matnr']->value])->fetchPairs('id', 'title');
						);
                        break;
                    Case 'customer';
                        $component->setItems(
							$this->orm->customers->findByMatnr(['matnr' => $form['matnr']->value])->fetchPairs('id', 'title');
						);
                        break;
                    Case 'supplier';
                        $component->setItems(
							$this->orm->suppliers->findByMatnr(['matnr' => $form['matnr']->value])->fetchPairs('id', 'title');
						);
                        break;
                    Case 'workplace';
                        $component->setItems(
							$this->orm->workplaces->findByMatnr(['matnr' => $form['matnr']->value])->fetchPairs('id', 'title');
						);
                        break;
                }
                $component->getSelectedItem();
            }
        }


        if ($form['matnr']->value == 'test') {
            $form->addError('Test :)');
        }

    }

Nejpodstatnější tady bylo použití $component->getSelectedItem() aby se to dostalo do onSuccess, asi pro reload :) Ale tady by šel zřejmě použít Tvůj tip z API: checkAllowedValues
 
 
A pak už si s hodnotami hraji jako obvykle přes $values->customer :)

Díky moc :))