Komponenta pro tvorbu menu
- murdej
- Člen | 26
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.
- spiider
- Člen | 162
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
- lubos
- Člen | 22
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
@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
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
staci na zacatek dat dvojtecku, to znaci absolutni
cestu – :Modul:Presenter:akce
- James_Scott
- Člen | 55
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
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)