Jiný obsah na stejné URL po přihlášení
- weckho
- Člen | 94
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.
- Ondřej Mirtes
- Člen | 1536
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
- weckho
- Člen | 94
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!
- Ondřej Mirtes
- Člen | 1536
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.
- weckho
- Člen | 94
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)
- Ondřej Mirtes
- Člen | 1536
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 :)
- weckho
- Člen | 94
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.
- Ondřej Mirtes
- Člen | 1536
To znamená, že ten {block #content} v Home.dashboard.phtml nemáš.
Fakt si pusť tu přednášku.
- weckho
- Člen | 94
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)
- weckho
- Člen | 94
@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.
- iguana007
- Člen | 970
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)