Integrace KnpMenu do Nette

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

Zdravím všechny,

integroval jsem KnpMenu do Nette. Nějaké připomínky, náměty a podobně?

http://nette.merxes.cz/…nda/smf-menu

Tomas P
Člen | 27
+
0
-

Ahoj,
vyzera to zaujimavo, v popise ale chybaju informacie ako to poriadne pouzivat :-\

prvy example:

<?php
$renderer = new ListRenderer();
// opravit na
$renderer = new ListRenderer(new \Smf\Menu\Matcher\Matcher());
?>

druhy (usage) example:

<?php
$this->context->menu->createMenuControl();
?>

Mohol by si tam mat napisane, ze service sa vytvori automaticky, a overit sa to da napr. debugom na kontaineri (v config.neon)

<?php
common:
	nette:
		container:
			debugger: true
?>

Sposob ako pouzit inject*() som nezistil, kedze neviem aku classu compiler extension vytvori. Rozhodne by ale bolo fajn mat sposob ako pouzivat injectMenu().

Po chvilke hrania sa, sa mi to podarilo rozchodit, vyzera ze je vsetko super… ale ako dalej.

1, ako mierne pozmenit vystup (napr id/class <ul>)
 – bootstrap menu je zvisle, pridanim class „nav-pills“ bude vodorovne
 – da sa renderer parametrizovat? alebo je lepsie podedit/okopirovat/vytvorit novy

2, ako menu ukladat (do DB)? toto je dost siroky pojem, ale urcite existuje moznost, ako nezanorenu strukturu ulozit do tabulky, aby sa menu vypisalo bez nejakeho komplikovaneho preprocessingu v php. mas nejake tipy / odporucania? example ako to robis ty?

3, ake veci sa daju napisat do $options parametra addChild()
 – vycet tychto veci je v MenuFactory:buildOptions()
 – ako maju vyzerat polia napr. attributes, extras
 – mohol by si spravit example, kde nastavujes vsetko co sa da (a dava zmysel), na par menuitemoch?

4, ako spravne pouzivat plugin na hlavne menu, submenu, nezavisle menu, navigaciu? proste ak ich je potreba viac.

Modul sa mi skutocne lubi, asi zahodim to co som si spravil sam a zacnem pouzivat toto. Ale chcelo by to viac info, aby clovek nemusel skumat zdrojaky Knp\Menu.

Editoval Tomas P (12. 2. 2013 17:42)

Tomas P
Člen | 27
+
0
-

Inak chyba ti v tvojom ListRenderer define ENT_SUBSTITUTE z Knp\Menu\Renderer\Renderer, alebo by si mal od neho dedit (kedze je abstraktny)

<?php
// namiesto
class ListRenderer implements RendererInterface

// robit
class ListRenderer extends \Knp\Menu\Renderer\Renderer implements RendererInterface
?>

ono to nicomu nevadi a mozno by si mohol vynechat funkcie ktore zbytocne kopirujes.

Trunda
Člen | 26
+
0
-

Ahoj,

díky za připomínky. Připravuji komplexní manuál (upravený z KnpMenu) + další možnosti využití v Nette. Vše, co zmiňuješ tam bude obsaženo + navíc bude mírný refaktor aby se dalo použít inject metody (pro továrnu).

Trunda
Člen | 26
+
0
-

Tak jsem něco sepsal.

Provedl jsem také poměrně velkou refaktorizaci, takže vznikl BC break ve vytváření menu v presenteru (vizte dokumentace).

Ta dokumentace ještě není kompletní, plánuji tam postupně přidat přímo ukázky, jak jsem co řešil.

Tomas P
Člen | 27
+
0
-

Prave robim submenu a narazil som na mensi problem, neviem ako zistit ci je polozka aktivna (current)

<?php
	protected function createComponentSubmenu()
	{
		$menu = $this->menuFactory->createControl();
		$root = $menu->getRoot();

		foreach ($this->menu as $x) {
			bd($x->isCurrent()); // vsetko je NULL (tj. default)
		}

		// vybrat natvrdo funguje, ale takto to nechcem robit
		foreach ($this->menu['vacation']->getChildren() as $item) {
			$root->addChild($item->copy());
		}

		return $menu;
	}
?>

je nejaka moznost, ako zistit cez samotne menu, ci je polozka aktivna? v rendereri som presne toto videl, vola sa Matcher, ten sa rekurzi a vrati ci je polozka ancestor niecoho aktualneho, ale rad by som pouzil priamo Item->isCurrent() … preco sa to nevyplni? preco to vrati NULL namiesto zistovania?

Viem ze sa jedna o kod KNP, ale mozno by si vedel poradit.

Tomas P
Člen | 27
+
0
-

Nasiel som este moznost nepouzivat createComponentSubmenu() ale priamo menu control, a len pri renderovani v latte sablone mu dat parameter path (oddeleny pomlckami)

<?php
// latte
{control menu, path => vacation}
?>

kazdopadne to neriesi uplne moj problem, ako zistit ktory Item je ten aktivny (najaktivnejsi). idealne by bolo mat nieco na styl $menu->getDeepestCurrentItem(), co by vratilo najhlbsiu polozku menu, ktora je aktivna. Z nej by sa dalo potom zistkat jej predkov a tiez cele breadcrumbs.

Re4DeR
Člen | 71
+
0
-

Ahoj, zkousim addon rozjet ale nedari se.
instalace přes composer, nette 2.0.10

No service of type Menu\Control\Factory found. Make sure the type hint in Method FrontModule\HomepagePresenter::injectMenuFactory() is written correctly and service of this type is registered. search►

Servisku mi to tedy vytvoří samo nebo si ji musim vytvorit v configu ?
V návodu k tomu nic neni, jen k registraci vlastnich renderu a tam zdaleka nejsem.

díky

Re4DeR
Člen | 71
+
0
-

upraveno takto – pak to zaclo fungovat

public function injectMenuFactory(\SMF\Menu\Control\Factory $factory){
		$this->menuFactory = $factory;
	}
Re4DeR
Člen | 71
+
0
-

ahoj, resim tento problem:
v menu si zadefinuji polozku „clanky“
pokud si ji rozkliknu tak má tridu .current. pokud si ale otevru nejaky clanek tak uz v menu trida current_ancestor neni.
jak by ji tam slo vlozit prosim?

tusim ze v renderu clanku bych mel nastavit neco jako

$this['menu']->clanky->setCurrent(true);

ale nejak nejsem schopny to dat dohromady :(

tak takto je to spravne

$this['menu']->getRoot()->getChildren()['clanky']->setCurrent(1);

Editoval Re4DeR (5. 6. 2013 16:12)