Načítanie menu z databázy

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

Ahojte,
potreboval by som poradiť ako v basepresentery vytiahnuť z tabulky categories názvy kategórii, z ktorých spravím v základnej šablóne menu.

Nette2.1 a na serveri beží žialbohu PHP5.3.10

Vopred ďakujem za pomoc

Jan Tvrdík
Nette guru | 2595
+
0
-

Jak přistupuješ k databází? Pomocí Nette\Database Table?

StanlieK
Člen | 28
+
0
-

Jan Tvrdík napsal(a):

Jak přistupuješ k databází? Pomocí Nette\Database Table?

Áno tak by som pristupovať chcel, len neviem ako to zrealizovať v tom basepresentery. Nakoľko v presenteroch ostatných mi táto metóda funguje, ale akonáhle sa o to pokúsim v base… tak to nefacha.

Jan Tvrdík
Nette guru | 2595
+
0
-

Můžeš poslat ukázku toho kódu, o kterém se domníváš, že by měl fungovat, ale nefunguje?

StanlieK
Člen | 28
+
0
-

Ide o to, že ja vôbec neviem ako to v tom basepresentery spraviť.

Predpokladam, ze by som mal ist cez beforerender, ale to je asi tak všetko. Doteraz som nejako nepotreboval taketo site wide vycuci z databazy.

Jan Tvrdík
Nette guru | 2595
+
0
-

Pořád nechápu tvůj problém, pokud ti v normálním presenteru funguje

public function renderFoo()
{
	$this->template->menu = $this->database->loadMenu(...);
}

Tak v BasePresenteru bude fungovat

protected function beforeRender()
{
	parent::beforeRender();
	$this->template->menu = $this->database->loadMenu(...);
}
StanlieK
Člen | 28
+
0
-

No ono mi píše nejaký problém s premmennou database. Ked dojdem dnes domov tak sem pošlem výpis z ladenky. Niekde som sa dočítal, že to je problém práve kvôli PHP5.3. No uvidíme, čo na tú chybu poviete tu.

StanlieK
Člen | 28
+
0
-

Tak toto mám v BasePresenter(i)…

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
  /** @var Nette\Database\Context */
  private $database;

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

  protected function beforeRender()
  {
    parent::beforeRender();
    $this->template->categories = $this->database->table('categories');
  }
}

A ladenka vyhadzuje túto chybu: Call to a member function table() on a non-object

Jan Tvrdík
Nette guru | 2595
+
0
-

Zřejmě si ten konstruktor přepisuješ v dceřiných presenterech.

MartinitCZ
Člen | 580
+
0
-

Zkus použít toto:

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
  /**
   * @var Nette\Database\Context
   * @inject
   */
  public $database;

  protected function beforeRender()
  {
    parent::beforeRender();
    $this->template->categories = $this->database->table('categories');
  }

}

Případně toto:

abstract class BasePresenter extends Nette\Application\UI\Presenter
{
  /**
   * @var Nette\Database\Context
   */
  private $database;

  /**
   * @param Nette\Database\Context
   */
  public function injectDatabase(Nette\Database\Context $context)
  {
	$this->database = $context;
  }

  protected function beforeRender()
  {
    parent::beforeRender();
    $this->template->categories = $this->database->table('categories');
  }

}

Vyhneš se tím tomu, co popisuje Honza.

Editoval martinit (5. 1. 2014 11:51)

vvoody
Člen | 910
+
0
-

V tvojich presenteroch zrejme nevoláš parent::__construct(). V presenteroch namiesto construktoru radšej použi inject anotácie alebo inject metódy na získavanie služieb ako je napríklad Nette\Database\Context.

StanlieK
Člen | 28
+
0
-

Ďakujem za pomoc, už to fachčí :-).