DeviceCatCheckbox.php 1.99 KB
<?php

namespace app\ht\modules\device\widgets;

use domain\device\DeviceCatRepository;
use yii\base\Widget;
use function in_array;
use function array_multisort;

class DeviceCatCheckbox extends Widget
{
    public $selected;

    public function run()
    {
        $nodes = DeviceCatRepository::getDeviceCatList();
        $params = [
            'data' => $this->buildTree($nodes, 0, $this->selected),
        ];
        echo $this->render( 'device_cat_checkbox', $params);
    }

    /**
     *
     * 构造树数据
     * @param $catDatas 一维数组
     * @param int $parentId 父ID
     * @param int $selectedId 默认选中
     * @return array 返回树状的数组
     */
    private  function buildTree($catDatas, $parentId = 0, $selectedIds = [])
    {
        // 处理送过来的数据
        $catDatas = (array)$catDatas;
        $parentId = (int)$parentId;

        /**
         * 处理数据
         */
        $treeChilds = [];

        foreach ($catDatas AS $i => $catData) {
            if ($catData['parent_id'] == $parentId) {
                $child = [];
                $child['id'] = $catData['id'];
                $child['text'] = $catData['name'];
                $child['sort_order'] = $catData['sort_order'];

                if (in_array($catData['id'], $selectedIds)) {
                    $child['checked'] = true;
                } else {
                    $child['checked'] = false;
                }

                // 删除已调用的数组
                unset($catDatas[$i]);

                // 回调数据
                $buildTree = self::buildTree( $catDatas, $catData['id'], $selectedIds);
                $child['children'] = !empty($buildTree) ? $buildTree : false;

                $treeChilds[] = $child;

            }
        }

        // 排序
        $sortOrders = [];
        foreach ($treeChilds as $child) {
            $sortOrders[] = $child['sort_order'];
        }
        array_multisort($sortOrders, SORT_ASC, $treeChilds);

        return $treeChilds;
    }
}