Jak připojit model k validačnímu pravidlu
- Nich
- Člen | 49
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
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
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
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á…