Ověření, jestli uživatel již neexistuje, jak na to?

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

Dobrý den,
potřeboval bych poradit, ať to řeším jak chci, stále se mi ukazuje pouze stránka s chybou 500.

můj kód:

protected function createComponentRegisterForm() {
    $form = new Form;

    $form->addText('username', 'Jméno:', 35)
    ->addRule(callback($this, 'isNickAvailable'), 'Zadané uživatelské jméno již existuje');
    $form->addText('email', 'E-mail: *', 35)
            ->setEmptyValue('@')
            ->addRule(Form::FILLED, 'Vyplňte Váš email')
            ->addCondition(Form::FILLED)
            ->addRule(Form::EMAIL, 'Neplatná emailová adresa');
    $form->addPassword('password', 'Heslo: *', 35)
            ->addRule(Form::FILLED, 'Vyplňte Vaše heslo');
    $form->addPassword('password2', 'Heslo znovu: *', 35)
            ->addConditionOn($form['password'], Form::VALID)
            ->addRule(Form::FILLED, 'Heslo znovu')
            ->addRule(Form::EQUAL, 'Hesla se neshodují.', $form['password']);
    $form->addCheckbox('mcregister', 'Zaregistrovat na MC')
         ->setDefaultValue(FALSE);
    $form->addCheckbox('agree', 'Souhlasím s podmínkami')
         ->addRule(Form::EQUAL, 'Je potřeba souhlasit s podmínkami', TRUE);
    $form->addSubmit('send', 'Registrovat');
    $form->onSuccess[] = callback($this, 'registerFormSubmitted');
    return $form;
}

public function registerFormSubmitted(UI\Form $form) {

  $values = $form->getValues();
  $exist = count($this->users->findShow()->where('username = ?',$this->username)->limit(1)->fetch());

  if($exist > 0)
  {
     $this->redirect('Homepage:default');
  }
  else
  {
  $new_user_id = $this->users->register($values);
  if($new_user_id){
    $this->redirect('Homepage:default');
    $mail = new Message;
    $mail->setFrom('Informace <info@gcore.cz')
      ->addTo($values->email)
      ->setSubject('Registrace')
      ->setHTMLBody('<h1>Registrace úspěšná</h1> <p>Dobrý den,<br>Vaše registrace na portále <a href="http://gcore.cz">GCore.cz</a> byla úspěšná.</p><p>Již se můžete přihlásit a využívat našich služeb.</p><p>S pozdravem<br>redakce GCore.cz</p>');
    $mailer = new SendmailMailer;
    $mailer->send($mail);
  }
 }

}
public function isNickAvailable( $username)
{
  echo $username->getValue();

  $username = $this->users()->where(array(
 'username' => $username->getValue()))->limit(1)->fetch();

  if ($result !== FALSE && !$result->username)
  {
    return true;
  }
  else
  {
    return false;
  }
}

Já už opravdu nevím :(, potřeboval bych aby mi to neodeslalo, když je uživatel již existuje.

David Matějka
Moderator | 6445
+
0
-

stránka s chybou 500

lepsi popis chyby nemas, jo?

@dobby: pro zjisteni hodnoty controlu se pouziva getValue, takze to ma spravne..

Editoval matej21 (24. 12. 2013 22:49)

dobby
Člen | 10
+
0
-

Ano, uvedomil som si to az teraz.

Chybu vidim este v tomto:

<?php
$username = $this->users()->where(array(
 'username' => $username->getValue()))->limit(1)->fetch();
?>

preco sa v if-e pytas na $result?

<?php
if ($result !== FALSE && !$result->username)
?>
Zuben45
Člen | 268
+
0
-

díky za odpovědi, ale už jsem to vyřešil následujícím způsobem :)

public function registerFormSubmitted(UI\Form $form) {

   $values = $form->getValues();
   $exists = $this->users->findShow();
   foreach($exists as $exist)
   {
     if($exist->username == $values->username)
     {
       $ok = FALSE;
     }
     else
     {
       $ok = TRUE;
       if($exist->email == $values->email)
       {
         $mailok = FALSE;
       }
       else
       {
         $mailok = TRUE;
       }
     }
   }

   //$mail_exist = count($this->users->findShow()->where('email = ?',$values->email)->limit(1)->fetch());
   if($ok == FALSE)
   {
       $form->addError('Uživatelské jméno se již používá.');
   }
   else
   {
     if($mailok == FALSE)
     {
       $form->addError('Email se již používá.');
     }
     else
     {
       $new_user_id = $this->users->register($values);
       if($new_user_id)
       {
         $this->redirect('Homepage:default');
         $mail = new Message;
         $mail->setFrom('Informace <info@gcore.cz')
           ->addTo($values->email)
           ->setSubject('Registrace')
           ->setHTMLBody('<h1>Registrace úspěšná</h1> <p>Dobrý den,<br>Vaše registrace na portále <a href="http://gcore.cz">GCore.cz</a> byla úspěšná.</p><p>Již se můžete přihlásit a využívat našich služeb.</p><p>S pozdravem<br>redakce GCore.cz</p>');
         $mailer = new SendmailMailer;
         $mailer->send($mail);
       }
     }
   }

 }
David Matějka
Moderator | 6445
+
0
-

chtel jsem k tomu napsat neco vic, ale tohle bude stacit: ouuuuuuch!!

Zuben45
Člen | 268
+
0
-

matej21 napsal(a):

chtel jsem k tomu napsat neco vic, ale tohle bude stacit: ouuuuuuch!!

co ještě by tam mělo být ? :)

David Matějka
Moderator | 6445
+
0
-

spis co by tam nemelo byt – to prolezani vsech uzivatelu, abys zjistil, jestli tam nekdo neni s tim jmenem a emailem..

dej zpet tu kontrolu pres rule a rekni, co ti to pise za chybu

mdjimy
Člen | 9
+
0
-

Hmm moc hezká funkce todle to

$values = $form->getValues();
$exists = $this->users->findShow();
foreach($exists as $exist) {
  if($exist->username == $values->username) {
    $ok = FALSE;
  } else {
    $ok = TRUE;
    if($exist->email == $values->email) {
      $mailok = FALSE;
    } else {
      $mailok = TRUE;
    }
  }
}

Nejen ze uděláš práci za DB, ale ještě k tomu dojdeš ke špatnému výsledku…

Pokud budeš hledat FrantaNovak s emailem franta.novak@seznam.cz

A budeš iterovat přes tyto uživatele v tomto pořadí

FrantaNovak – franta.novak@seznam.cz
PepaZDepa – pepa.z.depa@centrum.cz
:
:

Tak budeš mít v proměnné $ok = TRUE, $mailok = TRUE …

+

Určitě by neuškodilo brát login „Honza“ a „honza“ za stejné… stejně pak u mailu…

Editoval mdjimy (23. 4. 2014 23:03)

greeny
Člen | 405
+
0
-

Chyba bude možná i tady:

<?php
$exist = count($this->users->findShow()->where('username = ?',$this->username)->limit(1)->fetch());
?>

fetch() vrací NULL nebo ActiveRow, takže count() na fetch() je blbost.

Šaman
Člen | 2666
+
+1
-

Co se ti nelíbí na kódu ze Sandboxu?