ověření duplicity username na formuláři
- Karel Chramosil
- Člen | 114
Nette Framework 2.0.3 (revision eb558ae released on 2012–04–04), PHP 5.3
Dobrý den, nedaří se mi ověřit duplicitu uživatele username. Rád bych ověřil duplicitu username před odesláním formuláře. Děkuji za radu.
protected function createComponentEditaceForm()
{
$user = $this->getUser();
// echo $user->getIdentity()->username; // přístup k proměným user
function platny_username($usernamex){
$count_user = $this->context->database->table('user')->where(array('username' => $usernamex))->count('*'); // zde hlásí laděnka fatalní chybu.
if ($count_user == 0) { return TRUE;
} else { return FALSE;
}
}
$form = new Form();
$form->addText('username', 'Uživatelské jméno:', 30, 100)
->addRule(Form::FILLED, 'Je nutné zadat uživatelské jméno.')
->addRule('platny_username', 'Uzivatelské jméno je již použito, zadejte prosím nové!!!');
....
- Karel Chramosil
- Člen | 114
Když odchytím výjimku na základě integrity dat v databázi chyba 2300, tak přijdu o zadávaná další data. Uživatel by je musel vyplňovat znova.
- Grelek
- Člen | 233
Duplicitu ověřuj normálně po odeslání formuláře a pokud zachytíš vyjímku, data z formuláře si ulož třeba do session, překresli stránku se zobrazenou chybovou hláškou a prvky ve formuláři naplň tou session.
A pokud to jde, doporučuji aktualizovat Nette. =)
Editoval Grelek (3. 4. 2013 20:11)
- David Matějka
- Moderator | 6445
resit duplicitu zachytavanim vyjimky je blbost. udelej to treba takhle: (ale mel by ses zbavit toho contextu)
protected function createComponentEditaceForm()
{
$form = new Form();
$form->addText('username', 'Uživatelské jméno:', 30, 100)
->addRule(Form::FILLED, 'Je nutné zadat uživatelské jméno.')
->addRule($this->validateUsername, 'Uzivatelské jméno je již použito, zadejte prosím nové!!!');
....
}
public function validateUsername($input)
{
return !$this->context->database->table('user')->where(array('username' => $input->value))->fetch();
}
- MartinitCZ
- Člen | 580
Před odesláním formuláře to musíš řešit jedině pomocí js a ajax.
Na input, kam uživatel píše username, si nabindovat js, které zachytí focusOut a pomocí ajaxu odešle value daného inputu na server. Server pak vrátí TRUE nebo FALSE a dle hodnoty si už jen vypíšeš chybovou hlášku.
Pokud jsem to celé pochopil správně, tak příklad máš např. na http://www.fakturoid.cz/ (registrační formulář).
Editoval martinit (3. 4. 2013 20:55)
- duke
- Člen | 650
Nač session? Prostě při detekované duplicitě přidej do formuláře
chybu metodou addError
a nepřesměrovávej.
Uživatelsky přívětivější je však použít ajax navěšený na onchange událost inputu username a provést kontrolu ještě před odesláním celého registračního formuláře. Podpory pro toto přímo v Nette se nejspíš v budoucnu také dočkáme (tuším, že jsem to viděl v roadmap), ale prozatím si to budeš muset napsat sám.
A co se týče té databázové chyby, tak jsi měl na mysli asi kód 23000, ne?
- Karel Chramosil
- Člen | 114
Děkuji za radu: Upravil jsem zdroják, ale laděnka hlásí chybu na posledním řádku: Cannot read an undeclared property UserNovyPresenter::$validateUsername.
class UserNovyPresenter extends BasePresenter
{
public function validateUsername($input){
return !$this->context->database->table('user')->where(array('username' => $input->value))->fetch();
}
/**
* Továrna na vytvoření formuláře pro založení nového uživatele v tabulce user.
* @return Nette\Application\UI\Form
*/
protected function createComponentEditaceForm()
{
$user = $this->getUser();
// echo $user->getIdentity()->username; // přístup k proměným user
$form = new Form();
$form->addText('username', 'Uživatelské jméno:', 30, 100)
->addRule(Form::FILLED, 'Je nutné zadat uživatelské jméno.')
->addRule($this->validateUsername, 'Uzivatelské jméno je již použito, zadejte prosím nové!!!');
- David Matějka
- Moderator | 6445
asi za to muze ta stara verze nette.
muzes pouzit misto
$this->validateUsername
tohle:
callback($this, 'validateUsername');