podmínka v latte – dle cookie něco vypsat

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

Předně se omlouvám za takovýto dotaz, rád bych se Nette jednou naučil, bohužel teď na to nemám prostor (musím se věnovat jiným projektům), ale dostal jsem za úkol udělat jednoduchou úpravu v jednom webu napsaném v Nette:

Pokud v nějaké cookie je jeden řetězec, na jednom místě webu se má vypisovat něco jiného. Ten řetězec jsem našel v jednom latte souboru.
Takže bych potřeboval poradit, jak v .latte souboru udělat podmínku:

if (nějaká cookie obsahuje něco), tak {vypiš aaabbb} else { vypiš cccdd }

Asi celkem jednoduchá věc, bohužel bez detailnějšího studia frameworku to nejsem schopný udělat, proto prosím bylo by možné mi pomoct, abych to dokázal upravit?

nanuqcz
Člen | 822
+
0
-
{if @$_COOKIE['foo'] == 'bar'}
    aaabbb
{else}
    cccdd
{/if}

Čistý způsob to asi nebude, ale bude to fungovat.

P.S. Docela by mě zajímalo, jestli na tohle nějaký „čistý způsob“ v Nette je? Nette nabízí třídy pro práci se sessions, ale pro cookies o ničem nevím. Tak nevím, jestli není návrhově špatné sahat si přímo do cookies? :-)

David Matějka
Moderator | 6445
+
0
-

nejcistejc je to asi pres Nette\Http\Request metodu getCookie
takze v presenteru

public function renderFoo()
{
	$this->template->showBar = $this->request->getCookie('foo')=='bar';
}

a v latte akorat

{if $showBar}
...
{else}
...
{/if}

EDIT:
pripadne bez zasahovani do presenteru a pouziti primo v sablone bude asi lepsi nez

{if @$_COOKIE['foo'] == 'bar'}

tohle

{if $presenter->request->getCookie('foo') == 'bar'}

Editoval matej21 (27. 6. 2013 12:50)

H0w4rd
Člen | 96
+
0
-

Děkuji moc, ten první způsob je funkční. Do prezenterů se zatím pouštět nebudu, nevím, jak fungují a už vůbec nevím, jestli by ta funkce renderFoo() mohla být někde jen na jednom místě, nebo by se musela opakovat v různých prezenterech.

enumag
Člen | 2118
+
0
-

@H0w4rd: Moc se mi to nelíbí, ale na jednom místě by tén kód mohl být v metodě BasePresenter::beforeRender().

H0w4rd
Člen | 96
+
0
-

OK, možná se to bude někomu hodit, jak by mělo vypadat čisté řešení?

Abych trochu přiblížil, o co mi jde – na jednom webu je natvrdo v latte souborech zadáno telefonní číslo (asi na 30 místech) a zákazník chce, když v cookies je určitá hodnota, tak aby všude bylo jiné telefonní číslo.
Napsal jsem phone.latte s tou podmínkou a pak projdu všechny latte s telefony a nahradím je includem toho phone.latte. Tohle je nejjednodušší řešení.

Ještě bych vlastně potřeboval, abych všude mohl mít stejný příkaz, tzn. absolutní cestu v includu, nebo aspoň relativní od kořene, na to jsem taky nepřišel, ale to už je detail, prostě někde bude
{include ‚../../phone.latte‘} a někde třeba {include ‚../../../../phone.latte‘}

Editoval H0w4rd (28. 6. 2013 9:13)

Glottis
Člen | 129
+
0
-

no nevim … bych spis si do $template->telefon v basePresenteru priradil podle kukiny to spravne cislo a v sablonach to pak jen pouzil a vyprnul se na nejake include

H0w4rd
Člen | 96
+
0
-

OK, při studiu, jak udělat původní zamýšlené řešení, jsem se „omylem“ naučil Nette víc, než jsem chtěl a holt to tedy udělám trochu lepším způsobem :-)

BasePresenterustartup() dám nastavení $this->template->phoneNumber podle cookie.
A potom v latte souborech budu pouze vypisovat {$phoneNumber}.

Děkuji za pomoc.

Editoval H0w4rd (28. 6. 2013 14:07)

enumag
Člen | 2118
+
0
-

@H0w4rd: To už je lepší ta metoda beforeRender než startup. Je nějaký důvod proč používáš cookie a ne session?

H0w4rd
Člen | 96
+
0
-

Se session jsem měl vždycky jenom problémy a proto už mnoho let používám pouze cookies. Dokonce ani v tomhle Nette-webu se session nepoužívá.