#1 20. 1. 2010 0:11
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Jiný obsah na stejné URL po přihlášení
Ahoj,
až doteď jsem potřeboval vždy na stránce vypsat přihlášenému uživateli třeba jen odkaz navíc, nyní bych však potřeboval, aby měl uživatel po přihlášení před sebou úplně jinou stránku (na které bude mít jiné menu, jehož odkazy povedou na stránky, na které by se nepřihlášený uživatel neměl dostat). Přitom bych chtěl zachovat URL, tzn. před přihlášením je na www.mujweb.cz, po přihlášení je tam stále, ale vidí něco jiného.
Můj pokus:
{if Environment::getUser()->isInRole('guest')}
Stránka před přihlášení
{include $content}
{/if}
{if Environment::getUser()->isInRole('user')}
Stránka po přihlášení
{include $content}
{/if}
Nějak cítím, že je to úplně špatně, zejména kvůli tomu, že tam mám dvakrát includovanej ten content. Jaké je správné řešení?
Děkuji moc.
Offline
#2 20. 1. 2010 0:43
- Ondřej Mirtes
- Moderator

- Místo: Praha
- Registrovaný: 8. 1. 2009
- Příspěvky: 1357
- Web
Re: Jiný obsah na stejné URL po přihlášení
V metodě actionDefault() přepneš view:
public function actionDefault() {
if ($this->getUser()->isAuthenticated()) {
$this->setView('loggedIn');
}
}
/** pro nepřihlášené **/
public function renderDefault() {
}
/** pro přihlášené **/
public function renderLoggedIn() {
}
Něco o tom je počtení zde: Action vs. View
Offline
#3 20. 1. 2010 10:44
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
Díky za odpověď, ještě jeden dotaz – jak to bude se šablonami? Mám totiž ten kód, co jsem napsal výše, v layoutu, budu mít tedy dva, nebo jak? Protože mi nestačí prohodit po přihlášení tu includovanou šablonu (Default za LoggedIn), ale potřebuju vyměnit celej ten layout.
Ještě jednou díky!
Offline
#4 20. 1. 2010 11:37
- Vyki
- Nette guru

- Místo: Liberec & Plzeň
- Registrovaný: 12. 7. 2009
- Příspěvky: 246
Re: Jiný obsah na stejné URL po přihlášení
Ja bych si asi udelal vychozi layout kam bych dal podminku, ktery layout se dale includne.
{if $logeed == "on"}
{include '../@layoutAA.phtml'}
{else}
{include '../@layoutBB.phtml'}
{/if}
Offline
#5 20. 1. 2010 11:44
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
Díky za tip, to mě nenapadlo. Pořád mi to ale příjde jako takové stavění berliček. Neexistuje ještě nějaké jiné, elegantní řešení?
Díky.
Offline
#6 20. 1. 2010 11:59
- Ondřej Mirtes
- Moderator

- Místo: Praha
- Registrovaný: 8. 1. 2009
- Příspěvky: 1357
- Web
Re: Jiný obsah na stejné URL po přihlášení
No budeš mít Default.default.phtml šablonu pro nepřihlášené a Default.loggedIn.phtml pro přihlášené. A do té druhé stačí nahoru napsat:
{extends @layout.loggedIn.phtml}
{block #content}
obsah pro přihlášené
A už se nebude ukazovat v kontextu @layout.phtml, ale právě toho layoutu
pro přihlášené. Případně, pokud by většina webu byla v tomto druhém
layoutu, tak abys nemusel do většiny šablon psát {extends
@layout.loggedIn.phtml}, tak jejich role prohodíš – šablony pro
nepřihlášené budou obsahovat {extends
@layout.notLoggedIn.phtml} a šablony pro přihlášené budou obsahovat
jen {block #content} – čímž budou @layout.phtml rozšiřovat
automaticky :)
Ty bloky jsou opravdu mocné – doporučuji shlédnout přednášku o Davida o nich.
Offline
#7 20. 1. 2010 17:05
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
Ahoj,
tak jsem se do toho trochu zamotal. Udělal jsem to jak píšeš s tím, že jsem to prohodil, protože více stránek je pod přihlášením. Nejdříve se mi zobrazovala jen prázdná stránka s pozadím a titlem (tzn. asi nešlo o žádnou zásadní chybu), tak jsem si řekl, že to možná bude starou verzí Nette, kterou používám někdy od srpna minulého roku. Stáhl jsem tedy novou, nahodil, a teď už mám jen 500 internal server error (u sebe na localhostu).. Jak z toho ven? Čím to může být?
EDIT: internal server error už nemám, nechal jsem starou verzi nette ve složce libs, jen přejmenoval, takže ten error byl tím (aplikace si tahala stejné třídy automaticky z obou složek). Nicméně problém s prázdnou stránkou přetrvává. Zkusím to trochu rozepsat. Mám presenter Content_HomePresenter, v něm:
class Content_HomePresenter extends Content_BasePresenter
{
public function actionDefault() {
$user = Environment::getUser();
if ($user->isAuthenticated()) {
$this->setView('dashboard');
}
}
public function renderDefault()
{
$this->template->title = "Title nepřihlášený";
}
public function renderDashboard() {
$this->template->title = "Title přihlášený";
}
}
Potom mám dva layouty – @layout.phtml (pro přihlášené) a @layout.notLoggedIn.phtml (pro nepřihlášené). Jednotlivé šablony jsou Home.dashboard.phtml pro přihlášené a Home.default.phtml pro nepřihlášené. Home.default.phtml má úplně nahoře:
{extends @layout.notLoggedIn.phtml}
{block #content}
Home.dashboard.phtml tam nemá nic.
Díky moc.
Editoval weckho (20. 1. 2010 17:12)
Offline
#8 20. 1. 2010 18:56
- Ondřej Mirtes
- Moderator

- Místo: Praha
- Registrovaný: 8. 1. 2009
- Příspěvky: 1357
- Web
Re: Jiný obsah na stejné URL po přihlášení
A kde máš prázdnou stránku? Po přihlášení? Funguje ti Laděnka?
Každopádně Home.dashboard.phtml musí obsahovat minimálně
{block #content}, jinak se ti ten defaultní layout nenačte :)
Offline
#9 20. 1. 2010 19:02
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
Právěže před přihlášením. Jsem normálně na titulce a mám prázdnou stránku s pozadím (který mam nastavený přes CSS) a zdroják té stránky je:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Titulek nepřihlášení</title>
<link rel="stylesheet" media="screen,projection,tv" href="/web/document_root/css/style.css" type="text/css">
</head>
<body>
</body>
</html>
Tzn. nenačte se nic, co je mezi body, což je dost zvláštní, protože alespoň část toho @layout.notLoggedIn.phtml se načte. Jinak v tom Home.dashboard.phtml už {block #content} mám.
Offline
#10 20. 1. 2010 19:04
- Ondřej Mirtes
- Moderator

- Místo: Praha
- Registrovaný: 8. 1. 2009
- Příspěvky: 1357
- Web
Re: Jiný obsah na stejné URL po přihlášení
A máš v @layout.phtml (i v tom druhém) {include #content}?
:)
Offline
#11 20. 1. 2010 19:08
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
V tom @layout.notLoggedIn.phtml jsem to měl, to je ten, co se má nyní zobrazit (před přihlášením). Do toho druhého jsem to teď doplnil a stránka hlasí (namísto prázdného pozadí) chybu:
InvalidStateException Call to undefined block ‚content‘.
Offline
#12 20. 1. 2010 19:18
- Ondřej Mirtes
- Moderator

- Místo: Praha
- Registrovaný: 8. 1. 2009
- Příspěvky: 1357
- Web
Re: Jiný obsah na stejné URL po přihlášení
To znamená, že ten {block #content} v Home.dashboard.phtml nemáš.
Fakt si pusť tu přednášku.
Offline
#13 20. 1. 2010 19:22
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
Mám ho tam, to jsem si jistej :) Přednášku jsem už viděl, děkuji za tip.
Home.dashboard.phtml
{block #content}
<h1>Logged in</h1>
{/block}
Navíc i kdybych neměl, tak je dost divný, že by to hlásilo takovou chybu, když se nyní ani nemá pracovat s Home.dashboard.phtml a @layout.phtml, když to je jen pro přihlášené (a já jsem zatím odhlášen), nebo ne?
Editoval weckho (20. 1. 2010 19:22)
Offline
#14 20. 1. 2010 19:30
- Ondřej Mirtes
- Moderator

- Místo: Praha
- Registrovaný: 8. 1. 2009
- Příspěvky: 1357
- Web
Re: Jiný obsah na stejné URL po přihlášení
Už jsme v tom nějaký zamotaný, ukaž oba layouty, obě šablony a Presenter.
Offline
#15 20. 1. 2010 19:37
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
@layout.notLoggedIn.phtml
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{$title}</title>
<link rel="stylesheet" media="screen,projection,tv" href="{$baseUri}css/style.css" type="text/css">
</head>
<body>
<div id="header">
<ul class="menu">
Menu
</ul>
</div>
<div id="content">
{include #content}
</div>
<div id="footer">
<p>Footer</p>
</div>
</body>
</html>
@layout.phtml
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{$title}</title>
<link rel="stylesheet" media="screen,projection,tv" href="{$baseUri}css/style.css" type="text/css">
</head>
<body>
{include #content}
</body>
</html>
Home.default.phtml (patří k @layout.notLoggedIn.phtml – vidí nepřihlášení)
{extends @layout.notLoggedIn.phtml}
{block #content}
Nepřihlášený.
{/block}
Home.dashboard.phtml (patří k @layout.phtml – vidí přihlášení)
{block #content}
<h1>Logged in</h1>
{/block}
Content_HomePresenter
require_once dirname(__FILE__) . '/Content_BasePresenter.php';
class Content_HomePresenter extends Content_BasePresenter
{
public function actionDefault() {
$user = Environment::getUser();
if ($user->isAuthenticated()) {
$this->setView('dashboard');
}
}
public function renderDefault()
{
$this->template->title = "Nepřihlášený";
}
public function renderDashboard() {
$this->template->title = "Přihlášený";
}
}
Díky moc.
Offline
#16 20. 1. 2010 21:01
- iguana007
- Nette guru

- Místo: Praha
- Registrovaný: 3. 11. 2009
- Příspěvky: 265
Re: Jiný obsah na stejné URL po přihlášení
no podle me by stacilo v tom Presenteru nahradit toto:
$this->setView('dashboard');
tímto:
$this->template->logged = true;
a template @layout.phtml změnit takto:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>{$title}</title>
<link rel="stylesheet" media="screen,projection,tv" href="{$baseUri}css/style.css" type="text/css">
</head>
<body>
<div id="header" n:if="!$logged">
<ul class="menu">
Menu
</ul>
</div>
<div id="content" n:if="!$logged">
{include #content}
</div>
{if $logged}
{include #content}
{/if}
<div id="footer" n:if="!$logged">
<p>Footer</p>
</div>
</body>
</html>
Editoval iguana007 (20. 1. 2010 21:01)
Omne Principium Grave
Offline
#17 21. 1. 2010 12:02
Re: Jiný obsah na stejné URL po přihlášení
Jakou máš verzi nette?
Jestli není potřeba zapnout nový vykreslovaní šablon přes
$presenter->oldLayoutMode = false;. podle tohoto v první
příspěvku: {include $content} to vypadá že máš starý
způsob vykreslování.
Offline
#18 21. 1. 2010 12:13
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
Mám teď verzi Nette Framework 0.9.2 pro PHP 5.2, včera jsem si to stáhl a aktualizoval. Ten dolárek už tam taky nemám, nahradil jsem to mřížkou.
Offline
#19 21. 1. 2010 13:22
Re: Jiný obsah na stejné URL po přihlášení
V tom případě zkontroluj jestli más Presenter::$oldLayoutMode =
false; třeba takto:
abstract class BasePresenter extends Presenter
{
public $oldLayoutMode = FALSE;
}
Editoval PetrP (21. 1. 2010 13:22)
Offline
#20 21. 1. 2010 13:30
- weckho
- Člen
- Registrovaný: 14. 7. 2009
- Příspěvky: 98
Re: Jiný obsah na stejné URL po přihlášení
Super! Jede to! Děkuji moc všem zúčastněným za pomoc :)
Offline


