Komponenta pro tvorbu menu

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

Ahoj, vytvořil jsem si komponentu pro menu umí pár zajímavých věcí

  • Klasické stromové menu i vodorovné menu a jejich kombinaci
  • Drobečkovou navigaci
  • Mapu webu

https://componette.org/search/?…

Vím, pár komponent pro menu už tady je ale … .
Připomínky, nápady a oslavné písně sem.

Jirda
Člen | 103
+
0
-

Nezkoumal jsem komponentu nijak do hloubky, jen nakoukl, ale napadla me otazka, zda u tech vetsich stromovych struktur, je nejaka podpora cachovani?

Jan Suchánek
Člen | 404
+
0
-

Moc pěkné. Cachování si mužeš přidat ne? :)

Jirda
Člen | 103
+
0
-

jenicek napsal(a):

Moc pěkné. Cachování si mužeš přidat ne? :)

Muzu, zajimalo me, jen jestli neexistuje primo neco v komponente a pokud ne, tak ze to muze byt pripadny podnet do budoucna.

murdej
Člen | 26
+
0
-

Cachovani je dobry napad, planuju jeden projekt kde se bude hodit, takže v některé z dalších verzí se objeví.

spiider
Člen | 162
+
0
-

Ahoj ,díky za super komponentu. Jenom se chci zeptat…nějak mi nefunguje drobečkové menu.
Mám to takto:

namespace Controls;

use Nette\Utils\Strings;

class MenuControl extends \Nette\Application\UI\Control
{

	public function __construct(\Nette\ComponentModel\IContainer $parent = NULL, $name = NULL) {
		parent::__construct($parent, $name);
		$menu = $this['menu'];

		$menuItem = new \Murdej\MenuNode;
		$data = $this->presenter->context->menu->getMenu();
		$menu->fromTable(
			$data,
			function($node, $row) {
				$node->name = $row->name;
				$node->link = Strings::webalize($row->name);
				$node->id = $row->id; // id polozky v menu
				// Pod kterou položku patří, v případě že do nejvyšší úrovně vrať null
				return $row->inclusion ? $row->inclusion : null;
			}
		);

	}

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

	}

	protected function createComponentMenu() {
		$menu = new \Murdej\Menu;
		return $menu;
	}

}

a v šabloně:

{control menu:nav separator=>' => '}

Struktura db je takto:
CREATE TABLE menu (
id int(16) NOT NULL AUTO_INCREMENT,
sort int(16) NOT NULL,
inclusion int(16) NOT NULL,
name varchar(128) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=154 ;

Kde inslusion je id pod kterou kategorii položka patří.
Při takovém použití funguje vypsání map, tree ale nav nevypíše nic.
Díky za rady

murdej
Člen | 26
+
0
-

Ahoj,
nikde tam nevidím nastavení aktuální položky menu. To bude asi tím. Zkus přidat do render()

$menu->selectByUrl($this->presenter->link('this'));
lubos
Člen | 22
+
0
-

Ahoj @murdej hraju si to s tvoji komponentou a marně se snažím zjistit, kde se ti bere $node->url v metodě selectByUrl(), při pokusu použít $menu->selectByUrl($this->presenter->link(‚this‘)) končím s hláškou Component ‚menu‘ is not attached to ‚Nette\Application\UI\Presenter‘. Nějak nechápu.

public function selectByUrl($url) {
		foreach($this->allNodes as $node) {
			if ($url == $node->url) {
				$this->selected = $node;
			}
		}
	}
Šaman
Člen | 2659
+
0
-

@lubos:
Tuhle komponentu neznám, ale k té tvé chybé obecně – že ty se snažíš dostat na ten presenter už v konstruktoru? Tou dobou pro tu komponentu zádný presenter neexistuje.
Teprve až proběhne konstruktor a máš instanci té třídy se komponenta zařadí do stromu komponent a tím i připojí k presenteru.

Takže řešení je ten výše popsaný řádek zapsat do metody attached (proběhne ihned po připojení ke stromu komponent)

<?php
protected function attached()
{
    parent::attached();
    $this->selectByUrl($this->presenter->link('this'));
}
?>

, nebo jednodušeji v metodě render, jak to doporučuje příspěvek nad tebou (ta proběhne až při vykreslování, to už připojený jsi).

Další možnost je zavolat tu selectByUrl() v továrničce, tou dobou máš samozřejmě k dispozici jak $menu, tak presenter.

Editoval Šaman (19. 5. 2013 16:24)

TheNEoo
Člen | 75
+
0
-

Ahoj,
chtěl bych se zeptat, jakým způsobem mohu použít odkazování do modulu.

pokud do $node->link pošlu presenter:akce, tak mi vyleze aktuální modul : presenter :akce to mi vygeneruje aktuální modul/presenter/akce

pokud do $node->link pošlu modul:presenter:akce, to mi vygeneruje aktualni modul/modul/presenter/akce

já ovšem potřebuji modul/presenter/akce

otázka je, je toto nějak řešený ?

David Matějka
Moderator | 6445
+
0
-

staci na zacatek dat dvojtecku, to znaci absolutni cestu – :Modul:Presenter:akce

TheNEoo
Člen | 75
+
0
-

matej21 napsal(a):

staci na zacatek dat dvojtecku, to znaci absolutni cestu – :Modul:Presenter:akce

super děkuji moc to je ono :)

Ivorius
Nette Blogger | 119
+
0
-

A odkaz mimo web nejde udělat?

Ivorius
Nette Blogger | 119
+
0
-

Udělal jsem nějaké úpravy, necheš to dát na git, abychom tam mohli posílat?

James_Scott
Člen | 55
+
0
-

Ahoj, díky za skvělé menu, usnadní mnoho práce.
Neřešil někdo, jak dostat za položky v menu do závorky počet položek v dané kategorii?

petak23
Člen | 16
+
0
-

Pokúšam sa prejsť z Nette 2.0.14 na Nette 2.1.2 a pri tejto (Menu) komponente som sa zasekol na chybovej hláške:

error: Unable to pass parameters to action 'Admin:Homepage:default', missing corresponding method.

Je to v tejto funkcii:

<?php
public function getUrl() {
		$params = array();
		if (is_string($this->link)) {
			$params[] = $this->link;
		} else if (is_array($this->link)) {
			$params[] = $this->link[0];
			if (isset($this->link[1])) {
				$params = array_merge($params, $this->link[1]);
			}
		}
    return call_user_func_array(array($this->menu->presenter, 'link'), $params); //Toto mi vracia chybu
	}
?>

Vo verzii 2.0.14 to šlapalo bez problémov! Čo s tým?

Editoval petak23 (4. 4. 2014 12:24)