Vlastní form komponenta a problém s addCondition

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

Ahoj, snažím se napsat vlastní form komponentu pro prvek IČ společnosti:

class CompanyNumber extends Nette\Forms\Controls\TextInput
{
	public function __construct($label = null)
	{
		parent::__construct($label, 8);

		$this->addCondition(Form::FILLED)
			->addRule(__CLASS__ . '::validateCompanyNumber', 'Zadejte validní IČ.', 1)
			;
	}

	public function getValue()
	{
		return self::validateCompanyNumber($this, 2) ? (int)$this->value : null;
	}


	public static function validateCompanyNumber(Nette\Forms\IControl $control, $kteraSeProvadi = 0)
	{
		echo $kteraSeProvadi;

		$cn = (string)$control->value;

		if (!preg_match('#^\d{'.self::LENGTH.'}$#', $cn))
		{
			return false;
		}
	}
}

Problém tkví v tom, že se neprovede addRule, které je v konstruktoru. Když, ale zakomentuji to addCondition, které je předním, tak to běží.

Může mi prosím někdo poradit, v čem dělám chybu, popř. jak by mělo vypadat správné řešení?

Děkuji

David Matějka
Moderator | 6445
+
0
-

Neni to náhodou uplne stejny problem jako pises tady: https://forum.nette.org/…-type-number ?

Cars Tomas
Člen | 43
+
0
-

No řekl bych, že není, jelikož jsem se na type=number úplně vyklašlal a nepoužívám ho.

Cars Tomas
Člen | 43
+
0
-

Tak problém jsem vyřešil. Chyba byla ve fci getValue.
Níže přikládám dle mého soudu funkční řešení.

use Nette,
	Nette\Forms\Form,
	Nette\Forms\Container;

class CompanyNumber extends Nette\Forms\Controls\TextInput
{
	const LENGTH = 8;

	protected $value;


	public function __construct($label = null)
	{
		parent::__construct($label, self::LENGTH);

		$this->addCondition(Form::FILLED)
			->addRule(Form::INTEGER, 'Zadejte celé číslo.')
			->addRule(Form::PATTERN, 'Zadejte '.self::LENGTH.' číslic.', '([0-9]){'.self::LENGTH.'}')
			->addRule(__CLASS__ . '::validateCompanyNumber', 'Zadejte validní IČ.')
			;

	}


	public static function validateCompanyNumber(Nette\Forms\IControl $control)
	{
		$cn = $control->getValue();

		if (!preg_match('#^\d{'.self::LENGTH.'}$#', $cn))
		{
			return false;
		}


		$check_sum = 0;
		for ($i = 0; $i < (self::LENGTH - 1); $i++)
		{
			$check_sum += $cn[$i] * (self::LENGTH - $i);
		}

		$check_sum = $check_sum % 11;

		if ($check_sum === 0)
		{
			$c = 1;
		}

		else if ($check_sum === 10)
		{
			$c = 1;
		}

		else if ($check_sum === 1)
		{
			$c = 0;
		}

		else
		{
			$c = 11 - $check_sum;
		}

		return (int)$cn[(self::LENGTH - 1)] === $c;
	}


	public static function register()
	{
		Container::extensionMethod('addCompanyNumber', function (Form $container, $name, $label = null)
		{
			return $container[$name] = new CompanyNumber($label);
		});
	}
}