Yii2 как на примере вывести чекбоксы?

Всем доброй ночи!

Есть категория в ней есть подкатегория , а также в ней есть еще одна категория.
Хочу сделать как на примере картинке
1 - Спойлер названия категории.
2 - В подкатегории они не должны быть активными только текст
3 - А вот под подкатегоиии должны быть чебоксами

Не могу понять как это реализовать.

fd54e8e5076e4fa5bb030e6c70df479d.png

В папке components есть файл CategoryWidget.php

ниже код

<?php

namespace app\components;

use Yii;
use yii\base\Widget;
use app\models\Category;

class CategoryWidget extends Widget
{
    public $tpl;
    public $model;
    public $data;
    public $tree;
    public $menuHtml;

    public function init()
    {
        parent::init();
        if ($this->tpl === null) {
            $this->tpl = 'category';
        }
        $this->tpl .= '.php';
    }

    public function run()
    {
        // get cache
//        if ($this->tpl == 'category.php') {
//            $menu = Yii::$app->cache->get('category');
//            if ($menu) return $menu;
//        }

        $this->data = Category::find()
            ->indexBy('id')
            ->orderBy('sortOrder')
            ->asArray()
            ->all();
        $this->tree = $this->getTree();
        $this->menuHtml = $this->getMenuHtml($this->tree);
        // set cache
//        if ($this->tpl == 'category.php') {
//            Yii::$app->cache->set('category', $this->menuHtml, 60);
//        }
        return $this->menuHtml;
    }

    protected function getTree()
    {
        $tree = [];

        foreach ($this->data as $id => &$node) {
            if (!$node['parent_id']) {
                $tree[$id] = &$node;
            } else {
                $this->data[$node['parent_id']]['children'][$node['id']] = &$node;
            }
        }
        return $tree;
    }

    protected function getMenuHtml($tree){
        $str = '';
        foreach ($tree as $category) {
            $str .= $this->catToTemplate($category);
        }
        return $str;
    }

    protected function catToTemplate($category)
    {
        ob_start();
        include __DIR__ . '/category_tpl/' . $this->tpl;
        return ob_get_clean();
    }

}


В папке components есть папка category_tpl, а в папке есть category.php
ниже его код
<ul>
    <li>
        <div class="spoiler-title"><?= $category['title'] ?></div>
        <div class="spoiler-body">
            <?php if (isset($category['children'])): ?><br/>
                <?= $this->getMenuHtml($category['children']) ?>
            <?php endif; ?>
        </div>
    </li>
</ul>
<br/>


во вьюхе происходит рендер

<?= CategoryWidget::widget(['tpl' => 'category']) ?>

Вот так у меня выводятся категории!

048ce036a4744f80a209b7137b1f4b88.png

Как на первой картинки мне надо так реализовать!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Ребята помогите, кто может!
Заранее спасибо!
  • Вопрос задан
  • 326 просмотров
Пригласить эксперта
Ответы на вопрос 1
webinar
@webinar Куратор тега Yii
Учим yii: https://youtu.be/-WRMlGHLgRg
1. Многоуровневые деревья проще хранить по принципу nestedSets
2. Что у Вас в /category_tpl/' . $this->tpl непонятно и самое главное не понятно зачем там include.
3. Для начала сформируйте нужный массив (в вашем случае с третим уровнем вложенности), потом передавайте во вью и стройте там хоть чекбоксы, хоть замки из песка. Для этого видимо надо почитать про рекурсивные функции.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы