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