Chybové hlášky z formulára do Šablóny
- SontoEremo
- Člen | 341
Zdravím
Rád by som sa opítal ako preniesť z formulára v presenter do Šablóny chybové hlášky ako napr. Zadané úžívateľské meno a heslo sa nezhodujú vždy keď napíšem hocičo do formulára alebo aj nenapíšem vyskočí na mňa ľadenka s chybou Neplatné úžívateľské meno ako poriešiť aby ľadenka sa nezobrazovala? aj keď som sa ju snažil vypnúť vyskočilo zas
Server Error
We're sorry! The server encountered an internal error and was unable to complete
your request. Please try again later.
error 500
Podotýkam používam UserManager zo Sandboxu a pripájam aj svoj SignPresenter a taktiež aj Šablónu
SignPresenter
<?php
namespace App\presenters;
use Nette\Application\UI\Form;
use Nette\Utils\Html;
class SignPresenter extends BasePresenter {
/**
* @var \App\Model\UserManager
* @inject
*/
public $userManager;
/** @persistent */
public $backlink = '';
/**
* @var \App\Model\UserRepository
* @inject
*/
public $userRepository;
protected function createComponentSignUpForm() {
$repository = $this->userRepository;
$signup_form = new Form;
$signup_form->addText('username')
->setAttribute('placeholder', 'Užívateľské meno')
->setAttribute('class', 'form-control')
->setRequired('Užívateľské meno je povinné!')
->addRule(function($input) use($repository)
{
return !$repository->userexists($input->value);
}, 'Toto užívateľské meno je obsadené prosím vyberte si iné!');
$signup_form->addText('email')
->setAttribute('placeholder', 'Emailová adresa')
->setAttribute('class', 'form-control')
->setRequired('Email je povinný!')
->addConditionOn($signup_form['email'], FORM::FILLED, FALSE)
->addRule(Form::EMAIL, 'Zadajte prosím, platnú emailovú adresu!')
->addRule(function($input) use($repository)
{
return !$repository->usermailexists($input->value);
}, 'Táto emailová adresa je už v systéme zaregistrovaná!');
$signup_form->addPassword('password')
->setAttribute('placeholder', 'Heslo')
->setAttribute('class', 'form-control');
$signup_form->addPassword('confirm_password')
->setAttribute('placeholder', 'Potvrďe Heslo')
->setAttribute('class', 'form-control')
->addRule(Form::EQUAL, 'Zadané heslá sa musia zhodovať', $signup_form['password']);
$signup_form->addSubmit('signUp', 'Vytvoriť účet');
$signup_form->onSuccess[] = callback($this, 'signUpSuccessSubmitted');
return $signup_form;
}
public function signUpSuccessSubmitted(Form $signup_form) {
$values = $signup_form->getValues();
if($values->password == $values->confirm_password){
$user = $this->userManager;
$user->add($values->username, $values->email, $values->password);
$this->flashMessage(Html::el('div')
->setHtml('Registrácia prebehla úspešne. Na zadanú Emailovú adresu <strong class="email-strong">' . ' ' . $signup_form->values['email'] . ' ' . '</strong> Vám bol zaslaný aktivačný link, po úspešnej aktivácii sa budete môcť prihlásiť.'));
$this->redirect('finish');
} else {
$this->flashMessage('Something goes wrong, maybe the passwords doesn\'t match.');
}
}
protected function createComponentSignInForm() {
$signin_form = new Form;
$signin_form->addText('username')
->setAttribute('placeholder', 'Užívateľské meno')
->setAttribute('class', 'form-control');
$signin_form->addPassword('password')
->setAttribute('placeholder', 'Heslo')
->setAttribute('class', 'form-control');
$signin_form->addSubmit('signIn', 'Prihlásiť sa');
$signin_form->onSuccess[] = $this->signInSuccessSubmitted;
return $signin_form;
}
public function signInSuccessSubmitted($signin_form, $values) {
try {
$this->getUser()->login($values->username, $values->password);
} catch (Nette\Security\AuthenticationException $e) {
$signin_form->addError('Neplatné úžívateľské meno alebo Heslo');
}
$this->restoreRequest($this->backlink);
$this->redirect('Dashboard:');
}
public function actionOut()
{
$this->getUser()->logout();
$this->flashMessage('Boli ste úspešne odhlásený.');
$this->redirect('in');
}
}
A Šablóna
{block title}Prihlásenie{/block}
{block content}
<div id="signup-page-content">
{form signInForm class=>"form"}
<h1 class="block-heading">Prihlásenie ***</h1>
<div n:foreach="$form->errors as $error" class="alert alert-danger">
<strong >{$error}</strong>
</div>
SKÚŠAL SOM AJ
<div n:foreach="$flashes as $flash" class="alert alert-danger flash {$flash->type}">
<strong>{$flash->message}</strong>
</div>
<div class="input-icon mbl">
<i class="fa fa-user"></i>
{input username}
</div>
<div class="input-icon mbl">
<i class="fa fa-key"></i>
{input password}
</div>
{input signIn class=>"btn btn-lg btn-red btn-block"}
{/form}
<div class="sign-footer">
<ul class="list-unstyled">
<li><a n:href="Sign:reset">Zabudli ste heslo?</a></li>
<li>Ešte nemáte účet? <a n:href="Sign:up">Vytvorte si ho</a></li>
</ul>
</div>
</div>
{/block}
Nič nezaberá neviem dlho som s Nette nerobil a po týchto zmenách ktoré tu nastali, už ani netuším či mám aj štruktúru dobrú :)
Samozrejme za rýchlu odpoveď všetkým vopred Ďakujem.
P.S. Ani na registrácii nefungujú chybové hlášky ako napr. Existujúci Email či Užívateľské meno.
Editoval SontoEremo (16. 6. 2014 18:56)
- MartinitCZ
- Člen | 580
Máš chybu v namespaces. Nahrad
Nette\Security\AuthenticationException
tímto
\Nette\Security\AuthenticationException
.
- David Kudera
- Člen | 455
Možná by mohl být problém v namespace, přesněji v chytání výjimky Nette\Security\AuthenticationException. Doplnit např. lomítko nebo use na začátek.
<?php
try {
$this->getUser()->login($values->username, $values->password);
} catch (\Nette\Security\AuthenticationException $e) {
$signin_form->addError('Neplatné úžívateľské meno alebo Heslo');
}
?>
- SontoEremo
- Člen | 341
Pre martinit a sakren
Ak tam dám to lomítko prihlasuje ma to aj bez zadania údajov :)
- David Kudera
- Člen | 455
Jo ještě musíš ten restoreRequest a redirect přesunout dovnitř try hned za login.
Edit: I když přihlásit by to i tak nemělo
Editoval sakren (16. 6. 2014 19:11)
- SontoEremo
- Člen | 341
To sakren
Takže to nebolo lomítkom :)
dal som use Nette\Security as NS; dole
public function signInSuccessSubmitted($signin_form, $values) {
try {
$this->getUser()->login($values->username, $values->password);
$this->restoreRequest($this->backlink);
$this->redirect('Dashboard:');
} catch (NS\AuthenticationException $e) {
$signin_form->addError('Neplatné úžívateľské meno alebo Heslo');
}
}
Vďaka chalani
- David Kudera
- Člen | 455
Ono to vyjde funkčně na stejno, jen use, tak jak jsi to napsal, je lepší ;-)
Problém je, že i po zobrazení chyby to přesměrovalo dovnitř aplikace, kde by měla být kontrola, jestli je člověk přihlášen.
Editoval sakren (16. 6. 2014 19:16)
- SontoEremo
- Člen | 341
Ešte predsa mám jeden problém a to pri registrácii i keď mám registroavný email a užívateľské meno a snažim sa registrovať to isté tak sa nič nedeje len sa obnoví formulár ale ani nevypíše, že údaje už existujú a taktiež aj heslo ak ho nezadám alebo zada´m odlišné tak sa nič nedeje. A vôbec netuším kde čo a jak
- MartinitCZ
- Člen | 580
@SontoEremo: Tohle ale vůbec nesouvisí
s Nette!
Musíš si pomocí sql dotazu ověřit, zda ten záznam je a pokud ano, tak
nedovolit registrovat. Tzv. si v sql tabulce nad sloupec email
nastavit klíč (zakázat možnost mít jeden záznam 2× v daném sloupci) a
odchytávat Exception.
- David Kudera
- Člen | 455
Unique na jméně a emailu a odchycení duplicate výjimky je určitě lepší, hlavně v editačním formuláři a prostě i „jen tak pro jistotu“. Tady ale má vlastní funkce userexists() a usermailexists() a pokud fungují správně, tak má problém s formulářem. IMHO
- SontoEremo
- Člen | 341
@martinit
Ale už som to raz mal vyriešené ale som to zmazal no tu na fóre som to riešil a to takto
SignPresenter → časť SignUpForm
$signup_form->addText('username')
->setAttribute('placeholder', 'Užívateľské meno')
->setAttribute('class', 'form-control')
->setRequired('Užívateľské meno je povinné!')
->addRule(function($input) use($repository)
{
return !$repository->userexists($input->value);
}, 'Toto užívateľské meno je obsadené prosím vyberte si iné!');
$signup_form->addText('email')
->setAttribute('placeholder', 'Emailová adresa')
->setAttribute('class', 'form-control')
->setRequired('Email je povinný!')
->addConditionOn($signup_form['email'], FORM::FILLED, FALSE)
->addRule(Form::EMAIL, 'Zadajte prosím, platnú emailovú adresu!')
->addRule(function($input) use($repository)
{
return !$repository->usermailexists($input->value);
}, 'Táto emailová adresa je už v systéme zaregistrovaná!');
A taktiež v UserRepository
<?php
namespace App\model;
/**
* Tabulka user
*/
class UserRepository extends \Nette\Object
{
/** @var Nette\Database\Connection */
private $database;
public function __construct(\Nette\Database\Context $database)
{
$this->database = $database;
}
public function findAll()
{
return $this->database->table('vl_member_schema');
}
public function findById($id)
{
return $this->findAll()->get($id);
}
public function insert($values)
{
return $this->findAll()->insert($values);
}
public function userexists($username)
{
return $this->findAll()->select('username')->where('username', $username)->fetch();
}
public function usermailexists($email)
{
return $this->findAll()->select('email')->where('email', $email)->fetch();
}
}
Ale aj tak mi žiadnu chybu nevypíše ani keď zadám odlišné heslá
- SontoEremo
- Člen | 341
@sakren
Tu je :)
<div n:foreach="$flashes as $flash" class="alert alert-danger flash {$flash->type}">
<ul>
<li>{$flash->message}</li>
</ul>
</div>
- David Kudera
- Člen | 455
Vlastně k čemu je tam tohle:
->addConditionOn($signup_form['email'], FORM::FILLED, FALSE)
?
- David Kudera
- Člen | 455
Jo a k té šabloně. Tady vykresluješ flash zprávičky a ne chyby formuláře. Ty máš správně v tom 1. příspěvku:
<div n:foreach="$form->errors as $error" class="alert alert-danger">
<strong >{$error}</strong>
</div>
- SontoEremo
- Člen | 341
@sakren
Ospravedlňujem sa to je s toho čo som prechádzal fórum a skúšal
všelijaké možnosti asi som to nezmal…
Žeby to bolo tým?
- David Kudera
- Člen | 455
No minimálně to způsobí to, že se ti nevypíší žádné chyby formuláře, ale jen flash zprávičky, což je něco jiného
Edit: Omlouvám se, asi jsi myslel to conditionOn. To by tam být myslím určitě nemělo.. Vlastně by to spíš mělo hodit notice, protože se tam přistupuje k $form[‚email‘], ale ten v tu chvíli ještě ani neexistuje....... Asi…
Editoval sakren (16. 6. 2014 20:26)