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
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
Neni to náhodou uplne stejny problem jako pises tady: https://forum.nette.org/…-type-number ?
- Cars Tomas
- Člen | 43
No řekl bych, že není, jelikož jsem se na type=number úplně vyklašlal a nepoužívám ho.
- Cars Tomas
- Člen | 43
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);
});
}
}