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 | 2666
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 | 2666
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ů.