Viacúrovňové Menu cez beforeRender

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

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
+
0
-

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)

Grelek
Člen | 233
+
0
-

martinit napsal(a):

Proč nefunguje označení inline kod?

Mně normálně funguje.

David Matějka
Moderator | 6445
+
0
-
  1. nevim, proc na to nechces pouzit komponentu.
  2. 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
+
0
-

Ďakujem za odpoveďe…

No nejako to nejde prosím pomôžte :)

SontoEremo
Člen | 341
+
0
-

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
+
0
-

Neměl bys tam mít

{include #menu, menus => $item}    <!-- přibylo "s"

?

MartinitCZ
Člen | 580
+
0
-

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
+
0
-

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
+
0
-

@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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

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
+
0
-

Ď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
+
0
-

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
+
0
-

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)