// +---------------------------------------------------------------------- namespace Admin\Controller; use Admin\Model\AuthGroupModel; use Think\Page; /** * 后台内容控制器 * @author huajie */ class ArticleController extends AdminController { /* 保存允许访问的公共方法 */ static protected $allow = array( 'draftbox','mydocument'); private $cate_id = null; //文档分类id /** * 检测需要动态判断的文档类目有关的权限 * * @return boolean|null * 返回true则表示当前访问有权限 * 返回false则表示当前访问无权限 * 返回null,则会进入checkRule根据节点授权判断权限 * * @author 朱亚杰 */ protected function checkDynamic(){ $cates = AuthGroupModel::getAuthCategories(UID); switch(strtolower(ACTION_NAME)){ case 'index': //文档列表 case 'add': // 新增 $cate_id = I('cate_id'); break; case 'edit': //编辑 case 'update': //更新 $doc_id = I('id'); $cate_id = M('Document')->where(array('id'=>$doc_id))->getField('category_id'); break; case 'setstatus': //更改状态 case 'permit': //回收站 $doc_id = (array)I('ids'); $cate_id = M('Document')->where(array('id'=>array('in',$doc_id)))->getField('category_id',true); $cate_id = array_unique($cate_id); break; } if(!$cate_id){ return null;//不明 }elseif( !is_array($cate_id) && in_array($cate_id,$cates) ) { return true;//有权限 }elseif( is_array($cate_id) && $cate_id==array_intersect($cate_id,$cates) ){ return true;//有权限 }else{ return false;//无权限 } } /** * 显示左边菜单,进行权限控制 * @author huajie */ protected function getMenu(){ //获取动态分类 $cate_auth = AuthGroupModel::getAuthCategories(UID); //获取当前用户所有的内容权限节点 $cate_auth = $cate_auth == null ? array() : $cate_auth; $cate = M('Category')->where(array('status'=>1))->field('id,title,pid,allow_publish')->order('pid,sort')->select(); //没有权限的分类则不显示 if(!IS_ROOT){ foreach ($cate as $key=>$value){ if(!in_array($value['id'], $cate_auth)){ unset($cate[$key]); } } } $cate = list_to_tree($cate); //生成分类树 //获取分类id $cate_id = I('param.cate_id'); $this->cate_id = $cate_id; //是否展开分类 $hide_cate = false; if(ACTION_NAME != 'recycle' && ACTION_NAME != 'draftbox' && ACTION_NAME != 'mydocument'){ $hide_cate = true; } //生成每个分类的url foreach ($cate as $key=>&$value){ $value['url'] = 'Article/index?cate_id='.$value['id']; if($cate_id == $value['id'] && $hide_cate){ $value['current'] = true; }else{ $value['current'] = false; } if(!empty($value['_child'])){ $is_child = false; foreach ($value['_child'] as $ka=>&$va){ $va['url'] = 'Article/index?cate_id='.$va['id']; if(!empty($va['_child'])){ foreach ($va['_child'] as $k=>&$v){ $v['url'] = 'Article/index?cate_id='.$v['id']; $v['pid'] = $va['id']; $is_child = $v['id'] == $cate_id ? true : false; } } //展开子分类的父分类 if($va['id'] == $cate_id || $is_child){ $is_child = false; if($hide_cate){ $value['current'] = true; $va['current'] = true; }else{ $value['current'] = false; $va['current'] = false; } }else{ $va['current'] = false; } } } } $this->assign('nodes', $cate); $this->assign('cate_id', $this->cate_id); //获取面包屑信息 $nav = get_parent_category($cate_id); $this->assign('rightNav', $nav); //获取回收站权限 $this->assign('show_recycle', IS_ROOT || $this->checkRule('Admin/article/recycle')); //获取草稿箱权限 $this->assign('show_draftbox', C('OPEN_DRAFTBOX')); //获取审核列表权限 $this->assign('show_examine', IS_ROOT || $this->checkRule('Admin/article/examine')); } /** * 分类文档列表页 * @param integer $cate_id 分类id * @param integer $model_id 模型id * @param integer $position 推荐标志 * @param integer $group_id 分组id */ public function index($cate_id = null, $model_id = null, $position = null,$group_id=null){ //获取左边菜单 $this->getMenu(); if($cate_id===null){ $cate_id = $this->cate_id; } if(!empty($cate_id)){ $pid = I('pid',0); // 获取列表绑定的模型 if ($pid == 0) { $models = get_category($cate_id, 'model'); // 获取分组定义 $groups = get_category($cate_id, 'groups'); if($groups){ $groups = parse_field_attr($groups); } }else{ // 子文档列表 $models = get_category($cate_id, 'model_sub'); } if(is_null($model_id) && !is_numeric($models)){ // 绑定多个模型 取基础模型的列表定义 $model = M('Model')->getByName('document'); }else{ $model_id = $model_id ? : $models; //获取模型信息 $model = M('Model')->getById($model_id); if (empty($model['list_grid'])) { $model['list_grid'] = M('Model')->getFieldByName('document','list_grid'); } } $this->assign('model', explode(',', $models)); }else{ // 获取基础模型信息 $model = M('Model')->getByName('document'); $model_id = null; $cate_id = 0; $this->assign('model', null); } //解析列表规则 $fields = array(); $grids = preg_split('/[;\r\n]+/s', trim($model['list_grid'])); foreach ($grids as &$value) { // 字段:标题:链接 $val = explode(':', $value); // 支持多个字段显示 $field = explode(',', $val[0]); $value = array('field' => $field, 'title' => $val[1]); if(isset($val[2])){ // 链接信息 $value['href'] = $val[2]; // 搜索链接信息中的字段信息 preg_replace_callback('/\[([a-z_]+)\]/', function($match) use(&$fields){$fields[]=$match[1];}, $value['href']); } if(strpos($val[1],'|')){ // 显示格式定义 list($value['title'],$value['format']) = explode('|',$val[1]); } foreach($field as $val){ $array = explode('|',$val); $fields[] = $array[0]; } } // 文档模型列表始终要获取的数据字段 用于其他用途 $fields[] = 'category_id'; $fields[] = 'model_id'; $fields[] = 'pid'; $fields[] = 'level'; // 过滤重复字段信息 $fields = array_unique($fields); $template = ''; if(in_array($cate_id,[62,63,64])) { $template = 'app_index'; $fields[] = 'game_name'; } // 列表查询 $list = $this->getDocumentList($cate_id,$model_id,$position,$fields,$group_id); // 列表显示处理 $list = $this->parseDocumentList($list,$model_id); $this->assign('model_id',$model_id); $this->assign('group_id',$group_id); $this->assign('position',$position); $this->assign('groups', $groups); $this->assign('list', $list); $this->assign('list_grids', $grids); $this->assign('model_list', $model); // 记录当前列表页的cookie Cookie('__forward__',$_SERVER['REQUEST_URI']); $this->display($template); } /** * 默认文档列表方法 * @param integer $cate_id 分类id * @param integer $model_id 模型id * @param integer $position 推荐标志 * @param mixed $field 字段列表 * @param integer $group_id 分组id */ protected function getDocumentList($cate_id=0,$model_id=null,$position=null,$field=true,$group_id=null){ /* 查询条件初始化 */ $map = array(); if(isset($_GET['title'])){ $map['title'] = array('like', '%'.(string)I('title').'%'); } if(isset($_GET['status'])){ $map['status'] = I('status'); $status = $map['status']; }else{ $status = null; $map['status'] = array('in', '0,1,2'); } if ( isset($_GET['time-start']) ) { $map['update_time'][] = array('egt',strtotime(I('time-start'))); } if ( isset($_GET['time-end']) ) { $map['update_time'][] = array('elt',24*60*60 + strtotime(I('time-end'))); } if ( isset($_GET['nickname']) ) { $map['uid'] = M('Member')->where(array('nickname'=>I('nickname')))->getField('uid'); } // 构建列表数据 $Document = M('Document'); if($cate_id){ $map['category_id'] = $cate_id; } $map['pid'] = I('pid',0); if($map['pid']){ // 子文档列表忽略分类 unset($map['category_id']); } $Document->alias('DOCUMENT'); if(!is_null($model_id)){ $map['model_id'] = $model_id; if(is_array($field) && array_diff($Document->getDbFields(),$field)){ $modelName = M('Model')->getFieldById($model_id,'name'); $Document->join('__DOCUMENT_'.strtoupper($modelName).'__ '.$modelName.' ON DOCUMENT.id='.$modelName.'.id'); $key = array_search('id',$field); if(false !== $key){ unset($field[$key]); $field[] = 'DOCUMENT.id'; } } } if(!is_null($position)){ $map[] = "position & {$position} = {$position}"; } if(!is_null($group_id)){ $map['group_id'] = $group_id; } $list = $this->lists($Document,$map,'level DESC,DOCUMENT.id DESC',$field); if($map['pid']){ // 获取上级文档 $article = $Document->field('id,title,type')->find($map['pid']); $this->assign('article',$article); } //检查该分类是否允许发布内容 $allow_publish = get_category($cate_id, 'allow_publish'); $this->assign('status', $status); $this->assign('allow', $allow_publish); $this->assign('pid', $map['pid']); $this->meta_title = '文档列表'; return $list; } /** * 设置一条或者多条数据的状态 * @author huajie */ public function setStatus($model='Document'){ return parent::setStatus('Document'); } /** * 文档新增页面初始化 * @author huajie */ public function add(){ //获取左边菜单 $this->getMenu(); $cate_id = I('get.cate_id',0); $model_id = I('get.model_id',0); $group_id = I('get.group_id',''); empty($cate_id) && $this->error('参数不能为空!'); empty($model_id) && $this->error('该分类未绑定模型!'); //检查该分类是否允许发布 $allow_publish = check_category($cate_id); !$allow_publish && $this->error('该分类不允许发布内容!'); // 获取当前的模型信息 $model = get_document_model($model_id); //处理结果 $info['pid'] = $_GET['pid']?$_GET['pid']:0; $info['model_id'] = $model_id; $info['category_id'] = $cate_id; $info['group_id'] = $group_id; if($info['pid']){ // 获取上级文档 $article = M('Document')->field('id,title,type')->find($info['pid']); $this->assign('article',$article); } //获取表单字段排序 $template = ''; if(in_array($cate_id,[62,63,64])) { $template = 'app_add'; $fields = get_model_attribute2($model['id'],[["3","5","453","12","455","24","2"],["9","19","16","10","20","14"]]); } else { $fields = get_model_attribute($model['id']); } $this->assign('info', $info); $this->assign('fields', $fields); $this->assign('type_list', get_type_bycate($cate_id)); $this->assign('model', $model); $this->meta_title = '新增'.$model['title']; $this->display($template); } /** * 文档编辑页面初始化 * @author huajie */ public function edit(){ //获取左边菜单 $this->getMenu(); $id = I('get.id',''); if(empty($id)){ $this->error('参数不能为空!'); } // 获取详细数据 $Document = D('Document'); $data = $Document->detail($id); if(!$data){ $this->error($Document->getError()); } if($data['pid']){ // 获取上级文档 $article = $Document->field('id,title,type')->find($data['pid']); $this->assign('article',$article); } // 获取当前的模型信息 $model = get_document_model($data['model_id']); $this->assign('data', $data); $this->assign('model_id', $data['model_id']); $this->assign('model', $model); //获取表单字段排序 $template = ''; if(in_array($data['category_id'],[62,63,64])) { $template = 'app_edit'; $fields = get_model_attribute2($model['id'],[["3","5","453","12","455","24","2"],["9","19","16","10","20","14"]]); } else { $fields = get_model_attribute($model['id']); } $this->assign('fields', $fields); //获取当前分类的文档类型 $this->assign('type_list', get_type_bycate($data['category_id'])); $this->meta_title = '编辑文档'; $this->display($template); } /** * 更新一条数据 * @author huajie */ public function update(){ // if(empty($_POST['cover_id'])){ // $this->error('封面不能为空'); // } $need_category = [41,42,43,47,48,49,62,63,64]; if(!in_array($_REQUEST['category_id'],$need_category)){ unset($_REQUEST['cover_id']); } if($_REQUEST['game_id']) { $_REQUEST['game_name'] = get_game_name($_REQUEST['game_id']); } $document = D('Document'); $res = $document->update($_REQUEST); if(!$res){ $this->error($document->getError()); }else{ \Think\Log::actionLog('article/update','Document',1); $this->success($res['id']?'更新成功':'新增成功', Cookie('__forward__')); } } /** * 待审核列表 */ public function examine(){ //获取左边菜单 $this->getMenu(); $map['status'] = 2; if ( !IS_ROOT ) { $cate_auth = AuthGroupModel::getAuthCategories(UID); if($cate_auth){ $map['category_id'] = array('IN',$cate_auth); }else{ $map['category_id'] = -1; } } $list = $this->lists(M('Document'),$map,'update_time desc'); //处理列表数据 if(is_array($list)){ foreach ($list as $k=>&$v){ $v['username'] = get_nickname($v['uid']); } } $this->assign('list', $list); $this->meta_title = '待审核'; $this->display(); } /** * 回收站列表 * @author huajie */ public function recycle(){ //获取左边菜单 $this->getMenu(); $map['status'] = -1; if ( !IS_ROOT ) { $cate_auth = AuthGroupModel::getAuthCategories(UID); if($cate_auth){ $map['category_id'] = array('IN',$cate_auth); }else{ $map['category_id'] = -1; } } $list = $this->lists(M('Document'),$map,'update_time desc'); //处理列表数据 if(is_array($list)){ foreach ($list as $k=>&$v){ $v['username'] = get_nickname($v['uid']); } } $this->assign('list', $list); $this->meta_title = '回收站'; $this->display(); } /** * 写文章时自动保存至草稿箱 * @author huajie */ public function autoSave(){ $res = D('Document')->autoSave(); if($res !== false){ $return['data'] = $res; $return['info'] = '保存草稿成功'; $return['status'] = 1; $this->ajaxReturn($return); }else{ $this->error('保存草稿失败:'.D('Document')->getError()); } } /** * 草稿箱 * @author huajie */ public function draftBox(){ //获取左边菜单 $this->getMenu(); $Document = D('Document'); $map = array('status'=>3,'uid'=>UID); $list = $this->lists($Document,$map); //获取状态文字 //int_to_string($list); $this->assign('list', $list); $this->meta_title = '草稿箱'; $this->display(); } /** * 我的文档 * @author huajie */ public function mydocument($status = null, $title = null){ //获取左边菜单 $this->getMenu(); $Document = D('Document'); /* 查询条件初始化 */ // $map['uid'] = UID; if(isset($title)){ $map['title'] = array('like', '%'.$title.'%'); } if(isset($status)){ $map['status'] = $status; }else{ $map['status'] = array('in', '0,1,2'); } if ( isset($_GET['time-start']) ) { $map['update_time'][] = array('egt',strtotime(I('time-start'))); } if ( isset($_GET['time-end']) ) { $map['update_time'][] = array('elt',24*60*60 + strtotime(I('time-end'))); } //只查询pid为0的文章 $map['pid'] = 0; $list = $this->lists($Document,$map,'update_time desc'); $list = $this->parseDocumentList($list,1); // 记录当前列表页的cookie Cookie('__forward__',$_SERVER['REQUEST_URI']); $this->assign('status', $status); $this->assign('list', $list); $this->meta_title = '我的文档'; $this->display(); } /** * 还原被删除的数据 * @author huajie */ public function permit(){ /*参数过滤*/ $ids = I('param.ids'); if(empty($ids)){ $this->error('请选择要操作的数据'); } /*拼接参数并修改状态*/ $Model = 'Document'; $map = array(); if(is_array($ids)){ $map['id'] = array('in', $ids); }elseif (is_numeric($ids)){ $map['id'] = $ids; } $this->restore($Model,$map); } /** * 清空回收站 * @author huajie */ public function clear(){ $res = D('Document')->remove(); if($res !== false){ $this->success('清空回收站成功!'); }else{ $this->error('清空回收站失败!'); } } /** * 移动文档 * @author huajie */ public function move() { if(empty($_POST['ids'])) { $this->error('请选择要移动的文档!'); } session('moveArticle', $_POST['ids']); session('copyArticle', null); $this->success('请选择要移动到的分类!'); } /** * 拷贝文档 * @author huajie */ public function copy() { if(empty($_POST['ids'])) { $this->error('请选择要复制的文档!'); } session('copyArticle', $_POST['ids']); session('moveArticle', null); $this->success('请选择要复制到的分类!'); } /** * 粘贴文档 * @author huajie */ public function paste() { $moveList = session('moveArticle'); $copyList = session('copyArticle'); if(empty($moveList) && empty($copyList)) { $this->error('没有选择文档!'); } if(!isset($_POST['cate_id'])) { $this->error('请选择要粘贴到的分类!'); } $cate_id = I('post.cate_id'); //当前分类 $pid = I('post.pid', 0); //当前父类数据id //检查所选择的数据是否符合粘贴要求 $check = $this->checkPaste(empty($moveList) ? $copyList : $moveList, $cate_id, $pid); if(!$check['status']){ $this->error($check['info']); } if(!empty($moveList)) {// 移动 TODO:检查name重复 foreach ($moveList as $key=>$value){ $Model = M('Document'); $map['id'] = $value; $data['category_id']= $cate_id; $data['pid'] = $pid; //获取root if($pid == 0){ $data['root'] = 0; }else{ $p_root = $Model->getFieldById($pid, 'root'); $data['root'] = $p_root == 0 ? $pid : $p_root; } $res = $Model->where($map)->save($data); } session('moveArticle', null); if(false !== $res){ $this->success('文档移动成功!'); }else{ $this->error('文档移动失败!'); } }elseif(!empty($copyList)){ // 复制 foreach ($copyList as $key=>$value){ $Model = M('Document'); $data = $Model->find($value); unset($data['id']); unset($data['name']); $data['category_id'] = $cate_id; $data['pid'] = $pid; $data['create_time'] = NOW_TIME; $data['update_time'] = NOW_TIME; //获取root if($pid == 0){ $data['root'] = 0; }else{ $p_root = $Model->getFieldById($pid, 'root'); $data['root'] = $p_root == 0 ? $pid : $p_root; } $result = $Model->add($data); if($result){ $logic = D(get_document_model($data['model_id'],'name'),'Logic'); $data = $logic->detail($value); //获取指定ID的扩展数据 $data['id'] = $result; $res = $logic->add($data); } } session('copyArticle', null); if($res){ $this->success('文档复制成功!'); }else{ $this->error('文档复制失败!'); } } } /** * 检查数据是否符合粘贴的要求 * @author huajie */ protected function checkPaste($list, $cate_id, $pid){ $return = array('status'=>1); $Document = D('Document'); // 检查支持的文档模型 $modelList = M('Category')->getFieldById($cate_id,'model'); // 当前分类支持的文档模型 foreach ($list as $key=>$value){ //不能将自己粘贴为自己的子内容 if($value == $pid){ $return['status'] = 0; $return['info'] = '不能将编号为 '.$value.' 的数据粘贴为他的子内容!'; return $return; } // 移动文档的所属文档模型 $modelType = $Document->getFieldById($value,'model_id'); if(!in_array($modelType,explode(',',$modelList))) { $return['status'] = 0; $return['info'] = '当前分类的文档模型不支持编号为 '.$value.' 的数据!'; return $return; } } // 检查支持的文档类型和层级规则 $typeList = M('Category')->getFieldById($cate_id,'type'); // 当前分类支持的文档模型 foreach ($list as $key=>$value){ // 移动文档的所属文档模型 $modelType = $Document->getFieldById($value,'type'); if(!in_array($modelType,explode(',',$typeList))) { $return['status'] = 0; $return['info'] = '当前分类的文档类型不支持编号为 '.$value.' 的数据!'; return $return; } $res = $Document->checkDocumentType($modelType, $pid); if(!$res['status']){ $return['status'] = 0; $return['info'] = $res['info'].'。错误数据编号:'.$value; return $return; } } return $return; } /** * 文档排序 * @author huajie */ public function sort(){ if(IS_GET){ //获取左边菜单 $this->getMenu(); $ids = I('get.ids'); $cate_id = I('get.cate_id'); $pid = I('get.pid'); //获取排序的数据 $map['status'] = array('gt',-1); if(!empty($ids)){ $map['id'] = array('in',$ids); }else{ if($cate_id !== ''){ $map['category_id'] = $cate_id; } if($pid !== ''){ $map['pid'] = $pid; } } $list = M('Document')->where($map)->field('id,title')->order('level DESC,id DESC')->select(); $this->assign('list', $list); $this->meta_title = '文档排序'; $this->display(); }elseif (IS_POST){ $ids = I('post.ids'); $ids = array_reverse(explode(',', $ids)); foreach ($ids as $key=>$value){ $res = M('Document')->where(array('id'=>$value))->setField('level', $key+1); } if($res !== false){ $this->success('排序成功!'); }else{ $this->error('排序失败!'); } }else{ $this->error('非法请求!'); } } public function change_value($id,$value,$field) { if(IS_POST) { if(!is_numeric($id) || $id<1) {$this->ajaxReturn(['status'=>0,'info'=>'数据有误'],'json');} if(!is_numeric($value) || $value<1) {$this->ajaxReturn(['status'=>0,'info'=>'请输入正整数'],'json');} if(empty($field)) {$this->ajaxReturn(['status'=>0,'info'=>'数据有误'],'json');} $result = M('document')->where(['id'=>$id])->setField($field,$value); $v = M('attribute')->field('title')->where(['name'=>$field])->find(); $name = ''; if(!empty($v)) {$name = $v['title'];} if($result) { $this->ajaxReturn(['status'=>1,'info'=>$name.'修改成功'],'json'); } else { $this->ajaxReturn(['status'=>0,'info'=>$name.'修改失败'],'json'); } } else { $this->ajaxReturn(['status'=>0,'info'=>'请求有误'],'json'); } } public function pop_rules($row = 10, $p = 1) { $map = []; $map['_string'] = " 1=1 "; if (isset($_GET['time-start'])) { $map['_string'] .= " and operate_time >= " . strtotime($_GET['time-start']); } if (isset($_GET['time-end'])) { $map['_string'] .= " and operate_time < " . (strtotime($_GET['time-end']) + 86400); } if (isset($_GET['type'])) { $map['type'] = $_GET['type']; } if (!empty($_GET['title'])) { $map['title'] = ['like', "%{$_GET['title']}%"]; } $list = M('document_pop_rules')->where($map)->page($p, $row)->select(); $count = M('document_pop_rules')->where($map)->count(); if (!empty($list)) { $weekDes = ["一", "二", '三', '四', '五', '六', '日']; $statusDes = ['1'=>'执行完成', '2'=>'下架', '3'=>'待执行']; foreach ($list as &$item) { switch ($item['type']) { case '1': $item['time_desc'] = date("Y-m-d", $item['pop_time']); break; case '2': $item['time_desc'] = "每周".$weekDes[$item['pop_time']-1]; break; } } } $page = set_pagination($count, $row); if ($page) { $this->assign('_page', $page); } $this->assign('list_data', $list); $this->display('pop_rules'); } public function pop_rule_edit($id=0) { if (IS_POST) { if (empty($_POST['title']) || empty($_POST['desc']) || !isset($_POST['sort']) || empty($_POST['content'])) { return $this->error("请填写完整的内容"); } if (!is_numeric($_POST['sort'])) { return $this->error("权重值需为数字"); } if (!empty($_POST['type']) && empty($_POST['pop_time'])) { return $this->error("请选择弹窗时间"); } if ($_POST['type'] == 1 ) { $_POST['pop_time'] = strtotime($_POST['pop_time']); } if ($id) { $pop_rules_model = M('document_pop_rules');//M('$this->$model_name','tab_'); $res = $pop_rules_model->where(['id'=>$id])->save($_POST); return $res ? $this->success("更新成功") : $this->error("更新失败"); } else { $pop_rules_model = M('document_pop_rules');//M('$this->$model_name','tab_'); $data = $_POST; $data['operate_time'] = time(); $data['operater_id'] = is_login(); $data['status'] = 1; $res = $pop_rules_model->add($data); return $res ? $this->success("新增完成", U('Article/pop_rules')) : $this->error("新增失败"); } } else { if($id) { if ($_GET['delete']) { $pop_rules_model = M('document_pop_rules');//M('$this->$model_name','tab_'); $res = $pop_rules_model->where(['id'=>$id])->delete(); return $res ? $this->success("删除成功") : $this->error("删除失败"); } $rule = M('document_pop_rules')->where(['id'=>$id])->find(); if (!$rule) { return $this->error('记录不存在'); } $rule['pop_time'] = $rule['type'] == 1 ? date("Y-m-d", $rule['pop_time']) : $rule['pop_time']; $this->assign('rule', $rule); } } $this->display('pop_rule_edit'); } }