zzwy2/app/model/Category.php

504 lines
15 KiB
PHP
Executable File

<?php
namespace app\model;
use think\Collection;
use think\db\exception\DataNotFoundException;
use think\db\exception\DbException;
use think\db\exception\ModelNotFoundException;
class Category extends Base
{
// 文章类
// 新闻动态
public const CATEGORY_NEWS = 22;
//企业简介
public const CATEGORY_INFO = 3;
//团队管理
public const CATEGORY_TEAM = 6;
//大事记列表
public const CATEGORY_COMPANY_EVENT = 37;
// 企业荣誉
public const CATEGORY_COMPANY_HONOR = 38;
// 品牌活动
public const CATEGORY_BRAND_ACTIVITY = 39;
// 友邻集市服务
public const CATEGORY_MARKET_SERVICE = 40;
//关于我们
public const CATEGORY_COMPANY = 2;
//物业服务
public const CATEGORY_SERVICE = 8;
//新闻碎片
public const CATEGORY_NEWS_BLOCK = 14;
//招聘岗位列表
public const CATEGORY_JOIN_BLOCK = 41;
//新闻碎片
public const CATEGORY_SERVE_BLOCK = 16;
// 案例模版
public const TEMPLATE_NEWS = 'news_list';
// 案例模版
public const TEMPLATE_CASES = 'cases_list';
// 解决方案模版
public const TEMPLATE_SCHEME = 'scheme_list';
// 路由
public const RULE_PRODUCT = 'product';
public const RULE_DOWNLOAD = 'download';
// 内容以文本域形式录入配置,默认内容为富文本形式录入
public static $contentRawCategoryList = [
];
// 允许设置标签的栏目
public static $allowTagCategoryList = [
];
/*
* ====================================================
* 分割线
* ====================================================
*/
//获取首页栏目ID
public static function getIndex()
{
return self::where('is_index', 1)->findOrEmpty()->toArray();
}
/**
* 根据上级ID和语言获取下级栏目
*
* @param $parentId
* @param bool $onlyChild 仅获取下级 默认true false=获取所有后代
* @return array
*/
public static function getChildrenByParentId($parentId, bool $onlyChild = true)
{
if ($parentId <= 0) {
return [];
}
$category = self::getById($parentId);
if (empty($category)) {
return [];
}
if ($onlyChild) {
$where[] = ['c.parent_id', '=', $parentId];
} else {
$where[] = ['c.path', 'like', $category['path'].$parentId.',%'];
}
return self::alias('c')
->leftJoin('model m', 'c.model_id=m.id')
->field('c.*, m.manager, m.template, m.name as modelName')
// ->where('c.parent_id', $parentId)
->where($where)
->order('c.sort', 'asc')
->order('c.id', 'asc')
->select()
->toArray();
}
//重写方法
public static function getById($categoryId)
{
return self::alias('c')
->leftJoin('model m', 'c.model_id = m.id')
->where('c.id', $categoryId)
->field('c.*, m.template')
->findOrEmpty()
->toArray();
}
//查看是否有下级栏目
public static function hasChildren($categoryId)
{
if (is_array($categoryId)) {
$count = self::where('parent_id', 'in', $categoryId)->count();
} else {
$count = self::where(['parent_id' => $categoryId])->count();
}
return $count ? true : false;
}
//获取前台菜单
public static function getListForFrontMenu()
{
$items = self::alias('c')
->leftJoin('model m', 'c.model_id=m.id')
->field('c.*, m.manager, m.template')
->where('c.state', 1)
->where('c.frontend_show', 1)
->order('is_index desc, sort asc')
->select()
->toArray();
return self::getCates($items);
}
/**
* 获取栏目
* @param bool $limit 是否限制查询
* @param array $cates 需要限制查询的栏目IDs
*/
public static function getList($limit = false, $cates = [])
{
if ($limit && empty($cates)) {
return [];
}
return self::alias('c')
->leftJoin('model m', 'c.model_id=m.id')
->field('c.*, m.manager, m.name as modelName')
->when($limit, function ($query) use ($cates) {
$query->whereIn('c.id', $cates);
})
->order('sort', 'asc')
->select()
->toArray();
}
//获取栏目分级列表
public static function getListTree($isMenu = false)
{
if ($isMenu) {
$items = self::where('c.state', 1)->order('sort', 'asc')->select()->toArray();
} else {
$items = self::order('sort', 'asc')->select()->toArray();
}
return self::getCates($items);
}
//获取递归栏目
public static function getCates($cates, $parentId = 0)
{
$menus = [];
foreach ($cates as $cate) {
if ($cate['parent_id'] == $parentId) {
$children = self::getCates($cates, $cate['id']);
if (!empty($children)) {
$cate['children'] = $children;
}
$menus[] = $cate;
}
}
return $menus;
}
public static function onAfterInsert($category)
{
$category->sort = $category->id;
$category->save();
}
//递归获取栏目名称面包屑
public static function getCatesCrumbs($currentId = 0)
{
$crumbs = [];
$category = self::getById($currentId);
if ($category) {
if ($category['parent_id'] != 0) {
$categoryIds = explode(',', trim($category['path'], ','));
$categories = self::where('id', 'in', $categoryIds)->column('*', 'id');
foreach ($categoryIds as $id) {
if (isset($categories[$id])) {
$crumbs[] = $categories[$id]['title'];
}
}
}
$crumbs[] = $category['title'];
}
return $crumbs;
}
//获取栏目中涉及到的文件
public static function getFilesInUse()
{
$items = self::select()->toArray();
$data = [];
foreach ($items as $item) {
$src = trim($item['src']);
if (!empty($src)) {
$key = getKeyByPath($src);
$data[$key] = $src;
}
}
return $data;
}
// 根据栏目路径获取所属的一级栏目ID 0则表示当前栏目是就是一级
public static function firstGradeId($categoryPath, $categoryId)
{
$categoryPath = explode(',', $categoryPath);
$firstCategoryId = $categoryId;
if (isset($categoryPath[2]) && !empty($categoryPath[2])) {
$firstCategoryId = $categoryPath[2];
}
return $firstCategoryId;
}
//当前分类的最高级分类Id
public static function firstGradeById($id)
{
$res = 0;
$item = self::getById($id);
if ($item) {
$res = $id;
if ($item['parent_id'] > 0) {
$items = self::select()->toArray();
$first = self::getFirstGrade($items, $item['parent_id']);
if (!empty($first)) {
$res = $first['id'];
}
}
}
return $res;
}
public static function getFirstGrade($items, $parentId)
{
$data = [];
foreach ($items as $key => $item) {
if ($item['id'] == $parentId) {
if ($item['parent_id'] > 0) {
unset($items[$key]);
$parent = self::getFirstGrade($items, $item['parent_id']);
if (!empty($parent)) {
$data = $parent;
} else {
$data = $item;
}
} else {
$data = $item;
}
}
}
return $data;
}
/**
* 当前分类和子分类
*
* @param int $parentId
* @return array
*/
public static function getCategoryWithChildren(int $parentId)
{
$item = self::getById($parentId);
if ($item) {
$childList = self::getChildrenByParentId($parentId);
$childIds = [];
foreach ($childList as $child) {
$childIds[] = $child['id'];
}
$item['children'] = $childList;
$item['children_ids'] = $childIds;
}
return $item;
}
/**
* 当前分类和子分类的ID集
* @param int $parentId
* @return array|int[]
*/
public static function getCategoryWithChildrenIds(int $parentId)
{
$categoryIds = [$parentId];
$item = self::getCategoryWithChildren($parentId);
if ($item) {
$categoryIds = array_merge($categoryIds, $item['children_ids']);
}
return $categoryIds;
}
public static function getByRuleAlias($alias)
{
return self::where('route', $alias)->findOrEmpty()->toArray();
}
/*
* 设置了路由别名的栏目
* 路由别名长度大的优先排序,路由匹配优先规则
*/
public static function getRouteList()
{
return self::whereRaw('char_length(route) > 0')
->field('id,route,model_id, char_length(route) as alias_len')
->order('alias_len', 'desc')
->select()
->toArray();
}
/**
* 获取所有下级分类
*
* @param int $parentId
* @return Collection
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public static function findAllChildren(int $parentId)
{
return self::whereFindInSet('path', $parentId)->select();
}
/**
* 根据栏目分组ID获取该分组所有的栏目ID集
*
* @param int $groupId
* @return array|int[]
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public static function getGroupCategoryIds(int $groupId)
{
$list = [$groupId];
$items = self::findAllChildren($groupId);
$childrenIds = $items->column('id');
return array_merge($list, $childrenIds);
}
/**
* 判断当前分类是否为文章类
*
* @param int $cateId
*/
public static function isArticle(int $cateId)
{
$item = self::getById($cateId);
$res = false;
if (!empty($item) && $item['model_id'] == Model::MODEL_ARTICLE) {
$res = true;
}
return $res;
}
/**
* 根据栏目标识获取栏目信息
*
* @param string $categoryKey
* @return array|\think\Model|null
* @throws DataNotFoundException
* @throws DbException
* @throws ModelNotFoundException
*/
public static function findByCategoryKey(string $categoryKey)
{
if (strlen($categoryKey) == 0) {
return null;
}
return self::where('category_key', $categoryKey)->find();
}
public static function navList($categoryId = 0)
{
$menus = self::getListForFrontMenu();
$allCategories = Category::getList(false);
foreach ($menus as &$menu) {
$menu['children_ids'] = [];
// $menusGroup = [];
if (isset($menu['children'])) {
$menu['children_ids'] = array_column($menu['children'], 'id');
// foreach ($menu['children'] as $child) {
// $menusGroup[$child['group_name']][] = $child;
// }
}
// $menu['menus_group'] = $menusGroup;
$menu['all_subordinate_ids'] = self::getAllSubordinateIds($allCategories, $menu['id'], true);
$menu['isActive'] = 0;
if ($categoryId == $menu['id'] || in_array($categoryId, $menu['all_subordinate_ids'])) {
$menu['isActive'] = 1;
}
}
$data = [
// 'categoryId' => $categoryId,
'menus' => $menus,
];
// var_dump($menus);exit;
return $data;
}
// 所有下级栏目ID 包含当前栏目ID
private static function getAllSubordinateIds($items, $curId = 0, $containCurrent = false)
{
$list = [];
foreach ($items as $k => $item) {
if ($item['parent_id'] == $curId) {
$list[] = $item['id'];
unset($items[$k]);
$childrenIds = self::getAllSubordinateIds($items, $item['id']);
if ($childrenIds) {
$list = array_merge($list, $childrenIds);
}
}
}
if ($containCurrent) {
$list = array_merge([$curId], $list);
}
return $list;
}
//当前分类的最高级分类Id
public static function getPosition($id)
{
$position = "";
$item = self::getById($id);
if ($item) {
$position = "<a href=\"".getUri($item)."\">{$item['title']}</a>";
if ($item['parent_id'] > 0) {
$items = self::select()->toArray();
$first = self::getPositionGrade($items, $item['parent_id']);
if (!empty($first)) {
$position = $first.$position;
}
}
}
return $position;
}
public static function getPositionGrade($items, $parentId)
{
$data = "";
foreach ($items as $key => $item) {
if ($item['id'] == $parentId) {
$data = "<a href=\"".getUri($item)."\">{$item['title']}</a>";
if ($item['parent_id'] > 0) {
unset($items[$key]);
$parent = self::getFirstGrade($items, $item['parent_id']);
if (!empty($parent)) {
$data = "<a href=\"".getUri($parent)."\">{$parent['title']}</a>".$data;
}
}
}
}
return $data;
}
// 根据栏目路径获取所有上级
public static function categoryPath($categoryPath): array
{
$ids = explode(',', $categoryPath);
$arr = [];
foreach ($ids as $id) {
if ($id > 0) {
$arr[] = $id;
}
}
return Category::whereIn('id', $arr)->field('id,title,src,src_mobile,path,route,url')->select()->toArray();
}
}