ClassService.class.php 7.22 KB
<?php
/**
 * Created by PhpStorm.
 * User: liyifei2012it
 * Date: 17/4/12
 * Time: 10:46
 */
namespace Common\Service;

use Common\Common\Collection;
use Common\Common\Constant;
use Common\Model\ArticleModel;
use Common\Model\ClassModel;

class ClassService extends AbstractService
{
    // 构造方法
    public function __construct()
    {
        parent::__construct();
        $this->_d = new ClassModel();
    }

    /**
     * 唯一分类名检查
     * @author tangxingguo
     * @param string $class_name 分类名
     * @param int $class_id 分类ID
     * @return bool
     */
    public function uniqueName($class_name, $class_id = 0)
    {
        if ($class_id > 0) {

            $conds = [
                'class_name' => $class_name,
                'class_id != ?' => $class_id,
            ];
        } else {

            $conds = ['class_name' => $class_name];
        }

        $count = $this->count_by_conds($conds);
        if ($count > 0) {

            return false;
        }

        return true;
    }

    /**
     * 取分类等级
     * @author tangxingguo
     * @param int $classId 分类ID
     * @param int $level 分类等级(0=分类不存在;1=一级分类;2=二级分类;3=三级分类)
     */
    public function getLevel($classId, &$level = 0)
    {
        static $classList;
        if (empty($classList)) {

            $classList = $this->list_all();
            $classList = array_combine_by_key($classList, 'class_id');
        }

        $classInfo = isset($classList[$classId]) ? $classList[$classId] : [];
        if (empty($classInfo)) {

            return;
        }

        $level++;
        if ($classInfo['parent_id'] > 0) {

            $this->getLevel($classInfo['parent_id'], $level);
        } elseif ($classInfo['parent_id'] == 0) {

            return;
        }
    }

    /**
     * 根据层级格式化分类数据
     * @author tangxingguo
     * @param array $list 分类数据
     * @param int $parentId 父ID
     * @return array 格式化后的数据
     */
    public function formatClass($list, $parentId = 0)
    {
        $return = [];
        foreach ($list as $class) {

            if ($class['parent_id'] == $parentId) {

                foreach ($list as $child) {

                    if ($child['parent_id'] == $class['class_id']) {

                        $class['child'] = $this->formatClass($list, $class['class_id']);
                        break;
                    } else {

                        $class['child'] = [];
                    }
                }

                $return[] = $class;
            }
        }
        return $return;
    }

    /**
     * 分类数据格式化为树状结构
     * @author liyifei
     * @param array $list 分类数据
     * @return array 格式化后的数据
     */
    public function formatTreeClass($list)
    {
        $tree = [];

        foreach ($list as $class_id => $item) {
            if (isset($list[$item['parent_id']])){
                $list[$item['parent_id']]['child'][] = &$list[$class_id];

            } else {
                $tree[] = &$list[$class_id];
            }
        }

        return $tree;
    }

    /**
     * @desc 获取所有已启用的分类ID(父类禁用子类不显示)
     * @author tangxingguo
     */
    public function getOpenClassIds()
    {
        $classServ = new ClassService();
        $classList = $classServ->list_all();

        $classIds = [];
        $topClassIds = [];// 一级分类ID
        if (!empty($classList)) {

            // 格式化分类
            $classList = array_combine_by_key($classList, 'class_id');
            foreach ($classList as $k => $v) {

                if ($v['parent_id'] != 0) {

                    $classList[$v['parent_id']]['child'][] = &$classList[$k];
                } else {

                    $topClassIds[] = $v['class_id'];
                }
            }

            // 取已开启的二级分类以及其子分类
            foreach ($classList as $key => $value) {
                // 父级是否开启
                $parentIsOpen = isset($classList[$value['parent_id']]) ? ($classList[$value['parent_id']]['is_open'] != Constant::CLASS_IS_OPEN_FALSE) : false;
                // 非一级分类 + 当前分类已开启 + 父级分类已开启
                if ($value['parent_id'] != 0 && Constant::CLASS_IS_OPEN_TRUE == $value['is_open'] && $parentIsOpen) {

                    $classIds[] = $value['class_id'];
                }
            }
        }

        return array_merge($classIds, $topClassIds);
    }

    /**
     * 获取顶级分类信息
     * @author liyifei
     * @param int $classId 子分类ID
     * @return array
     */
    public function getTopClass($classId)
    {
        // 获取分类
        $class_list = $this->list_all();
        $class_list = array_combine_by_key($class_list, 'class_id');

        // 获取一级分类
        while ($class_list[$classId]['parent_id'] > 0) {

            $classId = $class_list[$classId]['parent_id'];
        }

        return $class_list[$classId];
    }

    /**
     * 获取ICON详情
     * @param string $article_id 文章ID
     * @return array
     */
    public function get_icon_data($article_id = '')
    {

        // 实例化课程表
        $service = new ArticleModel();
        // 获取对应课程详情
        $info = $service->get($article_id);

        // 获取课程顶级分类信息
        $class = $this->getTopClass($info['class_id']);

        // 初始化收藏类
        $collection = new Collection();
        // 获取ICON详情
        $icon_info = $collection->get_icon_info([
            'app_dir' => APP_DIR,
            'app_identifier' => APP_IDENTIFIER,
            'data_category_id' => $class['class_id']
        ]);

        $data = [
            'icon_title' => $icon_info['title'],
            'icon_id' => $icon_info['recommender_id'],
            'data_category_id' => $icon_info['data_category_id'],
            'data_category_name' => empty($class['class_name']) ? '' : $class['class_name']
        ];

        return $data;
    }

    /**
     * 以树形结构格式化数据库数据
     * @author liyifei
     * @return array
     */
    public function formatDB()
    {
        // 所有分类列表
        $tree = $this->list_all();
        if (empty($tree)) {

            return [];
        }

        $tree = array_combine_by_key($tree, 'class_id');

        foreach ($tree as $k => $v) {

            if ($v['parent_id'] != 0) {

                $tree[$v['parent_id']]['child'][$v['class_id']] = &$tree[$k];
            }
        }

        return $tree;
    }

    /**
     * 获取当前分类及所有子分类ID
     * @author liyifei
     * @param int $classId 分类ID
     * @param array $tree 分类树形结构
     * @param array $childIds 收集子分类ID
     * @return array
     */
    public function getChildClassIds($classId, $tree = [], $childIds = [])
    {
        if (empty($tree)) {

            $tree = $this->formatDB();
        }

        $childIds[] = $classId;

        if (isset($tree[$classId]['child'])) {

            foreach ($tree[$classId]['child'] as $v) {

                $childIds = $this->getChildClassIds($v['class_id'], $tree[$classId]['child'], $childIds);
            }
        }

        return $childIds;
    }
}