Nezávislý blok stránky – přihlašovací formulář

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

Zdravím,

potřebuji udělat přihlašovací formulář nebo spíš blok, který bude někde na okraji viditelný na všech stránkách. Bude si žít „vlastním životem“ a umožní uživateli se přihlásit resp. odhlásit bez nějakého přesměrování na další stránku.

Potíž je v tom, že v Nette může být na jednu stránku jen jeden presenter (dělám v něm teda jen 3 dny, ale snad nekecám), ale z hlediska dekompozice problému by se mi líbilo, kdyby mělo přihlašování svůj vlastní presenter, který by vždycky zjistil, jestli je uživatel zalogovaný, a podle toho by mu nabídl obsah nezávisle na zbytku stránky.

Jak toho co nejelegantněji dosáhnout? Jediné, co mě napadlo, je udělat si v BasePresenteru nějakou „neviditelnou“ komponentu a její createComponentXXX použít jako „metodu presenteru“, což není zrovna moc hezké…

Předem díky za tipy.

Editoval klasyc (3. 4. 2011 19:52)

Šaman
Člen | 2635
+
0
-

To, co tě napadlo je standardní řešení komponent napříč presentery (třeba menu). O ničem lepším a jednoduchém nevím. Druhá možnost je nějaká univerzální továrnička na komponenty která vytváří až na požádání (někde ve fóru poslední dobou jsem to viděl).

Ale to řešení v BasePresenteru se pak dá vždycky předělat.. důležitý je, že máš všechno na jednom místě.

Ještě si můžeš vytvořit celou komponentu a v tom BasePresenteru mít továrničku která ti jen vrátí novou instanci té komponenty. Výhoda by byla v tom, že veškerý kód máš odděleně v komponentě a v tom BasePresenteru už do ni nezasahuješ.

Pavel Kouřil
Člen | 128
+
0
-

Doporučuji přečíst https://doc.nette.org/…n/components – je to tam hezky popsáno, i s příkladem. :)

klasyc
Člen | 14
+
0
-

Díky za rychlé odpovědi. Myslíte si, že má smysl na přihlašovací formulář vytvářet vlastní komponentu nebo byste to radši nechali v tom BasePresenteru?

Patrik Votoček
Člen | 2221
+
0
-

to už záleží na tvém uvážení a „složitosti“ toho formuláře…

Šaman
Člen | 2635
+
0
-

Tak jsem to teď potřeboval i u sebe, probral jsem nějaká řešení na fóru, trochu upravil a výsledek vypadá takto:

přidat do BasePresenter.php

<?php
/**
 * Univerzální továrnička na komponenty
 * Pokud neexistuje volaná komponenta, zkusí se vytvořit ze třídy stejného jména
 *
 * @param string $name
 * @return Control
 */
protected function createComponent($name)
{
	$class = ucfirst($name);
	if( !method_exists($this, "createComponent$class") )
	{
		if( class_exists($class) )
		{
			return new $class($this, $name);
		}
	}
	return parent::createComponent($name);
}
?>

A pokud existuje třída, která dědí od Control má stejný název jako to, co vkládáte do šablony, tak se sama vytvoří. Přednost má komponenta která je explicitně vytvořená. Vyzkoušeno v php 5.2 bez prefixů.