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 | 2668
+
+1
-

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