Jiný obsah na stejné URL po přihlášení

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

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
+
0
-

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
+
0
-

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!

Vyki
Člen | 388
+
0
-

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}
weckho
Člen | 94
+
0
-

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.

Ondřej Mirtes
Člen | 1536
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

A máš v @layout.phtml (i v tom druhém) {include #content}? :)

weckho
Člen | 94
+
0
-

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‘.

Ondřej Mirtes
Člen | 1536
+
0
-

To znamená, že ten {block #content} v Home.dashboard.phtml nemáš.

Fakt si pusť tu přednášku.

weckho
Člen | 94
+
0
-

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)

Ondřej Mirtes
Člen | 1536
+
0
-

Už jsme v tom nějaký zamotaný, ukaž oba layouty, obě šablony a Presenter.

weckho
Člen | 94
+
0
-

@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
+
0
-

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)

PetrP
Člen | 587
+
0
-

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í.

weckho
Člen | 94
+
0
-

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.

PetrP
Člen | 587
+
0
-

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)

weckho
Člen | 94
+
0
-

Super! Jede to! Děkuji moc všem zúčastněným za pomoc :)