Cizojazyčné stránky – persistentní parametr

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

Zdravím, na základě této diskus https://forum.nette.org/…ejazycny-web chci zprovoznit jazykové mutace. Problém mám však s tím, že se mi nepředává v url persistentní parametr. Postupoval jsem dle https://forum.nette.org/…ejazycny-web#…

ale zobrazuje se mi chyba

Declaration of BasePresenter::startup() should be compatible with Nette\Application\UI\Presenter::startup()
enumag
Člen | 2118
+
0
-

Dle chyby má tvá metoda startup v BasePresenteru nějaký parametr, což je nesmysl. Možná to tak bylo dříve ale perzistentní parametry se teď dělají přes public vlastnosti (asi takhle). Podívej se do dokumentace presenterů. ;-)

Editoval enumag (30. 12. 2012 21:46)

Taps
Člen | 169
+
0
-

@enumag: chybu vyvolává parametr ve startupu

function startup($lang)   //parametr $lang ti Nette předá automaticky, protože i v routě se jmenuje `lang`
{
    parent::startup();
    $this->lang = $lang;
}

Ale nevím jak ho jinak předávat.

Jan Mikeš
Člen | 771
+
0
-
/** @persistent string */
public $lang;

A ve startupu nemusis nic resit :)

Tomáš Votruba
Moderator | 1114
+
0
-

Možná ti pomůže návod na Nette Translator

Taps
Člen | 169
+
0
-

@Schmutzka
Díky za tip.

Ještě řeším problém s tím, že pokud mám adresu www.neco.cz/fotoalba/deti, tak mi do šablony nepřijde proměnná, kterou odesílám z presenteru. Pokud mám adresu jen www.neco.cz/fotoalba, tak vše funguje v pořádku. Problém bude asi ve vyznačeném řádku, ale nevím jak tento problém vyřešit

V BasePresenteru mám toto

abstract class BasePresenter extends Nette\Application\UI\Presenter
{

/** @persistent */
public $lang;



protected function beforeRender()
	{

**$this->setView( $this->lang . '/' .$this->action );**
}

}

routování mám nastaveno takto

$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);

$container->router[] = new Route('[<lang cs|en>/]fotogalerie/<slozka>',array(
    'lang' => 'cs',
    'presenter' => 'Fotoalba',
    'action' => 'default',
));

$container->router[] = new Route('[<lang cs|en>/]<presenter>/<action>', array(
    'lang' => 'cs',
    'presenter' => 'Homepage',
    'action' => 'default',
));

Editoval Taps (31. 12. 2012 10:08)

Jan Mikeš
Člen | 771
+
0
-

Do sablony si promennou sammozrejme musis predat. Nevim presne kterou promennou chces, ale napr pro lang:

protected function beforeRender()
{
	$this->setView( $this->lang . '/' .$this->action );
	$this->template->lang = $this->lang;
}
Taps
Člen | 169
+
0
-

@Lexi
samozřejmě že předávám proměnnou z presenteru do šablony, viz níže

FotoalbaPresenter

<?php



class FotoalbaPresenter extends BasePresenter
{


public function renderDefault($slozka)
    {

        $this->template->images =  Nette\Utils\Finder::findFiles('*.jpg')->in(WWW_DIR. '/foto/'. $slozka);

    }

}

default.latte

 {block content}
<div class="obsah">

    <div class="content">
         <div id="galleria">
         {foreach $images as $image}
           <a href="{$basePath}/foto/{$slozka}/{$image->getFilename()}">
<img src="{$basePath}/foto/{$slozka}/{$image->getFilename()}" />
    </a>
    {/foreach}
        </div>
    </div>


      </div>
      {/block}

šablonu mám umístěnou v /templates/Fotoalba/cs/default.latte

Vypisuje se mi

Notice Undefined variable: images

Editoval Taps (31. 12. 2012 15:54)

Badaboom
Člen | 33
+
0
-

Když nastavíš view na cs/default, proč očekáváš proměnnou, kterou jsi nastavil pro view default?

Taps
Člen | 169
+
0
-

@Badaboom
Můžeš mi tedy dát nějaký tip jak daný problém vyřešit ?

Badaboom
Člen | 33
+
0
-

Podívej se na životní cyklus presenteru

Pro naplnění můžeš použít metodu action<Action>.

Taps
Člen | 169
+
0
-

Vždyt <action> tam mám. Odkaz mám ve tvaru

<a n:href="Fotoalba:default portrety" id="galerie">

Editoval Taps (1. 1. 2013 19:31)

Badaboom
Člen | 33
+
0
-
public function actionDefault($slozka) {...}

Action != view. V metodě renderDefault plníš view default. V metodě actionDefault ještě neplníš konkrétní view. Normálně framework zavolá view stejného jména jako je action. Ty to view ale v beforeRender měníš.

Editoval Badaboom (1. 1. 2013 19:57)

Taps
Člen | 169
+
0
-

Badaboom
Moc díky