#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

PetrP
Moderator
Místo: Praha
Registrovaný: 15. 7. 2008
Příspěvky: 610
Web

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

PetrP
Moderator
Místo: Praha
Registrovaný: 15. 7. 2008
Příspěvky: 610
Web

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

 

Zápatí