ywtc_api/application/other/admin/Category.php

288 lines
10 KiB
PHP
Raw Permalink Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
/**
* Created by coder loomis.li
* User: coder loomi
* Date: 2022/09/06 15:02
*/
namespace app\other\admin;
use app\admin\controller\Admin;
use think\Db;
use app\common\builder\ZBuilder;
use app\other\model\ProductCategory as ProductCategoryModel;
/**
* 商品类别控制器
* @package app\product\admin
*/
class Category extends Admin
{
/**
* 商品类别列表
* @author loomis <2477365162@qq.com>
* @return mixed
*/
public function index()
{
// 保存模块排序
if ($this->request->isPost()) {
$modules = $this->request->post('sort/a');
if ($modules) {
foreach ($modules as $key => $module) {
$data[] = [
'id' => $module,
'sort' => $key + 1
];
}
$ProductCategoryModel = new ProductCategoryModel();
if (false !== $ProductCategoryModel->saveAll($data)) {
return $this->success('保存成功');
} else {
return $this->error('保存失败');
}
}
}
$data_list = ProductCategoryModel::getMenusByGroup();
$max_level = $this->request->get('max', 0);
$this->assign('menus', $this->getNestMenu($data_list, $max_level));
$this->assign('page_title', '类别管理');
return $this->fetch();
}
/**
* 新增类别
* @author loomis <2477365162@qq.com>
*/
public function add($module = 'admin', $pid = '')
{
// 保存数据
if ($this->request->isPost()) {
$data = $this->request->post();
// 验证
$result = $this->validate($data, 'Category');
// 验证失败 输出错误信息
if(true !== $result) return $this->error($result);
$data['UID'] = UID;
if ($menu = ProductCategoryModel::create($data)) {
return $this->success('新增成功',url('index'));
} else {
return $this->error('新增失败');
}
} else {
$category_list = ProductCategoryModel::getMenuTree(0, '', $module);
// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->setPageTitle('新增类别')
->addFormItems([
['image', 'thumb', '缩略图'],
['select', 'pid', '所属类别', '所属上级类别', $category_list, $pid],
['text', 'title', '类别标题'],
['radio', 'is_index', '是否首页显示', '',[0=>'不显示',1=>'显示'],0],
])
->addIcon('icon', '图标', '导航图标')
->addText('sort', '排序', '', 100)
->layout(['pid' => '8', 'title' => '8', 'icon' => '8', 'sort' => '8'])
->fetch();
}
}
/**
* 编辑类别
* @param int $id 类别ID
* @author loomis <2477365162@qq.com>
* @return mixed
*/
public function edit($id = 0)
{
if ($id === 0) return $this->error('缺少参数');
// 保存数据
if ($this->request->isPost()) {
$data = $this->request->post();
// 验证
$result = $this->validate($data, 'Category');
// 验证失败 输出错误信息
if(true !== $result) return $this->error($result);
if (ProductCategoryModel::update($data)) {
return $this->success('编辑成功', url('index'));
} else {
return $this->error('编辑失败');
}
}
// 获取数据
$info = ProductCategoryModel::get($id);
// 使用ZBuilder快速创建表单
return ZBuilder::make('form')
->setPageTitle('编辑类别')
->addFormItem('hidden', 'id')
->addFormItem('image', 'thumb', '缩略图')
->addFormItem('select', 'pid', '所属类别', '所属上级类别', ProductCategoryModel::getMenuTree(0, '', $info['module']))
->addFormItem('text', 'title', '类别标题')
->addFormItem('radio', 'is_index', '是否首页显示','', [0=>'不显示',1=>'显示'])
->addIcon('icon', '图标', '导航图标')
->addText('sort', '排序', '', 100)
->layout(['pid' => '8', 'title' => '8', 'icon' => '8', 'sort' => '8'])
->setFormData($info)
->fetch();
}
/**
* 删除类别
* @return mixed
*/
public function delete($record = [])
{
$id = $this->request->param('id');
$menu = ProductCategoryModel::where('id', $id)->find();
if ($menu['system_menu'] == '1') return $this->error('系统类别,禁止删除');
// 获取该类别的所有后辈类别id
$menu_childs = ProductCategoryModel::getChildsId($id);
// 要删除的所有类别id
$all_ids = array_merge([(int)$id], $menu_childs);
// 删除类别
if (ProductCategoryModel::destroy($all_ids)) {
return $this->success('删除成功');
} else {
return $this->error('删除失败');
}
}
/**
* 保存类别排序
* @return mixed
*/
public function save()
{
if ($this->request->isPost()) {
$data = $this->request->post();
if (!empty($data)) {
$menus = $this->parseMenu($data['menus']);
foreach ($menus as $menu) {
if ($menu['pid'] == 0) {
ProductCategoryModel::update(array('sort'=>$menu['sort']),array('id'=>$menu['id']));
}else{
ProductCategoryModel::update(array('pid'=>$menu['pid'],'sort'=>$menu['sort']),array('id'=>$menu['id']));
}
}
return $this->success('保存成功');
} else {
return $this->error('没有需要保存的类别');
}
}
return $this->error('非法请求');
}
/**
* 递归解析类别
* @param array $menus 类别数据
* @param int $pid 上级类别id
* @return array 解析成可以写入数据库的格式
*/
private function parseMenu($menus = [], $pid = 0)
{
$sort = 1;
$result = [];
foreach ($menus as $menu) {
$result[] = [
'id' => (int)$menu['id'],
'pid' => (int)$pid,
'sort' => $sort,
];
if (isset($menu['children'])) {
$result = array_merge($result, $this->parseMenu($menu['children'], $menu['id']));
}
$sort ++;
}
return $result;
}
/**
* 获取嵌套式类别
* @param array $lists 原始类别数组
* @param int $pid 父级id
* @param int $max_level 最多返回多少层0为不限制
* @param int $curr_level 当前层数
*/
private function getNestMenu($lists = [], $max_level = 0, $pid = 0, $curr_level = 1)
{
$result = '';
foreach ($lists as $key => $value) {
if ($value['pid'] == $pid) {
$disable = $value['status'] == 0 ? 'dd-disable' : '';
$isindex = $value['is_index']==1?'(首页显示)':null;
// 组合类别
$result .= '<li class="dd-item dd3-item '.$disable.'" data-id="'.$value['id'].'">';
$result .= '<div class="dd-handle dd3-handle">拖拽</div><div class="dd3-content"><i class="'.$value['icon'].'"></i> '.$value['title'].$isindex;
if ($value['url_value'] != '') {
$result .= '<span class="link"><i class="fa fa-link"></i> '.$value['url_value'].'</span>';
}
$result .= '<div class="action">';
$result .= '<a href="'.url('add', ['module' => $value['module'], 'pid' => $value['id']]).'" data-toggle="tooltip" data-original-title="新增子类别"><i class="list-icon fa fa-plus fa-fw"></i></a><a href="'.url('edit', ['id' => $value['id']]).'" data-toggle="tooltip" data-original-title="编辑"><i class="list-icon fa fa-pencil fa-fw"></i></a>';
if ($value['status'] == 0) {
// 启用
$result .= '<a href="javascript:void(0);" data-ids="'.$value['id'].'" class="enable" data-toggle="tooltip" data-original-title="启用"><i class="list-icon fa fa-check-circle-o fa-fw"></i></a>';
} else {
// 禁用
$result .= '<a href="javascript:void(0);" data-ids="'.$value['id'].'" class="disable" data-toggle="tooltip" data-original-title="禁用"><i class="list-icon fa fa-ban fa-fw"></i></a>';
}
$result .= '<a href="'.url('delete', ['id' => $value['id'], 'table' => 'product_category']).'" data-toggle="tooltip" data-original-title="删除" class="ajax-get confirm"><i class="list-icon fa fa-times fa-fw"></i></a></div>';
$result .= '</div>';
if ($max_level == 0 || $curr_level != $max_level) {
unset($lists[$key]);
// 下级类别
$children = $this->getNestMenu($lists, $max_level, $value['id'], $curr_level + 1);
if ($children != '') {
$result .= '<ol class="dd-list">'.$children.'</ol>';
}
}
$result .= '</li>';
}
}
return $result;
}
/**
* 启用类别
*/
public function enable($record = [])
{
$id = input('param.ids');
$menu = ProductCategoryModel::where('id', $id)->update(['status'=>1]);
$this->success('操作成功');
}
/**
* 禁用类别
*/
public function disable($record = [])
{
$id = input('param.ids');
$menu = ProductCategoryModel::where('id', $id)->update(['status'=>0]);
$this->success('操作成功');
}
}