Jak zachovat stejný jazyk v odkazech po jejich rozkliknutí

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

Zdravím všechny ještě jednou,
mám web vytvoření v PHP 5.2.
Jde o problém, že mám vytvořené odkazy pro jazyky v češtině, angličtině a ruštině.
Kliknu v MENU na odkazy v češtině a zobrazí se mi texty i fotky v pořádku.
Když kliknu na angličtinu, tak najede MENU v angličtině, sem je to vše v pořádku.
Ale kliknu na odkazy v angličtině, na anglické texty, tak mi naskočí MENU v češtině a fotku se nezobrazí vůbec!
Potřebuji, když kliknu na angličtinu i ruštinu, aby zůstalo vždy menu v tom daném jazyce a zobrazily se fotky.
Prosím o radu a pomoc. Netuším, proč mi to dělá chybu. V databázi mám vytvoření sloupec v tabulce lang.
Pokud je potřeba zaslat jakýkoliv další kód, rád jej zašlu.

Posílám i odkaz na stránku, na které, když kliknete na odkazy vytvořené pod EN i RU v MENU s názvem Události, tak se zobrazí MENU zase jen v češtině a bez fotek. http://www.fiamoli.cz/udalosti/en/

Prosím o napsání konkrétního příkladu.

Presenter Udalosti:

<?php
class UdalostiPresenter extends HomepagePresenter
{
    public $udalostiModel;

    public function actionDefault($lang, $id)
    {
        $this->udalostiModel = new UdalostiModel('udalosti', 'id');

    }

    public function renderDefault($lang, $id)
    {


        $this->lang = $lang;
        $this->template->lang = $this->lang;
        $this->template->udalosti = $this->udalostiModel->getDataSource()->where('lang=%s', $this->lang)->fetchAll();
    }
?>

Presenter Udalost:

<?php
class UdalostPresenter extends HomepagePresenter
{
    public $udalostiModel;

    public function actionDefault($lang, $id)
    {
        $this->udalostiModel = new UdalostiModel('udalosti', 'id');
    }

    public function renderDefault($lang, $id)
    {
      $this->lang = $lang;
      $this->template->lang = $this->lang;
      $data = $this->udalostiModel->getDataSource()->fetchAll();

      foreach ($data as $d) {
        if (NString::webalize($d->nazev) == $this->presenter->params['id']) {
          //Debugger::dump($d->id);
          $item = $d;
          break;
        }
      }

      $this->template->nazev = $item->nazev;
      $this->template->datum = $item->datum;
      $this->template->teritorium = $item->teritorium;
      $this->template->popis = $item->popis;
      $this->template->folder = $item->folder;

      $this->template->fotky = $this->udalostiModel->getPhotos($item->id);

    }

    }
?>

Děkuji mockrát za pomoc.

Editoval Vozman (25. 2. 2013 15:21)

Vozman
Člen | 16
+
0
-

Děkuji za rady, kam přesně mám persistenci přiřadit?
Díky moc.

enumag
Člen | 2118
+
0
-

$lang má být perzistentní parametr.

redhead
Člen | 1313
+
0
-

Zruš všechny $lang parametry z action/render metod a udělej třídní public proměnnou $lang s anotací @persistent.

Vozman
Člen | 16
+
0
-

Děkuji mockrát za radu, už to funguje.

Ještě prosím o radu. Proč se fotky zobrazují pouze v UDÁLOSTECH v češtině, ale v EN, ani RU ne???

Prosím o vypsání kódu. Děkuji.

Presenter Udalosti:

<?php
class UdalostiPresenter extends HomepagePresenter
{
    public $udalostiModel;

    public function actionDefault($lang, $id)
    {
        $this->udalostiModel = new UdalostiModel('udalosti', 'id');

    }

    public function renderDefault($lang, $id)
    {


        $this->lang = $lang;
        $this->template->lang = $this->lang;
        $this->template->udalosti = $this->udalostiModel->getDataSource()->where('lang=%s', $this->lang)->fetchAll();

    }
} ?>

Presenter Udalost:

<?php
class UdalostPresenter extends HomepagePresenter
{
    public $udalostiModel;

    public function actionDefault($lang, $id)
    {
        $this->udalostiModel = new UdalostiModel('udalosti', 'id');
    }

    public function renderDefault($lang, $id)
    {
      $this->lang = $lang;
      $this->template->lang = $this->lang;
      $data = $this->udalostiModel->getDataSource()->fetchAll();

      foreach ($data as $d) {
        if (NString::webalize($d->nazev) == $this->presenter->params['id']) {
          //Debugger::dump($d->id);
          $item = $d;
          break;
        }
      }

      $this->template->nazev = $item->nazev;
      $this->template->datum = $item->datum;
      $this->template->teritorium = $item->teritorium;
      $this->template->popis = $item->popis;
      $this->template->folder = $item->folder;

      $this->template->fotky = $this->udalostiModel->getPhotos($item->id);

    }

    }
?>
enumag
Člen | 2118
+
0
-

To bude spíš problém šablony než presenteru. To nezobrazování fotek zřejmě myslíš tak že <img> tagy tam jsou vždy, ale obrázky se někdy nenačtou – v tom případě porovnej URL z funkční a nefunkční jazykové mutace.

Editoval enumag (26. 2. 2013 16:50)

Vozman
Člen | 16
+
0
-

Obrázky – fotky se načtou jen pod odkazem v češtině, ale v odkazech EN a RU se nezobrazí vůbec nic.
Posílám šablony k nahlédnutí.
Prosím o rady, co opravit, nebo zda může být chyba pak v nastavení v databázi??
Děkuji za rady.

UDÁLOSTI:

<?php
block content}

<div id="main">

  <div id="udalosti-list">
    {foreach $udalosti as $u}
    <div class="udalosti-list-c1">
      {$u->datum}
    </div>
    <div class="udalosti-list-c2">
      {$u->teritorium}
    </div>
    <div class="udalosti-list-c3">
      <a href="{plink Udalost:, id=>NString::webalize($u->nazev)}">{$u->nazev}</a>


    </div>

    <br/>
    {/foreach}
  </div>


</div> ?>



UDÁLOST:
<?php
{block content}

<script>

$(document).ready(function() {


	$("a#grouped_elements").fancybox({
		'transitionIn'	:	'elastic',
		'transitionOut'	:	'elastic',
		'speedIn'		:	600,
		'speedOut'		:	200,
		'overlayShow'	:	true
	});

});

</script>

<div id="main">

  <div id="udalost-detail">

    <h2>{$nazev} – {$datum}</h2>

    <p>{$popis}</p>

    <div id="galerie">
      {foreach $fotky as $f}
        <a id="grouped_elements" rel="group" href="{$basePath}/images/udalosti/{$folder}/{$f->file}"><img src="{$basePath}/images/udalosti/{$folder}/_{$f->file}" width="150px" /></a>
      {/foreach}
    </div>


    <p><a href="{plink Udalosti:, $lang}">Zpět na předhled událostí</a></p>


    </div>


</div>

?>

Editoval Vozman (28. 2. 2013 21:54)

Vozman
Člen | 16
+
0
-

Prosím o rady. Děkuji předem.

hAssassin
Člen | 293
+
0
-

oznac si property s jazykem kterou mas nekde v base presenteru jako persistentni:

/** @persistent */
public $lang = 'cs';

Musi byt public! Pripadne si ji muzes pridat i do routy pro jeste jeste hezci URL :)

Vozman
Člen | 16
+
0
-

Jazyk mám již v pořádku.
Prosím ještě o radu ohledně zobrazení fotografií, jak jsem uvedl výše.
Zda je chyba v šabloně, či je možnost chyby v databázi?

Děkuji za rady.

frosty22
Člen | 373
+
0
-

Jak píše nahoře enumag k debugování by se spíše hodila vygenerovaná šablona, tj. hlavně tedy ony cesty v src u img. A zároveň se na tu cestu podívej a jistě tě napadne, kde bude chyba, jelikož tedy cesta nebude platná.

enumag
Člen | 2118
+
0
-

Taky bych v šabloně zkusil {dump $fotky} – buď v té promněnné nic neni nebo je chyba v šabloně.

Vozman
Člen | 16
+
0
-

Ahojte,
tak jsem zkoušel vložit {dump $fotky} do šablony, ale bohužel mi to nefunguje.
Prosím ještě o konkrétní radu a kódy, či postup.
Děkuji předem mockrát.

Tabetha
Člen | 140
+
0
-

nefunguje, ako že sa ti ten dump nezobrazil?

Vozman
Člen | 16
+
0
-

Ano, nezobrazil se.
V databázi jsem zjistil, že se fotky zobrazují podle ID, ale fotky jsou vidět jen v češtině.
Když zadám ID u jiných jazyků, tak se zobrazí i v EN i RU, ale pak již nejsou vidět v češtině.
Tak prosím o radu, jak nastavit v šabloně, ať se zobrazují fotky dle ID ve všech jazycích.
http://www.fiamoli.cz/udalosti/en/

Děkuji moc za rady.

David Matějka
Moderator | 6445
+
0
-

1. pokud dumpujes v sablone, tak se dump nezobrazi primo do stranky, ale do debug baru
2.

foreach ($data as $d) {
        if (NString::webalize($d->nazev) == $this->presenter->params['id']) {
          //Debugger::dump($d->id);
          $item = $d;
          break;
        }
      }

je hodne wtf kod…
3. imho bude problem v navrhu databaze, fotky jsou asi navazany na udalost a kazda udalost ma vlastni zaznam v kazdem jazyce, ze (tzn. udalosti v jednotlivych jazycich mezi sebou nemaji zadny propojeni a fotky jsou navazany jen na tu ceskou udalost)? muzes sem hodit dump databaze?

enumag
Člen | 2118
+
0
-

Proměnná $id se všeobecně považuje za kladný integer, dle kódu na který nyní upozornil @matej21 to ale v tvém případě je spíše slug. Navíc je krajně nevhodné procházet všechny záznamy a hledat mezi nimi ten jehož slug odpovídá. Slug bys měl mít uložený v databázi s unique constraintem a vyhledávat podle něj přímo.

Pro tebe jako začátečníka bude lepší předávat do presenteru $slug. Což tak nyní máš, ale přejmenuj to. A rozhodně změň to hledání konkrétní entity jak píšu výše. V praxi se slug v routách většinou převádí na id pomocí FILTER_IN a FILTER_OUT, protože presenter by neměl vědět nic o tvaru url – nezajímá ho zda se tam používá slug, měl by vždy pracovat s id. To si ale raději nech na později.

Je sice fakt, že mé presentery s id zásadně nepracují a jako parametry používám přímo entity, ale to už je trochu hard-core technika a je s tím dost problémů pokud to nemáš dobře vyřešené. Časem na to vydám addon.

Editoval enumag (5. 3. 2013 21:40)

Vozman
Člen | 16
+
0
-

Díky všem za rady. Přiznám se, že jsem dump nikdy nedělal, tak přesně nevím jak s tím pracovat.
Prosím enumag, jestli je možné napsat konkrétní kód, který bych mohl přidat do šablony a presenteru?
Jak mám změnit hledání konkrétní entity?
Děkuji.

Editoval Vozman (6. 3. 2013 0:26)

enumag
Člen | 2118
+
0
-

Máš tam spoustu začátečnických neduhů, kvůli kterým se poněkud špatně radí – nikdo neví co všechno tam můžeš mít špatně (na tom není nic špatného, každý tak nějak začínal). Tzn. nejdříve si oprav ty kardinální chyby o kterých mluvíme a pokud to stále nebude fungovat, dej sem aktuální kód. Máš tam někde nějakou blbůstku ale takhle ti asi nikdo neřekne jakou – navíc může být i mimo kódy které jsi zde postnul.

Dump je totéž jako var_export, jen s přehlednějším výstupem. Všimni si toho panelu který Nette dává doprava dolů v development režimu. Pomocí metody barDump se ti tam objeví sekce s takto dumpnutými proměnnými. Název je samozřejmě poněkud dlouhý takže doporučuji použít nějakou zkratku.

EDIT: Pozn. to latte makro {dump $var} nedělá nic jiného než že zavolá výše zmíněnou metodu Debugger::barDump($var).

Editoval enumag (6. 3. 2013 0:16)

Vozman
Člen | 16
+
0
-

Díky enumag za rady, jen mi prosím ještě písni, jak změnit entity?
Pokud možno pomocí kódu.
Díky moc.

enumag
Člen | 2118
+
0
-

Nerozumím dotazu… :-(

Vozman
Člen | 16
+
0
-

Jak jsi mipsal tohle – Což tak nyní máš, ale přejmenuj to. A rozhodně změň to hledání konkrétní entity jak píšu výše. Jak to mám prosím změnit?
Díky moc.

enumag
Člen | 2118
+
0
-

Jo tohle… moje představa je asi taková:

	public function renderDefault($slug)
	{
		$udalost = $this->udalostiModel->fetchOneBySlug($slug);
		//...
	}
Vozman
Člen | 16
+
0
-

Díky za radu, zkusím to a pak se ozvu.
Zatím díky moc, snad to již půjde.

Vozman
Člen | 16
+
0
-

Ahojte, tak jsem zkoušel ten slug, ale bohužel to nefunguje:-(

Posílám tedy ten dump z UdalostPresenter:

<?php
foreach ($data as $d) {
        if (NString::webalize($d->nazev) == $this->presenter->params['id']) {
          //Debugger::dump($d->id);
          $item = $d;
          break;
?>

Díky za rady.

Editoval Vozman (9. 3. 2013 13:56)

enumag
Člen | 2118
+
0
-

Snažil jsem se ti vysvětlit, že máš z modelu načíst přímo ten záznam dle slugu. Tento foreach prohledává všechny záznamy po jednom což je úplný nesmysl, smaž ho.

Vozman
Člen | 16
+
0
-

Ahoj, zkoušel jsem to a smazal jsem, ale nejde mi to.
Asi dělám někde chybu.

enumag
Člen | 2118
+
0
-

Určitě… prošel sis pořádně příklady? Také tam dost nesmyslně vytváříš ten model, měl by ses podívat do dokumentace.