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

- klasyc
 - Člen | 14
 
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 | 2668
 
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
 
Doporučuji přečíst https://doc.nette.org/…n/components – je to tam hezky popsáno, i s příkladem. :)

- Šaman
 - Člen | 2668
 
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ů.