Ukládání do Session … začátečnický dotaz
- Stevie
- Člen | 18
Ahoj,
s Nette začínám. Rád bych v pár případech v aplikaci využil
ukládání proměnné do session, zatím se mi ji nepodařilo ani po delším
studio dokumentace a fóra zprovoznit. Mohl byste mi prosím někdo zkontrolovat
tento kód? Do jaké míry je vhodné řešit lokalizaci tímto způsobem
ponechme stranou…
Kód v presenteru:
protected function createComponentZmenJazyk()
{
$form = new Form();
$form->addSelect('jazyk', 'Jazyk', array(
'CZ' => 'CZ',
'EN' => 'EN'
));
$form['jazyk']->setDefaultValue('CZ');
$form->addSubmit('submit', 'Zvolit');
$form->onSuccess[] = callback($this, 'zmenJazykSubmitted');
return $form;
}
public function zmenJazykSubmitted(Form $form)
{
if($form['submit']->isSubmittedBy())
{
$values = $form->getValues();
$jazyk = $form['jazyk']->value;
$container = $this->context;
$session = $container->session;
if ($container->session->exists()) {
$session = $container->session->start();
}
$section = $this->session->getSection('jazyk');
$section->jazyk = $jazyk;
// $section['jazyk'] = $jazyk;
// $section['jazyk'] = $jazyk;
// $this->redirect('Stranka:bio');
}
}
Šablona:
{block #content}
{* <h1>{if $section['jazyk']="CZ"}O mně{else}About me{/if}</h1> *}
<h1>{if $section->jazyk="CZ"}O mně{else}About me{/if}</h1>
- 22
- Člen | 1478
nebudu se vyjadřovat k ostatnímu. ale například tahle podmínka, kde používáš operátor přiřazení místo porovnání, určitě nebude pracovat, jak si představuješ:
{if $section->jazyk="CZ"} //přiřadí do proměnné hodnotu a vrátí bool hodnotu
{if $section->jazyk === "CZ"} //porovná 2 hodnoty
- Jan Endel
- Člen | 1016
Předáváš section do šablony? Změnils podmínku jak udává 22? Potažmo si něco zkus nastudovat o Lokalizaci poněvadž takhle by ses vážně upsal.
Editoval pilec (11. 2. 2012 12:17)
- Tomáš Votruba
- Moderator | 1114
Jestli to chápu dobře, chceš uložit zvolený jazyk a podle něj
vykreslovat příslušnou lokalizaci.
Nemusíš vytvářet cache či session, bohatě na to stačí identita,
kterou má i nepřihlášený uživatel (jako guest
).
Identita
Identita ($user->identity
) je vlastně session. Je všude
přístupná a hodí se právě pro přenos informací o daném uživateli.
public function changeLanguage(Form $form)
{
$values = $form->getValues(TRUE);
// přiřadíš odeslaný jazyk proměnné $lang
$this->user->identity->lang = $values["lang"];
}
V presenteru pak používáš:
// inicializace
$lang = "cs"; // defaultní jazyk
if($this->user->identity->lang) { // pokud je jazyk nastaven v identitě, přiřadíme ho
$lang = $this->user->identity->lang;
}
else { // jinak identitě nastavíme deafultní, aby nám to šlapalo v šabloně (viz níže)
$this->user->identity->lang = $lang;
}
V šabloně pak:
{if $user->identity->lang == "cs"}
Vítejte na mé stránce.
{elseif $user->identity->lang == "en"} <!-- pokud máš jen 2 jazyky, stačí else -->
Welcome to my page.
{/if}
<!-- což je otrava, že? s NetteTranslatorem to bude vypadat takto -->
{_"Vítejte na mé stránce."}
Překlady
Doporučuji použít nastavení jazyka do identity + NetteTranslator.
Návod je v Kuchařce (včetně odkazů na důležité témata), takže je to fakt hračka :)
Editoval Schmutzka (11. 2. 2012 14:06)
- Stevie
- Člen | 18
Díky moc všem, všechno projdu. Automatické překlady ale pro tentokrát nechci, nikdy to nefunguje stoprocentně (rozhodně ne na jakékoli delší texty, samozřejmě záleží na charekteru stránek, pro názvy formulářových polí apod. je to asi v pohodě). Ale určitě si ten Translator někde vyzkouším.
Ty session si ale potřebuju vyzkoušet i pro jiné případy. Do šablony jsem si ji tedy předal, nicméně se mi momentálně nedaří změnit její hodnotu, v $section->jazyk zůstalo po prvním odeslání formuláře trvale „CZ“ (kód formuláře a submitu formuláře víceméně stejný jako nahoře). Stále nevím kde může být problém?
- Tomáš Votruba
- Moderator | 1114
Stevie napsal(a):
Aha. Tak to jo, určitě to teda vyzkouším. Díky moc za tip.
Super, pak se pochlub, jak jsi dopadl. Zajímá mne, jak moc je to pochopitelné.