Úprava validačních pravidel v době renderování

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

Zdravím, a mám dotaz. Pro vkládání a editaci používám jeden formulář – komponentu. Myšlenka je asi takováto:

Komponenta

// ---------------------------------------------------------------------------
protected function createComponentFormCountry() {
  $form = new AppForm;

  $form->addHidden('id_country', 0);

  $form->addText('name', 'Country name:')
       ->addRule(Form::FILLED, 'Please, enter country name');

  $form->addSubmit('submitted', 'Add');
  $form->onSubmit[] = array($this, 'formCountrySubmitted');

  return $form;
}

Obsluha onSubmit

// ---------------------------------------------------------------------------
public function formCountrySubmitted($form) {
  ...
  $formValues = $form->getValues();

  if(!is_numeric($formValues['id_country'])) {
    // Vlozeni
  } else {
    // Editace
  }
  ...
}

Render edit

// ---------------------------------------------------------------------------
public function renderEditCountry($id_country) {
  $this->template->title = Environment::getVariable("title") . "Edit country";

  $this['formCountry']['submitted']->caption = 'Update';

  $country = $this->model->getCountry($id_country);

  $this['formCountry']->setDefaults($country);

}

Tím jsem ukázal myšlenku, jak situaci řeším. Ale, mne zajímá, jestli bych mohl, v renderEdit nějakým způsobem ovlivnit validační pravidla. Dejme tomu, že chci jednou formulářovou komponentou vkládat uživatele a zároveň ho editovat. Při vkládání potřebuji položku password povinnou, stejně jako ověření hesla. Při editaci ale chci, aby validační pravidlo fungovalo skrz addCondition(Form::FILLED). Jak toho mám elegantně docílit? Následující pokus v renderEdit nefunguje, resp. Nette nehlásí chybu, ale výsledek není dle očekávání – následující kód „logicky“ původní pravidla nepřepíše.

...
$this['formCountry']['password']->addCondition(...)->addRule(...);
...
redhead
Člen | 1313
+
0
-

A co to řešit přímo v továrničce? V $this->action budeš mít právě vykonávanou action (default/edit) a přes pár ifů si nasvíš pravidla jaký chceš. Aspoň tak podobně to řeším já.

norbe
Backer | 405
+
0
-

V render fázi už je na úpravu validačních pravidel pozdě, jelikož proběhne až po zpracování signálů.

Ondřej Mirtes
Člen | 1536
+
0
-

Rozděl si to do dvou továrniček, přičemž druhá využije první.

protected function createComponentAddForm() {
	$form = new AppForm;
	//....
	return $form;
}

protected function createComponentEditForm() {
	$form = $this->createComponentAddForm();
	// donastavení pro editaci
	return $form;
}
Aurielle
Člen | 1281
+
0
-

U $form = $this->createComponentAddForm chybí ()

redhead
Člen | 1313
+
0
-

@Ondřej Mirtes: Tam ale bude stejný problém s přepsáním těch pravidel.

Já na add/edit používám i stejnou šablonu, čili bych musel měnit názvy té komponenty podle toho. Podle mě pokud si to uděláš v továrničce přes pár ifů kontrolujících typ action, tak to chyba nebude.

Ondřej Mirtes
Člen | 1536
+
0
-

No tak si udělám obecnou metodu, která jen vytvoří základ formuláře, vytáhnu si jí v createComponentAddForm(), přidám jaká pravidla chci, to samé v createComponentEditForm() a je vyřešeno.

Strkat do továrničky nějaké podmínky podle action není čisté, nehledě na to, že tenhle postup nejde použít např. v komponentě.