Block rovnaký pre všetky šablony

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

Zdravím vás!

S nette začínam a mam otázku.

Moj web bude mať nasledovnu kostru:

<header block>
<content block>
<footer block>

Blok content bude v každej šablone iný, takže každá šablona bude mať svoj content blok. Ale blok header a footer bude na každej stránke rovnaky a blok header bude obsahovať aj uživatelské menu ktore potrebuje údaje z DB. Ako teda spraviť to aby tie dva bloky boli na každej stránke rovnaké a nemusel som ich robiť v každom presentery ?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Použij blok header a footer jen v layoutu, a vůbec je nezmiňuj v šablonách presenterů.

Danndy
Člen | 35
+
0
-

vojtech.dobes napsal(a):

Použij blok header a footer jen v layoutu, a vůbec je nezmiňuj v šablonách presenterů.

Ďakujem za odpoveď.

Keď to takto spravím, potom z ktoreho presenteru budem čerpať dáta ktore budem chcieť využiť v layoute?

duke
Člen | 650
+
0
-

@Danndy Co je společné pro všechny presentery se obvykle řeší v BasePresenteru.

Editoval duke (5. 2. 2014 12:13)

Danndy
Člen | 35
+
0
-

duke napsal(a):

@Danndy Co je společné pro všechny presentery se obvykle řeší v BasePresenteru.

Chápem, len ešte jedna vec. Ako sa v BasePresenteri pripojím na databázu aby som mohol robiť dotazy nad DB ?

duke
Člen | 650
+
0
-

Úplně stejně jako v jakémkoli jiném presenteru. Tj. injektneš si tam službu, která připojení k databázi řeší a tuto službu pak používáš v metodách presenteru. Toho lze dosáhnout několika způsoby. Ten nejsnadnější (pomocí anotace @inject) je popsán v dokumentaci zde.

Danndy
Člen | 35
+
0
-

duke napsal(a):

Úplně stejně jako v jakémkoli jiném presenteru. Tj. injektneš si tam službu, která připojení k databázi řeší a tuto službu pak používáš v metodách presenteru. Toho lze dosáhnout několika způsoby. Ten nejsnadnější (pomocí anotace @inject) je popsán v dokumentaci zde.

Dik za odpoveď.
Niečo som skúšal, ale bez úspešne. Napr. v HomepagePresenteru sa k db pojím tak ako to bolo v ukážkovom príklade z dokumentácie:

<?php
 private $database;
  public function __construct(Nette\Database\Context $database)
  {
      $this->database = $database;
  }
?>

V BasePresenteri nebolo nič a ja som tam len pridal metóru afterRender(){} a keďže je BasePresenter abstract class predpokladam že sa tam na DB nepripojim ako v HomepagePresenteri.

Mohol by si mi trocha pomocť stým kódom ako to pripojenie injektujem? Diky

Mysteria
Člen | 797
+
0
-

Normálně do BasePresenteru dej

/** @var \Nette\Database\Context @inject */
public $database;

a budeš mít databázi dostupnou v každým presenteru (který dědí od BP, samozřejmě). To, že to je abstraktní třída nevadí.

Danndy
Člen | 35
+
0
-

Mysteria napsal(a):

Normálně do BasePresenteru dej

/** @var \Nette\Database\Context @inject */
public $database;

a budeš mít databázi dostupnou v každým presenteru (který dědí od BP, samozřejmě). To, že to je abstraktní třída nevadí.

Funguje ! A pritom to bolo take jednoduché.. Ďakujem Ti moc krát :)

kejlicz
Člen | 201
+
0
-

Správně by tam mělo být protected a ne public, pokud se nepletu.

Semik
Backer | 135
+
0
-

kejlicz napsal(a):

Správně by tam mělo být protected a ne public, pokud se nepletu.

Z hlediska dědičnosti ano, ale na protected nebude fungovat injekce. Musí být public.