Jak nejlépe dostat do šablony seznam jazyků

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

Podle dokumentace jsem udělal presenteru perzistentní parametr, kterým se předává jazyk. To mi funguje dobře, když si zatím url zadávám ručně. Nevím jak nejlépe dostat do šablony seznam všech jazyků, aby se tam v navigaci objevily a dalo se mezi nimi přepínat – seznam budu načítat z databáze.

Michal Hlávka
Člen | 190
+
+1
-

Presenter

$this->template->languages = $this->languageRepository->fetchAll();

Latte

{foreach $languages as $lang}
	<li>{$lang->slug}</li>
{/foreach}

for example
Oli
Člen | 1215
+
+1
-

Jen dodám, že v tom presenteru to volej v beforeRenderBasePresenter|FrontendPresenter

protected function beforeRender() {
	$this->template->languages = $this->languageRepository->fetchAll();
	parent::beforeRender();
}

A languageRepository si můžeš předat přes @inject anotaci nebo injectMethod().

Michal Hlávka
Člen | 190
+
0
-

Oli napsal(a):

Jen dodám, že v tom presenteru to volej v beforeRenderBasePresenter|FrontendPresenter

protected function beforeRender() {
	$this->template->languages = $this->languageRepository->fetchAll();
	parent::beforeRender();
}

A languageRepository si můžeš předat přes @inject anotaci nebo injectMethod().

Jak si muzes byt tak jist, ze ten vypis jazyku bude mit napric aplikaci?

Oli
Člen | 1215
+
+1
-

@emptywall ty mas prepinani jazyku jen na homepage? ;-)

Mirek
Člen | 86
+
0
-

Díky, s latte problém nemám, snažím se udělat tu třídu languageRepository a mám problém s připojením k databázi.
Laděnka mi hází chybu:
Unknown configuration option database.default.default.
v config.neom mám toto (už jsem toho spoustu zaremoval)

database:
  default:
    dsn:          "mysql:host=mysql;dbname=web-new"
    user:         "user"
    password:     "pass"
#        options:      [PDO::MYSQL_ATTR_COMPRESS = true]
#        debugger:     true        # panel v debugger baru
#        explain:      true        # explain dotazů v debugger bar
#        conventions:  discovered  # nebo static nebo vaší jméno třídy, výchozí je discovered
#        autowired:    true

konfiguraci jsem opsal z https://doc.nette.org/cs/database#…

Michal Hlávka
Člen | 190
+
0
-

Oli napsal(a):

@emptywall ty mas prepinani jazyku jen na homepage? ;-)

Ja osobne ne, ale par webu jsem takhle uz videl, jinak bych ten komentar nepsal :)

CZechBoY
Člen | 3608
+
0
-

@Mirek nemáš konfiguraci databáze ještě v config.local.neon? (tam taky konfigurace db patří)

Mirek
Člen | 86
+
0
-

@CZechBoY díky – ano, byla tam nějaká ukázková konfigurace, takže jsem tedy konfiguraci databáze přendal do config.local.neon

Mirek
Člen | 86
+
0
-

@Oli – díky, tohle přesně jsem potřeboval

Mirek
Člen | 86
+
0
-

Pomocí @inject mi to fungovalo, ale když jsem se začetl do možností předávání závislostí, tak se snažím to předělat na předání v konstruktoru a nějak mi to nejde.
Mám chybu Service ‚application.1‘: Class App\Presenters\StatRepository needed by App\Presenters\BasePresenter::__construct() not found. Check type hint and ‚use‘ statements.
Zde je můj basePresenter :

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
  private $StatRepository;

  public function __construct(StatRepository $StatRepository1)
  {
    $this->StatRepository = $StatRepository1;
  }

  protected function beforeRender()
  {
    $this->template->staty = $this->StatRepository->najdiVsechny();
    parent::beforeRender();
  }

}

taky nevím, jestli v tom konstruktoru není potřeba volat ji rodičovský konstruktor

A v modelu mám vytvořenou třídu StatRepository která má metodu najdiVsechny a config.neon mám
App\Model\StatRepository
CZechBoY
Člen | 3608
+
0
-

Do Base trid je lepsi predavat zavislosti mimo konstruktor – vyhnes se tak velkemu mnozstvi v potomcich a constructor hell.
Pouzij inject metody, pro me je to pochopitelny, cisty a potomci nemaj pristup k zavislostem Base tridy (pokud nedas protected promennou).

nightfish
Člen | 519
+
+1
-

Mám chybu Service ‚application.1‘: Class App\Presenters\StatRepository needed by App\Presenters\BasePresenter::__construct() not found. Check type hint and ‚use‘ statements.

BasePresenter máš v namespace App\Presenter. Když v něm napíšeš StatRepository, tak to znamená App\Presenter\StatRepository. A ty místo toho potřebuješ App\Model\StatRepository, takže musíš změnit signaturu konstruktoru na

public function __construct(\App\Model\StatRepository $StatRepository1)

a nebo použít

use App\Model\StatRepository;

taky nevím, jestli v tom konstruktoru není potřeba volat ji rodičovský konstruktor

Ano.

Jinak to co psal @CZechBoY o předávání závislostí do předko-presenterů samozřejmě platí.

Editoval nightfish (19. 9. 2016 21:16)

Mirek
Člen | 86
+
0
-

@nightfish díky za vysvětlení, já si té nesrovnalosti v namespacech v té chybové hlášce nevšimnul.

Mirek
Člen | 86
+
0
-

Teď jsem narazil na další problém
V šabloně mám proměnnou $stat_vybrany=array($stat=‚cz‘, $stat_nazev=‚česko‘)
a snažím se udělat odkaz na presenter Obsah:default s definovaným státem v perzistentním parametru stat

<a n:href="Obsah:default stat => {$stat_vybrany->stat}">{$stat_vybrany->stat_nazev}</a>

a laděnka mi na tomto odkazu hází chybu syntax error, unexpected ‚{‘ jak to přepsat, aby se vytvořil odkaz <a n:href="Obsah:default stat ⇒ cz> kde to cz se vezme z proměnné $stat_vybrany->stat.

Editoval Mirek (20. 9. 2016 10:07)

abc
Člen | 92
+
+1
-

V n:href makru smaž ty závorky {}

Mirek
Člen | 86
+
0
-

Díky, to mě taky mohlo napadnout…