Рекурсивный вывод данных

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Goog1e
Сообщения: 97
Зарегистрирован: 2016.01.18, 20:02

Рекурсивный вывод данных

Сообщение Goog1e »

Всем привет!!
Нужно вывести дерево меню!
Не могу найти оптимальный вариант, как вывести, через виджет или renderFile(рекурсивно, чтобы html не тоскать туда-сюда)

Стоит ли так делать?

Код: Выделить всё

<div class="dd">
    <?= \Yii::$app->view->renderFile('@backend/views/menu/menu-item.php',['menuItem' => $menuItem]) ?>
</div>
menu-item.php

Код: Выделить всё

<ol class="dd-list">

<?php foreach ($menuItem as $item): ?>

    <li class="dd-item" data-id="<?= $item->id ?>">
        <div class="pull-right item_actions">
            <div class="btn-sm btn-danger pull-right delete grid-button pmd-btn-raised pmd-ripple-effect" data-id="<?= $item->id ?>">
                <i class="material-icons pmd-grid-icon">delete_sweep</i> Delete
            </div>
        </div>
        <div class="dd-handle">
            <span><?= $item->name ?></span> <small class="url"><?= $item->url ?></small>
        </div>
        <?php if(!empty($item->children)): ?>
            <?= \Yii::$app->view->renderFile('@backend/views/menu/menu-item.php', ['menuItem' => $item->children]) ?>
        <?php endif; ?>
    </li>
<?php endforeach; ?>

</ol>

Nex-Otaku
Сообщения: 831
Зарегистрирован: 2016.07.09, 21:07

Re: Рекурсивный вывод данных

Сообщение Nex-Otaku »

Через рекурсию, как у вас - вполне нормальный способ.

Goog1e
Сообщения: 97
Зарегистрирован: 2016.01.18, 20:02

Re: Рекурсивный вывод данных

Сообщение Goog1e »

Код: Выделить всё

<?= \Yii::$app->view->renderFile('@backend/views/menu/menu-item.php', ['menuItem' => $item->children]) ?>
Я каждый рас подключаю файл в рекурсии.Мне кажется это лишние действия.
Да и поиск по потомкам, создает лишние запросы в бд.

Нашел такой вариант, пытаюсь понять
https://github.com/paulzi/yii2-adjacency-list

Tagir1111111111
Сообщения: 21
Зарегистрирован: 2016.01.07, 21:47

Re: Рекурсивный вывод данных

Сообщение Tagir1111111111 »

Это можно сделать в контроллере
private function getMenuItems($categories, $activeId = null, $parent = null)
{
$menuItems = [];
foreach ($categories as $category) {
if ($category->parent_id === $parent) {
$menuItems[$category->id] = [
'active' => $activeId === $category->id,
'label' => $category->title,
'url' => ['catalog/list', 'id' => $category->id],
'items' => $this->getMenuItems($categories, $activeId, $category->id),
];
}
}
return $menuItems;
}
и вывести в вьюшке подобным образом
<?= Menu::widget([
'items' => $menuItems,
'options' => [
'class' => 'menu',
],
]) ?>

Goog1e
Сообщения: 97
Зарегистрирован: 2016.01.18, 20:02

Re: Рекурсивный вывод данных

Сообщение Goog1e »

Что вышло
Изображение

Код: Выделить всё

                        <div class="dd">
                            <?= MenuItem::widget(['menuItem' => $menuItem]) ?>
                        </div>

Код: Выделить всё

class MenuItem extends Widget
{

    public $menuItem;

    /**
     * Renders the widget.
     */
    public function run()
    {
        return $this->renderItems($this->menuItem);
    }

    /**
     * Renders widget items.
     */
    public function renderItems($items)
    {
        $lines = [];
        foreach ($items as $item) {
            $lines[] = $this->renderItem($item);
        }
        return Html::tag('ol', implode("\n", $lines), ['class' => 'dd-list']);
    }

    /**
     * @param $item
     * @return string
     */
    public function renderItem($item)
    {
        $name = ArrayHelper::getValue($item, 'name');
        $id =  ArrayHelper::getValue($item, 'id');
        $url = ArrayHelper::getValue($item, 'url', '');

        $icon = Html::tag(
            'i',
            'delete_sweep',
            ['class' => "material-icons pmd-grid-icon"]
        );
        $btn = Html::tag(
            'div',
            $icon . Yii::t('backend', 'Delete') ,
            [
                'class' => "btn-sm btn-danger pull-right delete grid-button pmd-btn-raised pmd-ripple-effect",
                'data-id' => $id
            ]
        );
        $action = Html::tag(
            'div',
            $btn ,
            ['class' => "pull-right item_actions"]
        );
        $handle = Html::tag(
            'div',
            '<span>' . $name . '</span><small class="url">' . $url .'</small>',
            ['class' => "dd-handle"]
        );

        $items =  $item->getChildren()->all();
        if ($items !== null) {
            if (is_array($items)) {
                $items = $this->renderItems($items);
            }
        }
        return Html::tag('li', $action . $handle . $items, ['class' => "dd-item", 'data-id' => $id]);
    }
}

Goog1e
Сообщения: 97
Зарегистрирован: 2016.01.18, 20:02

Re: Рекурсивный вывод данных

Сообщение Goog1e »

https://github.com/paulzi/yii2-adjacency-list
Я думаю он будет лишним, хотя подключил и настроил, в будушем может пригодится

Ответить