Viacúrovňové Menu cez beforeRender
- SontoEremo
- Člen | 341
Zdravím Vás…
Prosím ako spraviť viac úrovňové menu v presentery cez beforeRender ?
Môj BasePresenter
$this->template->UserProfileItem = array(
'Profil' => array(
'Odhlásenie' => 'User:Out'
),
);
a v Latte
<ul n:inner-foreach="$UserProfileItem as $UserProfile => $link" class="access unstyled">
<li class="login-area"><a n:href="$link"><i class="icon-user"></i> {$UserProfile}</a></li>
</ul> <!-- End menu-top unstyled inline -->
vyhadzuje mi to chybu
Warning
strpos() expects parameter 1 to be string, array given
Viem, že je na takéto veci stavaná komponenta Navigation no rád by som to použil alebo spravil bez komponenty za odpoveďe a pomoc vopred ďakujem.
- MartinitCZ
- Člen | 580
Dumpni si proměnnou
$link // {dump $link}
a uvidíš, proč to hází tuto chybu ;)
Proč nefunguje označení inline kod?
Editoval martinit (21. 4. 2013 12:49)
- David Matějka
- Moderator | 6445
- nevim, proc na to nechces pouzit komponentu.
- v
$link
bude pole (jak nenapadne naznacuje martinit :) )
array(
'Odhlásenie' => 'User:Out'
)
takze tam udelej jeste jeden vnorenej foreach (nebo si definuj block a includni ho)
Editoval matej21 (21. 4. 2013 13:49)
- SontoEremo
- Člen | 341
Prečo to stále nefunguje? už si nad tým lámem hlavu snáď už celé 3 dni
BasePresenter.php
public function beforeRender()
{
$this->template->menus = array(
'Menu 1' => ':Test:Tests:default',
'Submenu' => array(
'Submenu 1' => ':Test:Tests:default',
'Submenu 2' => ':Test:Tests:default'
),
'Menu 2' => ':Test:Tests:default'
);
}
a left_menu.latte
<div class="page-sidebar nav-collapse collapse">
<ul>
{block #menu}
{foreach $menus as $menu => $item}
{if is_array($item)}
{include #menu, menu => $item}
{else}
<li><a n:href="$item">{$menu}</a></li>
{/if}
{/foreach}
{/block}
</ul>
</div>
Ďakujem vopred za pomoc.
- jiri.pudil
- Nette Blogger | 1032
Neměl bys tam mít
{include #menu, menus => $item} <!-- přibylo "s"
?
- MartinitCZ
- Člen | 580
Include se na tohle nepoužívá.
Jinak, tohle jsou základy php.
Zkus:
<div class="page-sidebar nav-collapse collapse">
<ul>
{block #menu}
{foreach $menus as $menu => $item}
{if is_array($item)}
{foreach $item as $m => $i}
<li><a n:href="$i">{$m}</a></li>
{/foreach}
{else}
<li><a n:href="$item">{$menu}</a></li>
{/if}
{/foreach}
{/block}
</ul>
</div>
- SontoEremo
- Člen | 341
Ale TU je použité
ináč ďakujem už mi to zobrazuje to menu ale prečo to nezobrazí to Sub? pod ktorým sú Submenu 1 a Submenu 2?
<div class="page-sidebar nav-collapse collapse">
<ul>
<li><a href="...">Menu 1</a></li>
<li><a href="...">Submenu 1</a></li>
<li><a href="...">Submenu 2</a></li>
<li><a href="...">Menu 2</a></li>
</ul>
</div>
Ja som myslel, že to bude vyslédkovo asi takto
<div class="page-sidebar nav-collapse collapse">
<ul>
<li><a href="...">Menu 1</a></li>
<li><a href="...">Submenu</a>
<ul class="sub">
<li><a href="...">Submenu 2</a></li>
<li><a href="...">Menu 2</a></li>
</ul>
</li>
<li><a href="...">Menu 2</a></li>
<li><a href="...">Menu 3</a></li>
</ul>
</div>
Používam Metronic Admin Šablónu ale to menu na Ľavo to je to čo chcem cez Nette dosiahnuť ak je to možné.
- jiri.pudil
- Nette Blogger | 1032
@SontoEremo: Použij include, je to tak správně. V dokumentaci, kterou odkazuješ, je dokonce příklad velmi podobný tomu tvému, takže se můžeš inspirovat tam. Každopádně v tvém původním kódu IMO chybělo písmenko
- SontoEremo
- Člen | 341
jiri.pudil napsal(a):
@SontoEremo: Použij include, je to tak správně. V dokumentaci, kterou odkazuješ, je dokonce příklad velmi podobný tomu tvému, takže se můžeš inspirovat tam. Každopádně v tvém původním kódu IMO chybělo písmenko
Proste to nefunguje!
<div class="page-sidebar nav-collapse collapse">
<ul>
{block #menu}
{foreach $menus as $menu => $item}
{if is_array($menu)}
{include #menu, menus => $menu}
{else}
{$menu}
{/if}
{/foreach}
{/block}
</ul>
</div>
a
public function beforeRender()
{
$this->template->menus = array(
'Menu 1' => ':webadmin:Dashboard:',
'Submenu' => array(
'Submenu 1' => ':webadmin:Sign:in',
'Submenu 2' => ':webadmin:Sign:up'
),
'Menu 2' => ':webadmin:Sign:reset'
);
}
Výsledok je v html
<div class="page-sidebar nav-collapse collapse">
<ul>
Menu 1
Submenu
Menu 2
</ul>
</div>
Ako dosiahnuť tohto výsledku?
<div class="page-sidebar nav-collapse collapse">
<ul>
<li class="start active">
<a href="/webpage/webadmin/dashboard/">
<i class="icon-home"></i>
<span class="title">Dashboard</span>
<span class="selected"></span>
</a>
</li>
<li class="has-sub ">
<a href="javascript:;">
<i class="icon-bookmark-empty"></i>
<span class="title">Submenu</span>
<span class="arrow "></span>
</a>
<ul class="sub">
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 2</a></li>
</ul>
</li>
<li class="">
<a href="/webpage/webadmin/dashboard/">
<i class="icon-user"></i>
<span class="title">User</span>
<span class="selected"></span>
</a>
</li>
</ul>
</div
A vlastne dá sa spraviť niečo také v Nette?
- llsm
- Člen | 121
SontoEremo napsal(a):
Proste to nefunguje!
<div class="page-sidebar nav-collapse collapse"> <ul> {block #menu} {foreach $menus as $menu => $item} {if is_array($menu)} {include #menu, menus => $menu} {else} {$menu} {/if} {/foreach} {/block} </ul> </div>
Jen mam pocit, ze moc nechapes, co delas. To, co se tu deje, je rekurze daneho bloku. A vystup odpovida tvemu vstupu, protoze treba znacku <ul> mas uplne mimo ten blok, tak se ti tam pak nemuze vickrat opakovat. Reseni by melo byt spis nejak takto (dodelat uz si to snad zvladnes sam):
<div class="page-sidebar nav-collapse collapse">
{block #menu}
<ul>
{foreach $menus as $menu => $item}
<li>
{if is_array($menu)}
<span>Submenu</span>
{include #menu, menus => $menu}
{else}
{$menu}
{/if}
</li>
{/foreach}
</ul>
{/block}
</div>
- Petr Hudík
- Člen | 49
Pro začátek bych zkusil toto:
{block #menu}
<ul>
{foreach $menus as $menu => $item}
<li>
{if is_array($item)}
<span>{$menu}</span>
{include #menu, menus => $item}
{else}
{$menu}
{/if}
</li>
{/foreach}
</ul>
{/block}
Domnívám se, že jsi zaměnil $key a $value v foreach, protože dle https://forum.nette.org/…beforerender#… jsi chtěl předat $value, nikoliv $key.
// edit: pozdě, navíc jsem si tam našel chybku (sakra! :-(), opraveno.
Editoval Petr Hudík (7. 5. 2013 13:22)
- leninzprahy
- Člen | 150
testovat na is_array
by se mělo spíše $item
, to
by se mělo předávat i bloku
<div>
{block #menu}
<ul>
{foreach $menus as $menu => $item}
<li>
{if is_array($item)}
{include #menu, menus => $item}
{else}
<a n:href="{$item}">{$menu}</a>
{/if}
</li>
{/foreach}
</ul>
{/block}
</div>
- SontoEremo
- Člen | 341
leninzprahy napsal(a):
testovat na
is_array
by se mělo spíše$item
, to by se mělo předávat i bloku<div> {block #menu} <ul> {foreach $menus as $menu => $item} <li> {if is_array($item)} {include #menu, menus => $item} {else} <a n:href="{$item}">{$menu}</a> {/if} </li> {/foreach} </ul> {/block} </div>
Ďakujem veľmi pekne pomohlo uf konečne :)
Ale predsa ešte jedna taká otázka
<ul>
<li><a href="/webpage/webadmin/dashboard/">Menu 1</a></li>
<li><a href="javascript:;">Submenu</a>
<ul Ako sem dosadím --> class="sub" <-- ?>
<li><a href="/webpage/webadmin/sign/in">Submenu 1</a></li>
<li><a href="/webpage/webadmin/sign/up">Submenu 2</a></li>
</ul>
</li>
<li><a href="/webpage/webadmin/sign/reset">Menu 2</a></li>
</ul>
Teraz už viem že toto {include #menu, menus ⇒ $item} mi generuje Submenu ale kam tam dosadiť class=„sub“ aby bolo výsledne
<ul class="sub">...</ul>
- leninzprahy
- Člen | 150
třeba takto (píšu z hlavy)
<div>
{var $level = 0}
{block #menu}
<ul n:class="$level > 0 ? sub">
{foreach $menus as $menu => $item}
<li>
{if is_array($item)}
{include #menu, menus => $item, level => $level++}
{else}
<a n:href="{$item}">{$menu}</a>
{/if}
</li>
{/foreach}
</ul>
{/block}
</div>
- David Matějka
- Moderator | 6445
jak pise @leninzprahy by to melo byt ok, ja osobne preferuji tohle:
<div>
<ul>
{block #menu}
{foreach $menus as $menu => $item}
<li>
{if is_array($item)}
<ul class="sub">
{include #menu, menus => $item}
</ul>
{else}
<a n:href="{$item}">{$menu}</a>
{/if}
</li>
{/foreach}
{/block}
</ul>
</div>
- SontoEremo
- Člen | 341
Ďakujem všetko nakoniec sa to podarilo a funguje to skvele…
Ale predsa mám ešte jednu otázku a hádam aj poslednu
Povedzme, že mám toto menu
<ul>
{block #menu}
{foreach $menus as $menu => $item}
{if is_array($item)}
<li class="has-sub ">
<a href="javascript:;">
<span class="title">{$menu}</span>
<span class="arrow "></span>
</a>
<ul class="sub">
{include #menu, menus => $item}
</ul>
</li>
{else}
<li>
<a n:href="{$item}">
<span class="title">{$menu}</span>
<span class="selected"></span>
</a>
</li>
{/if}
{/foreach}
{/block}
</ul>
čo vo výslednom html v prehliadači vyzerá
<ul>
<li>
<a href="/webpage/webadmin/dashboard/">
<span class="title">Menu 1</span>
<span class="selected"></span>
</a>
</li>
<li class="has-sub ">
<a href="javascript:;">
<span class="title">Submenu</span>
<span class="arrow "></span>
</a>
<ul class="sub">
<li>
<a href="/webpage/webadmin/sign/in">
<span class="title">Submenu 1</span>
<span class="selected"></span>
</a>
</li>
<li>
<a href="/webpage/webadmin/sign/up">
<span class="title">Submenu 2</span>
<span class="selected"></span>
</a>
</li>
</ul>
</li>
<li>
<a href="/webpage/webadmin/sign/reset">
<span class="title">Menu 2</span>
<span class="selected"></span>
</a>
</li>
<li class="has-sub ">
<a href="javascript:;">
<span class="title">Submenu 2</span>
<span class="arrow "></span>
</a>
<ul class="sub">
<li>
<a href="/webpage/webadmin/sign/in">
<span class="title">Submenu 3</span>
<span class="selected"></span>
</a>
</li>
<li>
<a href="/webpage/webadmin/sign/up">
<span class="title">Submenu 4</span>
<span class="selected"></span>
</a>
</li>
</ul>
</li>
</ul>
ako docieliť toto?
<li class="has-sub ">
<a href="javascript:;">
**<i class="icon-bookmark-empty"></i>**
<span class="title">Submenu</span>
<span class="arrow "></span>
</a>
<ul class="sub">
<li><a href="#">Submenu 1</a></li>
<li><a href="#">Submenu 2</a></li>
</ul>
</li>
<li class="">
<a n:href=":webadmin:Dashboard:default">
**<i class="icon-user"></i>**
<span class="title">User</span>
<span class="selected"></span>
</a>
</li>
pre každé menu a nadradené submenu <i class=„ikonka“></i>
Asi sa to nedá tak som ponechal klasické html menu s n:href ale ďakujem všetkým ešte sa mi to na pár dôležitých menúčkach bude veľmi hodiť a všeobecne :)
P.S. pokiaľ medzi časom na to niekto príde nech sem hodí kódy :)
Editoval SontoEremo (7. 5. 2013 22:19)
- Rob Bob
- Člen | 60
Tak si do te definice menu Submenu vloz do toho pole dalsi pole:
<?php
public function beforeRender() {
$this->template->menus = array(
'Submenu' => array('items' => array(
'Submenu 1' => ':webadmin:Sign:in',
'Submenu 2' => ':webadmin:Sign:up'
), 'icon' => "icon-user"),
);
}
?>
A v te casti sablony pak neco jako
...
{if is_array($item)}
<li class="has-sub ">
<a href="javascript:;">
<i class="{$item['icon']}"></i>
<span class="title">{$menu}</span>
<span class="arrow "></span>
</a>
<ul class="sub">
{include #menu, menus => $item['items']}
</ul>
</li>
{else}
...
[Netestovano, ale podobne pouziti urcite odladis]
- SontoEremo
- Člen | 341
Rob Bob
Ďakujem pekne funguje to ale škoda, že len na menu ktoré obsahuje ďalšie submenu
{block #menu}
{foreach $menus as $menu => $item}
{if is_array($item)}
<li class="has-sub">
<a href="javascript:;">
Tu to Funguje <i class="{$item['icon']}"></i>
<span class="title">{$menu}</span>
<span class="arrow "></span>
</a>
<ul class="sub">
{include #menu, menus => $item['icons']}
</ul>
</li>
{else}
<li>
<a n:href="{$item}">
Tu už to vyhdazuje **Illegal string offset 'icons'** <i class="{$item['icon']}"></i>
<span class="title">{$menu}</span>
<span class="selected"></span>
</a>
</li>
{/if}
{/foreach}
{/block}
BasePresenter.php
$this->template->menus = array(
Toto je asi blobosť, že? 'Dashboard' => array('icons' => array(':webadmin:Dashboard:'), 'icon' => "icon-dashboard"),
'Webadmin' => array('icons' => array(
'Služby' => ':webadmin:Service:',
'WebLogy'=>':webadmin:Weblogs:'
),'icon' => "icon-user"),
'Môj účet' => ':webadmin:Account:'
);
Editoval SontoEremo (8. 5. 2013 17:57)