Výpis údajov z databazy, Undefined variable: sidebars
- kasiopia
- Člen | 69
Dobrý deň chcel by som spýtať: vypísal som údaje z databázy v sablone
<div id="sidebar">
{foreach $sidebars as $sidebar}
<h2>{$sidebar->title}</h2>
<div>{$sidebar->content}</div>
{/foreach}
</div>
<div id="content">
{foreach $articles as $article}
<h2>{$article->title}</h2>
<div>{$article->content}</div>
{/foreach}
</div>
a v presentéru
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderDefault()
{
$this->template->articles = $this->database->table('clanok1');
$this->template->sidebars = $this->database->table('sidebar1');
}
všetko funguje ale ked chcem vypisať tie iste udaje na inej stránke napríklad kontakt vypíše mi chybu Undefined variable: sidebars čo mám editovať ďakujem za radu
- filipsedivy
- Člen | 37
Musíš ten kód dát do BasePresenteru a ostatní presentery by měli dědit od BasePresenteru.
- kasiopia
- Člen | 69
Dobrý deň kód som pridal ale bez zmeny stale mi vypisuje Undefined variable: sidebars kliknutím na inú stránku
<?php
namespace App\Presenters;
use Nette;
use App\Model;
/**
* Base presenter for all application presenters.
*/
abstract class BasePresenter extends Nette\Application\UI\Presenter
{
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function renderDefault()
{
$this->template->articles = $this->database->table('clanok1');
$this->template->sidebars = $this->database->table('sidebar1');
}
}
- filipsedivy
- Člen | 37
Ale tady to vypadá že pomocí presenteru taháš context databáze, což by bylo lepší práci s databází převést pod model, a v presenteru jen si vytáhnout data z modelu.
- dj.kure
- Člen | 70
Já to dělám takhle (příklad):
v config.neon zaregistruji novou službu / model:
services:
- App\Model\MujModel
Ve složce Model vytvořím PHP soubor s názvem MujModel.php s následujícím obsahem:
<?php
namespace App\Model;
use Nette;
/**
* Tento model obsluhuje XYZ.
*/
class MujModel
{
/** @var Nette\Database\Context */
private $database;
public function __construct(Nette\Database\Context $database)
{
$this->database = $database;
}
public function vypisZTabulky($tabulka)
{
$q = $this->database->table($tabulka)->fetchAll();
return $q;
}
A pak v daném presenteru (tam, kde s modelem budu chtít pracovat) udělám jen toto:
class HomepagePresenter extends BasePresenter
{
/** @var \App\Model\MujModel @inject */
private $mujmodel;
public function __construct(\App\Model\MujModel $mujmodel)
{
$this->mujmodel = $mujmodel;
}
Tím získám přístup do modelu MujModel a pak už stačí jen předat potřebná data šabloně (příklad):
public function renderDefault()
{
$this->template->tabulka = $this->mujmodel->vypisZTabulky('tabulka');
}
Je to jen příklad, není v něm žádné ošetření a další věci. Dále bych rád upozornil, že s Nette nepracuji dlouho a nejsem žádný velký programátor, takže určitě by to šlo udělat lépe, snáze, či jinak.
Snad to pomůže.
- David Matějka
- Moderator | 6445
@kasiopia renderDefault se vola pouze u akce (resp. view) default. pokud chces, aby se to nastavovalo i pro jine akce/view, presun to do metody beforeRender