Jak připojit model k validačnímu pravidlu

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

V presenteru mám ve formuláři tuhle položku:

		$form->addText('username', 'Username:')
			->setRequired('Please provide a username.')
			->addRule('MyValidators::isUsernameAvailable', 'Uživatelské jméno je již registrováno');

a definici validačního pravidla mám v tomto presenteru takhle:

class MyValidators {
	public static function isUsernameAvailable($item, $arg) {
		return $this->context->createUsers()->where($item, $arg);
	}
}

v souboru config.neon mám pro model vytvořenou továrničku:

factories:
users: Users

a samotný model vypadá takto:

class Users extends Selection
{
    public function __construct(Connection $connection)
    {
        parent::__construct('users', $connection);
    }
}

Bohužel se nemůžu v metodě isUsernameAvailable nijak dostat ke svojemu modelu. Navíc dostávám chybové hlášení: Fatal Error Using $this when not in object context. Je zvláštní, že když k modelu přistupuju ve třidé presenteru pomocí $this->context->createUsers()->… tak mi to funguje, ale v jiné třídě, než je třída presenteru dostávám chybové hlášení.
Poradíte mi někdo prosím jak správně napojit ten model na tu validační funkci?

vvoody
Člen | 910
+
0
-

V triede MyValidators asi ziadny context nebudes mat, takze skus presunut tu metodu do presenteru. A ten error myslim ze v static metode nemozno pouzit $this, skus self alebo ju nerob static a namiesto MyValidators::isUsernameAvailable pouzi callback($this,‚isUsernameAvailable‘).

Uzivatelsky validator som este nepouzival takze si nejsom isty, ale podla dokumentacie si myslim ze $item je objekt toho textoveho pola, ktaze do podmienky where vloz tak ako je to v priklade $item->value.

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Eh, ve statické metodě není $this, to je vlastnost jazyka PHP. Metodě addRule() můžeš předat i callback na nestatickou metodu. Třída pak musí mít k dispozici $this->context (ve zmíněné ukázce tomu tak není), v lepším případě jen konkrétní potřebný objekt, tedy výsledek context->createUsers().

Nich
Člen | 49
+
0
-

Tak moc dík za rady :-)

funkci sem teda hodil do presenteru…

	public function isUsernameAvailable($item) {
		$users = $this->context->createUsers()->where('username', $item->value)->count("*");
		if ($users == 0)
			return TRUE;
		return FALSE;
	}

a volám ju přes callback

->addRule(callback($this,'isUsernameAvailable'), 'Uživatelské jméno je již registrováno');

vše funguje jak má…