Autor Zpráva
maestorm
Profil
Zdravím,
nevíte náhodou někdo jak správně vypisovat nekonečné menu v nette?

{block #menu}
  {foreach $menu as $item}
    <ul class="tree" n:if="$item != end()">
      <li>{if is_array($item)} {include #menu, 'menu' => $item} {else}{$item}{/if}</li>
    </ul>
  {/foreach}
{/block}

<?php

namespace App\Presenters;

use Nette;
use App\Model;


class HomepagePresenter extends BasePresenter
{
  public function renderDefault()
    {
        $this->template->menu = [
            [
                'title' => 'Level 1',
                'node' => [
                        [
                            'title' => 'Level 1.1',
                            'node' => [
                                [
                                    'title' => 'Level 1.1.1',
                                    'node' => []
                                ],
                                [
                                    'title' => 'Level 1.1.2',
                                    'node' => []
                                ]
                            ]
                        ],
                        [
                            'title' => 'Level 1.2',
                            'node' => []
                        ],
                        [
                            'title' => 'Level 1.3',
                            'node' => []
                        ]
                ]
            ],
            [
                'title' => 'Level 2',
                'node' => [
                            'title' => 'Level 2.1',
                            'node' => [
                                [
                                    'title' => 'Level 2.1.1',
                                    'node' => []
                                ],
                                [
                                    'title' => 'Level 2.1.2',
                                    'node' => []
                                ]
                            ]
                        ]
            ],
            [
                'title' => 'Level 3',
                'node' => [
                        [
                            'title' => 'Level 3.1',
                            'node' => []
                        ],
                        [
                            'title' => 'Level 3.2',
                            'node' => []
                        ],
                ]
            ]
        ];

//        \Tracy\Debugger::$maxDepth = 6;
//        dump($this->template->menu);exit;
    }

}

Nette mi totiž vypisuje warning: end() expects exactly 1 parameter, 0 given
abc
Profil
maestorm:
Nebude stačit smazat ten n:if?
maestorm
Profil
abc:
To bohužel nepomůže, jde mi o to, aby nebyly v kódu menu navíc. viz.
<div class="col-lg-12">
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 1</li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 1.1</li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 1.1.1</li>
    </ul>
    <ul class="tree">
      <li>  </li>
    </ul>
 </li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 1.1.2</li>
    </ul>
    <ul class="tree">
      <li>  </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 1.2</li>
    </ul>
    <ul class="tree">
      <li>  </li>
    </ul>
 </li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 1.3</li>
    </ul>
    <ul class="tree">
      <li>  </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 2</li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 2.1</li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 2.1.1</li>
    </ul>
    <ul class="tree">
      <li>  </li>
    </ul>
 </li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 2.1.2</li>
    </ul>
    <ul class="tree">
      <li>  </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 3</li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 3.1</li>
    </ul>
    <ul class="tree">
      <li>  </li>
    </ul>
 </li>
    </ul>
    <ul class="tree">
      <li>     <ul class="tree">
      <li>Level 3.2</li>
    </ul>
    <ul class="tree">
      <li>  </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
 </li>
    </ul>
</div>
abc
Profil
maestorm:
To menu "navíc" se tam určitě nedostalo kvůli té podmínce. Spíš máš v tu chvíli v $item prázdný string - takže by mohlo stačit n:if="$item != '' "
Jan Tvrdík
Profil
maestorm:
Začal bych bez nesmyslné n:if podmínky a se správně umístěným <ul>

{block #menu}
  <ul class="tree">
  {foreach $menu as $item}
      <li>{if is_array($item)} {include #menu, 'menu' => $item} {else}{$item}{/if}</li>
  {/foreach}
  </ul>
{/block}
maestorm
Profil
Bohužel ani jedna odpověď mi nezafungovala, ale děkuji vám za snahu, také děkuji za to upozornění ohledně hierarchie, ale opravdu nevíte o nějakém konkrétním řešení?
Kcko
Profil
maestorm:
Odpověď Jana Tvrdíka je v pořádku. Je to koneckonců to samé co je ukázkou na nette.org (latte.nette.org/cs/macros#toc-vkladani-bloku)
Zkusil jsem si to, protože mi přišlo divné, že by to nefungovalo (už z letmého pohledu je to v pořádku) a je to skutečně v pořádku.
Viz:


Někde děláš něco špatně, ale nevím co, protože na tomhle se nedá nic zkazit.
maestorm
Profil
Kcko:
Jo přesně takhle to mám. Jenže tam nechci ty koncové odrážky, které v tomto vašem případě znamenají <li></li> navíc. Proto jsem sem na diskusi napsal, protože se mi je nedaří odstranit. Omlouvám se, pokud jsem byl špatně pochopen.

S poděkováním Tomáš.
Kcko
Profil
maestorm:
Tak si odstraň ty prázdná pole, tam kde víš, že děti nejsou


tj např.
                'title' => 'Level 3',
                'node' => [
                        [
                            'title' => 'Level 3.1',
                            'node' => []
                        ],
                        [
                            'title' => 'Level 3.2',
                            'node' => []
                        ],

=>

      'title' => 'Level 3',
                'node' => [
                        [
                            'title' => 'Level 3.1'
                        ],
                        [
                            'title' => 'Level 3.2'
                        ],
maestorm
Profil
Jinak to skutečně nejde, než ty děti odstranit takto?
Kcko
Profil
maestorm:
A proč tam držíš informaci o prázdném poli? Nějak si do téhle podoby skládáš (z DB nebo nevím odkud) tak není problém to zohlednit.

Já to mám trošku jinak:

    $products = array(

        1 => array('parent' => 0, 'name' => 'Televize', 'url' => 'televize'),
        2 => array('parent' => 1, 'name' => 'LED', 'url' => 'led'),
        3 => array('parent' => 2, 'name' => '101 palcu', 'url' => '101-palcu'),
        4 => array('parent' => 3, 'name' => 'Samsung', 'url' => 'samsung'),
        5 => array('parent' => 0, 'name' => 'Videa', 'url' => 'videa'),
        6 => array('parent' => 5, 'name' => 'Samsung', 'url' => 'samsung'),
        7 => array('parent' => 6, 'name' => 'DO 10 tisic', 'url' => 'do-10-tisic'),
        8 => array('parent' => 1, 'name' => 'Televize - sub', 'url' => 'televize'),
        9 => array('parent' => 8, 'name' => 'Vyrazene teleize', 'url' => 'vyrazene-televize'),
        
    );


        foreach ($products as $id => $row)
        {
            $arr[$row["parent"]][$id] = $row;
        }

        $this->template->data = $arr;



    {var $parent = 0}
    {var $level = 0}

    {block menu}

        <ul>
        {foreach $data[$parent] as $id => $row}
            
            <li>{$id} - {$row['name']} </li>
            {ifset $data[$id]}
                {include this, parent => $id, level => $level + 1 }
            {/ifset}
        {/foreach}
        </ul>

    {/block}
maestorm
Profil
Nakonec mi pomohl kamarád:
{block #menu}
 <ul class="tree">              
   <li n:foreach="$menu as $item">                
     {$item['title']}    
     {if isset($item['node']['title'])}
       {include #menu, 'menu' => array($item['node'])}
     {elseif count($item['node'])} 
       {include #menu, 'menu' => $item['node']}
     {/if}
   </li>  
 </ul>
{/block}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: