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

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

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

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

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