Chybové hlášky z formulára do Šablóny

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

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

Máš chybu v namespaces. Nahrad Nette\Security\AuthenticationException tímto \Nette\Security\AuthenticationException.

David Kudera
Člen | 455
+
0
-

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

Pre martinit a sakren

Ak tam dám to lomítko prihlasuje ma to aj bez zadania údajov :)

David Kudera
Člen | 455
+
0
-

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

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

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

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

David Kudera
Člen | 455
+
0
-

A vypisování chyb v šabloně pro registraci máš?

MartinitCZ
Člen | 580
+
0
-

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

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

@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á

David Kudera
Člen | 455
+
0
-

Co ta šablona? Máš v ní určitě vypisování chyb?

SontoEremo
Člen | 341
+
0
-

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

Vlastně k čemu je tam tohle: ->addConditionOn($signup_form['email'], FORM::FILLED, FALSE)?

David Kudera
Člen | 455
+
0
-

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

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

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)

David Kudera
Člen | 455
+
0
-

Tady link je dobře vysvětlený, k čemu to condition vlastně slouží

SontoEremo
Člen | 341
+
0
-

**@sakren ** Všetko funguje ďakujem ti veľmi pekne.