Integrace KnpMenu do Nette
- Trunda
- Člen | 26
Zdravím všechny,
integroval jsem KnpMenu do Nette. Nějaké připomínky, náměty a podobně?
- Tomas P
- Člen | 27
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
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
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
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
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
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
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)