official_website/app/admin/controller/Column.php

638 lines
25 KiB
PHP
Raw Normal View History

2024-12-02 13:57:08 +08:00
<?php
/**
* @Descripttion : FOXCMS 是一款高效的 PHP 多端跨平台内容管理系统
* @Author : FoxCMS Team
* @Date : 2023/6/26 14:35
* @version : V1.08
* @copyright : ©2021-现在 贵州黔狐科技股份有限公司 版权所有
* @LastEditTime : 2023/6/26 14:35
*/
namespace app\admin\controller;
use app\common\model\AuthRule;
use app\common\model\Column as ColumnModel;
use app\common\model\ColumnLevel;
use app\common\model\DictData as DictDataModel;
use app\common\controller\AdminBase;
use app\common\util\PinyinUtil;
use think\facade\Db;
use think\facade\View;
class Column extends AdminBase
{
private $modelRecords;
private $extraModlRecords = [['id' => 'formmodel', 'title' => '表单模型', 'reference_model' => 0]]; //额外增加的模型
public function initialize()
{
parent::initialize();
//缩略图
$columnLevels = ColumnLevel::select();
$columnLevel = ['level' => 3, 'is_thumb' => 1];
if (sizeof($columnLevels) > 0) {
$columnLevel = $columnLevels[0];
}
View::assign("columnLevel", $columnLevel);
//模型
$modelRecordTs = (new \app\common\model\ModelRecord())->field("nid as id, name as title, reference_model")->where(['status' => 1])->select()->toArray();
$modelRecordTs = array_merge($modelRecordTs, $this->extraModlRecords);
$this->modelRecords = $modelRecordTs;
View::assign("modelRecords", $modelRecordTs);
//会员模型
$where = ['status' => 1];
$mList = (new \app\common\model\MemberLevel())->field("id, name")->where($where)->order('create_time', 'desc')->select()->toArray();
array_unshift($mList, ["id" => "0", "name" => "开放浏览"]);
View::assign("mList", $mList); //模型数据
$action = $this->request->action();
if ($action == "columnSet") {
//应用表单
$formList = \app\common\model\FormList::field("id,name")->select();
View::assign("formList", $formList);
}
}
public function index()
{
$columnDatas = ColumnModel::where([['lang', '=', $this->getMyLang()]])->order('level asc')->order('sort asc')->select();
$columnList = $this->channelLevel($columnDatas);
View::assign("columnList", $columnList);
return view('index');
}
// 返回多层栏目
private function channelLevel($dataArr, $pid = 0, $fieldPri = 'id', $fieldPid = 'pid', $level = 1)
{
if (empty($dataArr)) {
return array();
}
$rArr = [];
foreach ($dataArr as $v) {
if ($v[$fieldPid] == $pid) {
$arr = array();
$arr['columnId'] = $v->id;
$arr['nid'] = $v->nid;
$arr['columnName'] = $v->name;
$arr['isShow'] = $v->status;
$arr['columnSort'] = $v->sort;
$arr['model'] = $v->column_model;
$arr['level'] = $level;
$arr['pic_url'] = $v->pic_url;
$arr['pic_ids'] = $v->pic_ids;
$arr['children'] = self::channelLevel($dataArr, $v[$fieldPri], $fieldPri, $fieldPid, $level + 1);
foreach ($this->modelRecords as $k => $vo) {
if ($vo['id'] == $v->column_model) {
$arr['modelTitle'] = $vo['title'];
break;
}
}
array_push($rArr, $arr);
}
}
return $rArr;
}
// 查询栏目模型
public function getColumModels()
{
$dictDatas = (new \app\common\model\ModelRecord())->field("nid as id, name as title")->where(['status' => 1])->select()->toArray();
$dictDatas = array_merge($dictDatas, $this->extraModlRecords);
$this->success('查询成功', '', $dictDatas);
}
public function deleteColumn()
{
$param = $this->request->param();
if (empty($param['id'])) {
$this->error('参数不能为空');
}
$id = intval($param['id']);
$columnList = ColumnModel::where(['pid' => $id])->select();
if (sizeof($columnList) > 0) {
$this->error('删除失败,有子栏目');
}
$fcolumn = ColumnModel::field("nid,name")->find($id);
if (!$fcolumn) {
$this->error("操作失败,没找到对应栏目");
}
$r = ColumnModel::where('nid', $fcolumn['nid'])->delete();
if ($r) {
xn_add_admin_log("删除栏目“{$fcolumn['name']}", "column"); //添加日志
$this->success('删除成功');
}
$this->error("操作失败");
}
public function save()
{
$param = $this->request->post();
if (!array_key_exists('columns', $param)) {
$this->error('保存失败参数不存在');
}
$columns = json_decode($param['columns']);
$clang = $this->getMyLang();
if (sizeof($columns) > 0) {
try {
$index = 1;
foreach ($columns as $key => $column) {
$this->saveColumn($column, 0, 1, '', $index, $clang);
$index++;
}
} catch (\Exception $e) {
$this->error('保存栏目失败,' . $e->getMessage());
}
} else {
$this->error('保存失败栏目数据不能为空');
}
xn_add_admin_log("添加栏目", "column"); //添加日志
//多语言复制
try {
$langList = Db::name('lang')->field("lang,name")->where([['status', '=', 1], ['lang', '<>', $clang]])->select()->toArray();
foreach ($langList as $key => $item) {
$this->copyColumns($clang, $item['lang']);
}
} catch (\Exception $e) {
}
$this->success('保存成功');
}
private function saveColumn($column, $pid = 0, $level = 1, $tier = '', $sort = 1, $lang = "")
{
$coumnModel = new ColumnModel();
$sc = [
'name' => $column->name,
'pic_ids' => $column->pic_ids,
'pid' => $pid,
'level' => $level,
'column_model' => $column->column_model,
'status' => $column->status,
'sort' => $sort,
'lang' => $lang
];
$id = $column->id;
$updateColumn = [];
if (!empty($column->id)) {
$sc['id'] = $column->id;
$oldColumnModel = ColumnModel::find($column->id);
if ($oldColumnModel && $oldColumnModel['column_model'] != $column->column_model) {
$v_path = $this->getVPath($column->column_model);
$sc['v_path'] = $v_path;
}
$sc['column_template'] = $oldColumnModel['column_template'];
$sc['model_template'] = $oldColumnModel['model_template'];
$coumnModel->update($sc);
} else {
$v_path = $this->getVPath($sc["column_model"]);
$en_name = PinyinUtil::utf8_to($sc["name"]); //栏目拼音
$sc['dir_path'] = "/" . $en_name;
$sc['en_name'] = $en_name;
$sc['v_path'] = $v_path;
$coumnModel->save($sc);
$id = $coumnModel->id;
$updateColumn['nid'] = "s" . $id;
}
if (empty($tier)) {
$tier .= $id;
} else {
$tier .= ',' . $id;
}
$updateColumn['id'] = $id;
$updateColumn['tier'] = $tier;
$coumnModel::update($updateColumn);
if (sizeof($column->colunms) > 0) {
$index = 1;
foreach ($column->colunms as $key => $col) {
$this->saveColumn($col, $id, ($level + 1), $tier, $index, $lang);
$index++;
}
}
}
// 添加编辑图片分组
public function addOrEdit()
{
$param = $this->request->param();
if (!empty($param['dictValue'])) {
$dictDataModel = DictDataModel::where(['dict_value' => $param['dictValue'], 'dict_type' => 'fox_pic_group_type'])->find();
$dictDataModel->dict_label = $param['dictLabel'];
$dictDataModel->save();
$this->success('更新成功');
} else {
//先查分组
$dict_value = DictDataModel::field('dict_value')->where(['dict_type' => 'fox_pic_group_type'])->max('dict_value');
$saveData = ['dict_label' => $param['dictLabel']];
$saveData['dict_value'] = intval($dict_value) + 1;
$saveData['dict_sort'] = intval($dict_value) + 2;
$saveData['dict_type'] = 'fox_pic_group_type';
$saveData['remark'] = '图片添加分组';
$saveData['type'] = 'custom';
$dictDataModel = new DictDataModel();
$dictDataModel->save($saveData);
$this->success('保存成功');
}
}
public function delete()
{
$param = $this->request->param();
if (empty($param['dictValue'])) {
$this->error('参数不能为空');
}
$dictValue = intval($this->request->get('dictValue'));
$isD = DictDataModel::where(['dict_value' => $dictValue, 'dict_type' => 'fox_pic_group_type'])->delete();
if (!$isD) {
$this->error('删除失败');
}
xn_add_admin_log("删除栏目", "column"); //添加日志
$this->success('删除成功');
}
// 栏目设置
public function columnSet()
{
$param = $this->request->param();
//查询
$lang = xn_cfg("base.lang");
$bcid = $param['bcid'];
View::assign('bcid', $bcid);
$ids = explode('_', $bcid);
$authRuleId = $ids[sizeof($ids) - 1]; //栏目id
$authRule = AuthRule::find($authRuleId);
$bcidStr = str_replace(",", "_", $authRule->tier);
$breadcrumb = AuthRule::getBreadcrumb($bcidStr);
array_push($breadcrumb, ['id' => '', 'title' => '栏目设置', 'name' => DIRECTORY_SEPARATOR . config('adminconfig.admin_path') . '/column/columnSet', 'url' => 'javascript:void(0)']);
View::assign("breadcrumb", $breadcrumb);
if (empty($param['id'])) {
$this->error('栏目id参数不能为空');
}
$id = $param['id'];
View::assign('id', $id);
if ($this->request->isAjax()) {
$oldColumnModel = ColumnModel::find($param["id"]);
// if($oldColumnModel['nid'] != $param['nid']){
// //判断当前语言下标识是否存在
// $fList = ColumnModel::where([['lang','=', $lang],['nid','=',$param['nid']]])->select();
// if(sizeof($fList) > 0){
// $this->error("当前语言下标识已存在");
// }
// }
if (!empty($param['dir_path'])) {
$param['dir_path'] = add_slash($param['dir_path']);
} else {
$en_name = implode("", PinyinUtil::utf8_to($param["name"])); //栏目拼音
$param['dir_path'] = add_slash($en_name);
}
if ($oldColumnModel["column_model"] != $param["column_model"]) {
$v_path = $this->getVPath($param["column_model"]);
$param['v_path'] = $v_path;
}
$ret = ColumnModel::update($param);
if ($ret) {
//修改其子栏目的模型
$inherit_option = intval($param['inherit_option']);
//批量修改继承选项栏目
try {
if ($inherit_option == 1) { //继承选项栏目模板风格 0:不继承1:继承
$sql = "update fox_column set column_template = '{$param['column_template']}',model_template = '{$param['model_template']}' where FIND_IN_SET({$param['id']}, tier)>0 and id != {$param['id']} and column_model = '{$param['column_model']}'";
Db::execute($sql);
}
} catch (\Exception $e) {
$e->getMessage();
}
$this->success('操作成功');
} else {
$this->error("操作失败");
}
}
$column = ColumnModel::find($id);
$iew_suffix = config('view.view_suffix');
if (empty($column->column_template)) { //栏目模型文件名
$mr = \app\common\model\ModelRecord::where('nid', $column->column_model)->find();
if ($mr && $mr['reference_model'] == 0) {
$column["column_template"] = "list_" . $column->column_model . ".{$iew_suffix}";
$column["model_template"] = "view_" . $column->column_model . ".{$iew_suffix}";
} else {
$column["column_template"] = "index_" . $column->column_model . ".{$iew_suffix}";
}
}
//模型
$modelTitle = '';
foreach ($this->modelRecords as $k => $vo) {
if ($vo['id'] == $column->column_model) {
$modelTitle = $vo['title'];
break;
}
}
View::assign('model', '/home/');
//查询所有栏目
$columnList = \app\common\model\Column::where([['level', '<=', 3], ['lang', '=', $this->getMyLang()]])->order('level asc')->select();
$columns = [['name' => '顶层栏目', 'id' => 0, "pid" => 0]];
foreach ($columnList as $k => $cm) {
array_push($columns, ["name" => $cm["name"], "id" => $cm["id"]]);
if (empty($column['innerColumnText']) && !empty($column['inner_column']) && ($column['inner_column'] == $cm["id"])) {
$column['innerColumnText'] = $cm["name"];
}
}
$columnListC = $this->channelLevel($columnList);
View::assign('columnListC', $columnListC);
$column["modelTitle"] = $modelTitle; //模型
//是否显示栏目数据显示
$columnCount = \app\common\model\Column::where("pid", $id)->count();
View::assign('columnCount', $columnCount);
if ($columnCount > 0) { //查询本栏目及指定子栏目
$rColumnList = get_column_down($id, $column["column_model"]);
$limit_column = $column["limit_column"];
$limitColumnTextArr = []; //限制栏目
if (!empty($limit_column)) {
$limitColumnIdArr = explode(",", $limit_column);
foreach ($limitColumnIdArr as $limitColumnId) {
foreach ($rColumnList as $rColumn) {
if ($limitColumnId == $rColumn["id"]) {
array_push($limitColumnTextArr, $rColumn['name']);
$rColumn["is_active"] = "is-active";
break;
}
}
}
View::assign('limitColumnIdArr', $limitColumnIdArr);
}
View::assign('rColumnList', $rColumnList);
View::assign('limitColumnText', implode(",", $limitColumnTextArr));
}
//特殊模型
if (!empty($column['form_list_id'])) { //应用表单id
$formL = \app\common\model\FormList::field("name")->find($column['form_list_id']);
if ($formL) {
$column['formTitle'] = $formL['name'];
}
}
//表单地址
$apply = \app\common\model\Apply::where(['status' => 1, 'name' => '自定义表单'])->find();
$formUrl = url("Apply/index") . "?columnId=42&type=1";
if ($apply) {
if (!empty($apply["path"])) {
$path = $apply['mark'] . $apply["path"];
$url = url($path) . "?columnId=" . $apply['column_id'];
if (!empty($apply['auth_rule_ids'])) {
$url = $url . "&ruleIds=" . $apply['auth_rule_ids'];
}
$formUrl = $url . "&type=1";
}
}
$column['formUrl'] = $formUrl;
$ocList = \app\common\model\Column::where([['lang', '<>', $lang], ['column_model', '=', $column['column_model']]])->order('level asc')->order('sort asc')->select();
$ocList = $this->channelLevel($ocList);
View::assign('ocList', $ocList);
return view('column_set', ['column' => $column, 'columns' => $columns, "activepath" => $this->relativeTemplateHtml]);
}
// 选择模型
public function temp()
{
$activepath = $this->request->param('activepath') ?? $this->relativeTemplateHtml;
$activepath = replaceSymbol($activepath);
if (str_ends_with($activepath, "/")) {
$activepath = substr($activepath, 0, -1);
}
$basePath = root_path() . DIRECTORY_SEPARATOR . 'templates' . $activepath;
$basePath = replaceSymbol($basePath);
$fArr = array();
$arr_file = getDirFile($basePath, $activepath, $fArr, $this->template['template']);
$this->success('查询成功==' . $activepath, null, $arr_file);
}
// 查询所有栏目
public function getColumns()
{
$param = $this->request->param();
$where = [["lang", "=", $this->getMyLang()]];
if (array_key_exists("columnModel", $param) && !empty($param['columnModel'])) {
array_push($where, ['column_model', '=', $param['columnModel']]);
}
$columnDatas = ColumnModel::where($where)->field('id,name as title')->order('level asc')->order('sort asc')->select();
$this->success("查询成功", null, $columnDatas);
}
public function look($columnId, $lookNum)
{
$inde_url = resetIndexUrl("/index", $this->getMyLang());
$url = $inde_url;
$columnModel = new ColumnModel();
$columnO = $columnModel->find($columnId);
if (!$columnO) {
$this->redirect($url);
exit();
}
if ($lookNum == 1) { //内容
$model = $columnO["column_model"];
$bcid = str_replace(",", "_", $columnO["tier"]);
if ($model == 'single') {
$model = 'single_c';
}
$url = url(DIRECTORY_SEPARATOR . config("adminconfig.admin_path") . DIRECTORY_SEPARATOR . "$model", ["columnId" => $columnId, "bcid" => $bcid]);
$this->redirect($url);
exit();
} elseif ($lookNum == 2) { //浏览
if ($columnO["column_attr"] == 0) {
$url = resetUrl($columnO['v_path'], $columnO["id"], $this->getMyLang());
} elseif ($columnO["column_attr"] == 1) { //外部链接
$url = $columnO['out_link_head'] . $columnO['out_link'];
} elseif ($columnO["column_attr"] == 2) { //内链栏目
$inner_column = $columnO['inner_column'];
if (!empty($columnO['inner_column'])) {
$columnInner = \app\common\model\Column::find($inner_column);
if ($columnInner) {
$vPath = $columnInner["v_path"];
$url = resetUrl($vPath, $inner_column);
} else {
$url = $inde_url;
}
} else {
$url = $inde_url;
}
}
$url = replaceSymbol($url);
$this->redirect($url);
exit();
}
}
// 查询栏目是否有数据
public function checkData()
{
$param = $this->request->param();
if (!(array_key_exists('column_id', $param))) {
$this->error("参数不存在");
}
$column = \app\common\model\Column::field('column_model,nid')->find($param['column_id']);
if (!$column) {
$this->error("没查到栏目数据");
}
$columnList = \app\common\model\Column::field("column_model as old_model, id as column_id")->where(['nid' => $column['nid']])->select()->toArray();
$rlist = [];
foreach ($columnList as $key => $item) {
$item['data_rm'] = $param['data_rm'];
$item['model'] = $param['model'];
$rlist[] = $item;
}
$this->success("查询成功", "", $rlist);
}
// 切换类似文章模型
public function modelSwitch()
{
$param = $this->request->param();
if (
empty($param['model'])
|| empty($param['column_id'])
|| empty($param['old_model'])
|| ($param['data_rm'] != 0 && empty($param['data_rm']))
) {
$this->error("参数为空");
}
if ($param['data_rm'] == 0 && $param['model'] != "formmodel") {
$column = \app\common\model\Column::field('column_model')->find($param['column_id']);
if (!$column) {
$this->error("没查到栏目数据");
}
$findFieldArr = array_unique(xn_cfg("list")); //表字段
$fieldArr = [];
foreach ($findFieldArr as $field) {
$field = str_replace("`", "", $field);
if ($field != "id") {
array_push($fieldArr, $field);
}
}
//查询以前模型数据
$oldModelDataList = Db::name($column['column_model'])->where("column_id", $param['column_id'])->select();
$saveList = [];
foreach ($oldModelDataList as $omd) {
$save = [];
foreach ($fieldArr as $field) {
$save[$field] = $omd[$field];
}
array_push($saveList, $save);
}
if (sizeof($saveList) > 0) {
$r = Db::name($param['model'])->insertAll($saveList);
if ($r) {
Db::name($column['column_model'])->where("column_id", $param['column_id'])->delete(); //删除之前模型数据
} else {
$this->error("操作失败");
}
}
}
$column_model = $param['model'];
$v_path = $this->getVPath($column_model);
$r = \app\common\model\Column::update(['id' => $param['column_id'], 'column_model' => $column_model, 'v_path' => $v_path]);
if (!$r) {
$this->error("操作失败");
}
$this->success("操作成功");
}
// 复制语言栏目
public function copyLangColumn()
{
$lang = $this->request->param("lang", "");
if (empty($lang)) {
$this->error("缺少参数,操作失败");
}
$curLang = $this->getMyLang(); //当前语言
if ($lang == $curLang) {
$this->error("同语言不允许复制哟");
}
try {
$this->copyColumns($lang, $curLang);
} catch (\Exception $e) {
$this->error('复制栏目失败,' . $e->getMessage());
}
$this->success("操作成功");
}
//复制语言多栏目
private function copyColumns($lang, $curLang)
{
$fieldArr = \think\facade\Db::name("column")->getFields(); //表属性
$copyFields = [];
$filterFields = ["id", "pid", "tier", "limit_column", "inner_column", "lang"];
foreach ($fieldArr as $key => $field) {
if (!in_array($key, $filterFields)) {
$copyFields[] = $key;
}
}
$columnDatas = ColumnModel::where([['lang', '=', $lang]])->order('level asc')->order('sort asc')->select()->toArray();
$columnList = $this->columnLevel($columnDatas, $copyFields);
$index = 1;
foreach ($columnList as $key => $column) {
$this->copyColumn($column, 0, 1, '', $index, $curLang);
$index++;
}
}
//返回多栏目
private function columnLevel($dataArr, $copyFields = [], $pid = 0, $fieldPri = 'id', $fieldPid = 'pid', $level = 1)
{
if (empty($dataArr)) {
return array();
}
$rArr = [];
foreach ($dataArr as $v) {
if ($v[$fieldPid] == $pid) {
$arr = array();
foreach ($copyFields as $key => $field) {
$arr[$field] = $v[$field];
}
$arr['children'] = self::columnLevel($dataArr, $copyFields, $v[$fieldPri], $fieldPri, $fieldPid, $level + 1);
array_push($rArr, $arr);
}
}
return $rArr;
}
//复制栏目
private function copyColumn($column, $pid = 0, $level = 1, $tier = '', $sort = 1, $lang = "")
{
$column['sort'] = $sort;
$columnModel = new ColumnModel();
$fColumn = $columnModel->where(['lang' => $lang, 'nid' => $column['nid']])->find();
if ($fColumn) {
$id = $fColumn['id'];
$tier = $fColumn['tier'];
} else {
$column['lang'] = $lang;
$column['pid'] = $pid;
$columnModel->save($column);
$id = $columnModel->id;
if (empty($tier)) {
$tier .= $id;
} else {
$tier .= ',' . $id;
}
}
$columnModel::update(['id' => $id, 'tier' => $tier]);
if (sizeof($column['children']) > 0) {
$index = 1;
foreach ($column['children'] as $key => $col) {
$this->copyColumn($col, $id, ($level + 1), $tier, $index, $lang);
$index++;
}
}
}
}