Validácia dynamicky pridaného formulárového poľa

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

Zdravím vás,
vie mi prosím vás niekto poradiť ako zvalidujem dynamické formulárové pole? Chápem, že si môžem napísať vlastné validačné pravidlo, ale chcem aby to validovalo aj v javascripte(bez toho, aby som to písal). Podmienka vyzerá takto a v js to funguje tak ako to je:

$form->addMultiSelect('brands', 'brands.label', $this->campaignService->brandsToFormSelect() )
       ->addConditionOn( $form['global'], $form::EQUAL, false )
           ->addConditionOn( $form['categories'], ~$form::FILLED )
           	->addConditionOn( $form['products'], ~$form::FILLED )
					->addFilter( function ( $value ) use ( $form )  {
						return $value = $form->getHttpData()['products'];
					})->setRequired('brands.required');

Proste pole brands kontroluje, či sú vyplnené, alebo nezaškrtnuté iné políčka formulára. A medzi tými inými je pole products, ktoré sa ale vyplní cez js dynamicky. Vlastne by som len potreboval do hodnoty $value pre pole products vložiť $form->getHttpData()[‚products‘]. Myslel som, že to pôjde cez addFilter(), ale to zrejme nemá s validáciou nič spoločné. Dá sa to nejako elegantne vyriešiť.

Dúfam, že sa to dá pochopiť. Ďakujem.

Editoval Čamo (3. 5. 2016 17:56)

Čamo
Člen | 798
+
0
-

Momentálne pracujem s takýmto riešením:

	$form->onValidate = [$this, function validateCreateForm( $form )
	{
		// Je možné zrušiť v tejto fáze chybu vo formulári?
	}];

Editoval Čamo (3. 5. 2016 18:20)

Čamo
Člen | 798
+
0
-

Takéto niečo nebude fungovať?

	public function validateCreateForm( $form )
	{
		if( $brandsErrors = $form['brands']->getErrors() )
		{
			$form->cleanErrors();
		}
	}
CZechBoY
Člen | 3608
+
0
-

Možná by bylo lepší to vysvětlit na konkrétním příkladu.
Ty přes nějakej ajax načteš hodnoty do selectboxu, tzn něco jako dependent selectbox.

Čamo
Člen | 798
+
0
-

CZechBoY ano a v tom prípade je pole products pri validácii prázdne. Lenže ja potrebujem podľa neho validovať iné polia a to robí problémy. Ale akurát som to (dúfam)vyriešil cez onValidate.

	public function validateCreateForm( $form )
	{
		if( ( $brandsErrors = $form['brands']->getErrors() ) && $form->getHttpData()['products'] )
		{
			$brands = $form['brands'];
			$msg = $form->translator->translate('brands.required');
			foreach( $brandsErrors as $key => $val )
			{
				if( $val === $msg )
				{
					$brands->cleanErrors();
					unset($brandsErrors[$key]);
				}
			}
			foreach( $brandsErrors as $e )  // If there are more errors they have to be set back.
			{
				$brands->addError($e);
			}
		}
	}

Takže javascript sa viliduje normálne a v onValidate len zmažem príslušný error na komponente form[‚brands‘].

Editoval Čamo (16. 6. 2016 16:16)

Čamo
Člen | 798
+
0
-

PS: Keby tak existovala metóda beforeValidate, kde by sa dali nastaviť poliam hodnoty z getHttpData()…