Vlastní validace přes servisu

scorpio1337
Člen | 2
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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;
}