Menu v @layout.latte pomocí MySQL

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

Dobrý den,
v Nette jsem začal dělat teprve nedávno a tak s ním ještě nemám tolik zkušeností. Mým úkolem je nyní vytvořit menu (navigaci) na stránce, které se bude zobrazovat na každé stránce. Pro menu chci dále udělat i UI, kde budu moci jednoduše editovat položky v menu a tak jsem byl nucen využít sql databáze.

Vytvořil jsem si jednoduchý MenuPresenter:

<?php

namespace App\Presenters;

use Nette,
	App\Model;


/**
 * Menu presenter.
 */
class MenuPresenter extends BasePresenter
{

	private $database;

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

  public function renderMenu()
  {
    $this->template->menuItems = $this->database->table('menu');
  }
}

K presenteru jsem samozřejmě vytvořil i menu.latte

{block #menuTop}

{foreach $menuItems as $menuItem}
  <li><a n:href="{$menuItem->link}">{$menuItem->title}</a></li>
{/foreach}

{/block}

Nyní však potřebuji aby se toto menu zobrazovalo na všech stránkách a tak pokud správně chápu, bych ho měl přidat do @layout.latte. V tom je ale ta chyba, že mi to nejde, ať už jsem zkoušel jakýkoliv způsob.

Za každou radu budu rád.
Děkuji

Matey
Člen | 142
+
0
-

na menu použi komponentu nie presenter a potom ju načítaj v BasePresenter
asi takto + uprav namespace
MenuControl.php

<?php

use Nette\Application\UI\Control;

class MenuControl extends Control
{
	/** @var Nette\Database\Context */
	private $database;

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

	public function render()
	{
		$template = $this->template;
		$template->setFile(__DIR__ . '/MenuControl.latte');
		$template->menuItems = $this->database->table('menu');
		$template->render();
	}
}

?>

MenuControl.latte

{foreach $menuItems as $menuItem}
  <li><a href="{plink $menuItem->link}">{$menuItem->title}</a></li>
{/foreach}

BasePresenter.php

<?php

/** @var Nette\Database\Context */
private $database;

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

protected function createComponentMenu()
{
	$menu = new App\MenuControl($this->database);
	return $menu;
}

?>

nakoniec v layoute vykreslíš:

{control menu}

snáď som sa nikde nesekol

edit: myslím že n:href v komponente nepôjde, nato je makro {link} alebo {plink}, to už nvm čo máš za odkaz v tej db, či na prezenter alebo linky.. viac si prečítaj v dokumentácii

Editoval Matey (27. 4. 2014 21:52)

lamer94
Člen | 4
+
0
-

Bohužel jsem to takto nerozjel. Nevím zda jsem umístil správně soubory, ale pokud to udělám takto jak jste mi napsal tak mi ladička vyhodí chybu: Class ‚App\Presenters\App\MenuControl‘ not found

Mysteria
Člen | 797
+
0
-

@lamer94 To máš jenom problém s namespacema. Jaký máš namespace u tý třídy MenuControl a u BasePresenteru?

lamer94
Člen | 4
+
0
-

U basepresenteru je to App\Presenters; a u menucontrol nemám žádný namespace, to bude asi ta chyba, ale jaký namespace použít?

Tirus91
Člen | 199
+
0
-

@lamer94

namespace můžeš použít jakýkoliv, ale když ho nepoužiješ, tak tam nedávej např.

new MenuControl();

ale

new \MenuControl();
lamer94
Člen | 4
+
0
-

Tak poslední odpověď od @Tirus91 to vyřešila. Děkuji všem co mi pomohli :)