ověření duplicity username na formuláři

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

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é!!!');
....
Grelek
Člen | 233
+
0
-

Jaký k tomu máš důvod? Navíc mám takový pocit, že to je totální blbost. Jak můžeš ověřit duplicitu jména, když ho neznáš?

Editoval Grelek (3. 4. 2013 20:06)

Karel Chramosil
Člen | 114
+
0
-

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
+
0
-

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)

Karel Chramosil
Člen | 114
+
0
-

Děkuji za radu. Když to jinak nejde tak budu muset řešit přes session.

David Matějka
Moderator | 6445
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

asi za to muze ta stara verze nette.

muzes pouzit misto

$this->validateUsername

tohle:

callback($this, 'validateUsername');
Karel Chramosil
Člen | 114
+
0
-

Děkuji všem nejvíce mateji21 poslední zdrojový řádek byl ten pravý.