@morricone85

Как вывести в виджете элементы неограниченного уровня вложенности?

Здравствуйте! Есть виджет

<?php echo Nav::widget([
      'items' => $categories,
      'options' => ['class' =>'categories'],
  ]);
 ?>

Формирую массив:
foreach($rows as $key => $value)
  {
         .......
        if($value['level'] == 1)
        {  
        $arr[$value['parent']]['label'] = $value['name'];
        $arr[$value['parent']]['url'] = $value['seo'];
       }
       else if($value['level'] == 2)
       {  
         $arr[$value['parent']]['items'][$key]['label'] = $value['name'];
         $arr[$value['parent']]['items'][$key]['url'] = $value['seo'];
      }
    }


А теперь, вопрос: как в зтом виджете сформировать массив для вложенных элементов 3 -... уровней, или, легче свой написать.
Спасибо.
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 1
В целом задача с неограниченно вложенностью решается рекурсией.

Вот сильно упрощенный и безбожно порезанный код, который собирает и выводит дерево. Использовать его в таком виде толку мало, но суть будет ясна.

class NavWidget extends Widget
{

    public $items = [];

    /**
     * Renders the menu.
     */
    public function run()
    {
        $items = $this->items;
        if (!empty($items)) {
            echo Html::tag('ul', $this->renderItems($items));
        }
    }


    protected function renderItems($items)
    {
        $lines = [];
        foreach ($items as $item) {
            $menu = $this->renderItem($item);
            if (!empty($item['items'])) {
                $menu .= Html::tag('ul', $this->renderItems($item['items']));
            }
            $lines[] = Html::tag('li', $menu);
        }
        return implode("\n", $lines);
    }


    protected function renderItem($item)
    {
        $link = 'Тут собранная ссылка';
        return $link;
    }
}


P.S. А вообще, всё отлично видно и понятно в стандартных виджетах типа yii\widgets\Menu и в данном случае он всё это сделает прекрасно. Если что-то надо изменить, можно от него унаследоваться.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы