Sign:out/Sign:in presmerovanie v layout.latte

Br0visT
Člen | 17
+
0
-

Zdravím, mám trochu problém s pochopením, ako sa v programe dohľadáva potrebná šablóna, presenter…
Ide v podstate o tri súbory:

@layout.latte
./Sign/in.latte
../SignPresenter.php

v @layout.latte mám:

{if $user->loggedIn}
	<li class="nav-item active ml-2 mr-2">
		<a class="nav-link" n:href="Sign:in">Prihlásenie<span class="sr-only">(current)</span></a>
	</li>
{else}
	<li class="nav-item active ml-2 mr-2">
		<a class="nav-link" n:href="Sign:out">Odhlásenie<span class="sr-only">(current)</span></a>
	</li>
{/if}

teda, že keď je používateľ prihlásený, zobraz tlačítko na odhlásenie (ak nie je, prihlásenie)

Mám teda problém pochopiť, čo znamená to presmerovanie Sign:in a Sign:out
Resp. predstavme si, že nie som prihlásený, kliknem na tlačidlo Prihlásenie a presmeruje ma do zložky ./Sign/in.latte ?
V ktorej je:

{block content}
    <h1 n:block=title>Prihlásenie</h1>
    {control signInForm}
{/block}

teda vlastne link na funkciu protected function createComponentSignInForm(): Form v subore SignPresenter.php, ktoreho obsah je:

<?php
namespace App\Presenters;

use Nette;
use Nette\Application\UI\Form;


class SignPresenter extends Nette\Application\UI\Presenter
{
	protected function createComponentSignInForm(): Form
	{
		$form = new Form;
		$form->addEmail('email', 'Email:')
			->setRequired('Vypíšte prihlasovací email.');

		$form->addPassword('password', 'Heslo:')
			->setRequired('Vypíšte heslo.');

		$form->addSubmit('submit', 'Prihlásiť');

		$form->onSuccess[] = [$this, 'signInFormSucceeded'];
		return $form;
	}

	public function signInFormSucceeded(Form $form, \stdClass $values): void
	{
		try {
			$this->getUser()->login($values->email, $values->password);
			$this->redirect('Homepage:');

		} catch (Nette\Security\AuthenticationException $e) {
			$form->addError('Nesprávne prihlasovacie meno alebo heslo.');
		}
	}

	public function actionOut(): void
	{
		$this->getUser()->logout();
		$this->flashMessage('Odhlásenie bolo úspešné.');
		$this->redirect('Homepage:');
	}
}
?>

takže spustí sa prvá funkcia, ktorá keď úspešne prejde, spustí druhú funkciu, pričom ak je v configu rovnaké meno/heslo ako vo formulári, prihlási ma…

Ak prihlasovanie chápem správne, tak fajn. Ak nie, prosím opravte ma.

Čo však asi nechápem je odhlasovanie, keďže v layoute je Sign:out, no out.latte neexistuje, avšak v SignPresenter.php je public function actionOut(): void, funkcia, ktorá uživateľa odhlási… ako sa ku nej program teda dostane?

Ďakujem,
v prípade, že som niečo nezrozumiteľne napísal, dajte vedieť.

David Matějka
Moderator | 6445
+
+3
-

Odkazy vedou na presentery (tedy SignPresenter) a jejich akce. Až poté se hledá a vykresluje šablona. u actionOut je redirect na HomepagePresenter, takže k vykreslování šablony nedojde.

Doporučuju si nastudovat dokumentaci, v tomhle případě https://doc.nette.org/…n/presenters