Vlastní validace přes servisu
- scorpio1337
- Člen | 2
Ahoj.
Potřeboval bych ve formuláři udělat validaci, která přes servisu pošle value na API a tam zjistí, jestli odpovídá požadavkům.
Na straně JS jsem to vyřešil přepsáním validačních scriptů na async.
Na straně PHP je custom validační metoda statická, takže se chci zeptat, jakým korektním způsobem bych mohl dostat servisu do této metody.
<?php
class CustomInput extends TextInput
{
public function __construct($label = NULL, $cols = NULL, $maxLength = NULL)
{
parent::__construct($label, $cols, $maxLength);
$this->addRule(':checkViaApi', 'Please enter a valid value');
}
public static function validateCheckViaApi(Nette\Forms\IControl $control)
{
/**
* Because we can't have services in static method, we just return TRUE and handle check on front end.
*/
return TRUE;
}
}
?>
Řešil někdo podobný problém?
Díky.
- CZechBoY
- Člen | 3608
Můžeš třeba přes dekorátor zavolat nějaký setter na svým formuláři/kontejneru a ten potom tu službu dotáhne do novýho inputu, kterej vytváří.
trait MyContainerTrait
{
private $service;
public function setService(Service $service)
{
$this->service = $service;
}
public function addCustomInput($name, $label, $cols, $maxLength)
{
$control = new CustomInput($this->service, $label, $cols, $maxLength);
$this->addComponent($control, $name);
return $control;
}
}
Pokud ještě nepoužíváš container traitu ve formuláři tak se to dělá cca takto
trait MyContainerTrait
{
public function addContainer(string $name): Container
{
$control = new MyContainer;
$control->setCurrentGroup($this->getCurrentGroup());
$control->setService($this->service);
$this->addComponent($control, $name);
return $control;
}
}
class MyContainer extends NetteContainer
{
use MyContainerTrait;
}
class MyForm extends NetteForm
{
use MyContainerTrait;
}
- scorpio1337
- Člen | 2
To mě taky napadlo. Jenom jsem doufal, že existuje nějaká lepší cesta, abych to mohl používat v libovolném formuláři bez nutnosti myslet na předání správné servisy.
Vyřeším to nejspíše nějakou faktorkou, ať to je aspoň sjednocené.
Děkuji za info. :-)
- CZechBoY
- Člen | 3608
Samozřejmě si můžeš i předat továrnu do toho kontejneru a volat jen
tu tvorná místo ručního vytváření v kontejneru. Sám to tak taky
mám…
tzn. způsob stejnej (místo service předáváš factory) a změní se ještě
ta add metoda
public function addCustomInput($name, $label, $cols, $maxLength)
{
$control = $this->customInputFactory->create($label, $cols, $maxLength);
$this->addComponent($control, $name);
return $control;
}