* Date: 2018-4-3 */ namespace app\admin\controller; use think\Db; use think\Page; use app\common\logic\ArctypeLogic; class Archives extends Base { // 允许发布文档的模型ID public $allowReleaseChannel = array(); public function _initialize() { parent::_initialize(); $this->allowReleaseChannel = config('global.allow_release_channel'); } /** * 内容管理 */ public function index() { $arctype_list = array(); // 目录列表 $arctypeLogic = new ArctypeLogic(); $where['is_del'] = '0'; // 回收站功能 $arctype_list = $arctypeLogic->arctype_list(0, 0, false, 0, $where, false); $zNodes = "["; foreach ($arctype_list as $key => $val) { $current_channel = $val['current_channel']; if (!empty($val['weapp_code'])) { // 插件栏目 $typeurl = weapp_url($val['weapp_code'].'/'.$val['weapp_code'].'/index'); } else { if (6 == $current_channel) { $gourl = url('Arctype/single_edit', array('typeid'=>$val['id'])); $typeurl = url("Arctype/single_edit", array('typeid'=>$val['id'],'gourl'=>$gourl)); } else if (8 == $current_channel) { $typeurl = url("Guestbook/index", array('typeid'=>$val['id'], 'archives'=>1)); } else { $typeurl = url('Archives/index_archives', array('typeid'=>$val['id'])); } } $typename = $val['typename']; $zNodes .= "{"."id:{$val['id']}, pId:{$val['parent_id']}, name:\"{$typename}\", url:'{$typeurl}',target:'content_body'"; /*默认展开一级栏目*/ if (empty($val['parent_id'])) { $zNodes .= ",open:true"; } /*--end*/ /*栏目有下级栏目时,显示图标*/ if (1 == $val['has_children']) { $zNodes .= ",isParent:true"; } else { $zNodes .= ",isParent:false"; } /*--end*/ $zNodes .= "},"; } $zNodes .= "]"; $this->assign('zNodes', $zNodes); return $this->fetch(); } /** * 内容管理 - 所有文档列表风格(只针对ey_archives表,排除单页记录) */ public function index_archives() { $assign_data = array(); $condition = array(); // 获取到所有URL参数 $param = input('param.'); $flag = input('flag/s'); $typeid = input('typeid/d', 0); /*跳转到指定栏目的文档列表*/ if (0 < intval($typeid)) { $row = Db::name('arctype') ->alias('a') ->field('b.ctl_name,b.id') ->join('__CHANNELTYPE__ b', 'a.current_channel = b.id', 'LEFT') ->where('a.id', 'eq', $typeid) ->find(); $ctl_name = $row['ctl_name']; $current_channel = $row['id']; if (6 == $current_channel) { $gourl = url('Arctype/single_edit', array('typeid'=>$typeid)); $gourl = url("Arctype/single_edit", array('typeid'=>$typeid,'gourl'=>$gourl)); $this->redirect($gourl); } else if (8 == $current_channel) { $gourl = url("Guestbook/index", array('typeid'=>$typeid)); $this->redirect($gourl); } } /*--end*/ // 应用搜索条件 foreach (['keywords','typeid','flag','is_release'] as $key) { if (isset($param[$key]) && $param[$key] !== '') { if ($key == 'keywords') { $condition['a.title'] = array('LIKE', "%{$param[$key]}%"); } else if ($key == 'typeid') { $typeid = $param[$key]; $hasRow = model('Arctype')->getHasChildren($typeid); $typeids = get_arr_column($hasRow, 'id'); /*权限控制 by 小虎哥*/ $admin_info = session('admin_info'); if (0 < intval($admin_info['role_id'])) { $auth_role_info = $admin_info['auth_role_info']; if(! empty($auth_role_info)){ if(isset($auth_role_info['only_oneself']) && 1 == $auth_role_info['only_oneself']){ $condition['a.admin_id'] = $admin_info['admin_id']; } if(! empty($auth_role_info['permission']['arctype'])){ if (!empty($typeid)) { $typeids = array_intersect($typeids, $auth_role_info['permission']['arctype']); } } } } /*--end*/ $condition['a.typeid'] = array('IN', $typeids); } else if ($key == 'flag') { if ('is_release' == $param[$key]) { $condition['a.users_id'] = array('gt', 0); } else { $condition['a.'.$param[$key]] = array('eq', 1); } // } else if ($key == 'is_release') { // if (0 < intval($param[$key])) { // $condition['a.users_id'] = array('gt', intval($param[$key])); // } } else { $condition['a.'.$key] = array('eq', $param[$key]); } } } /*权限控制 by 小虎哥*/ if (empty($typeid)) { $typeids = []; $admin_info = session('admin_info'); if (0 < intval($admin_info['role_id'])) { $auth_role_info = $admin_info['auth_role_info']; if(! empty($auth_role_info)){ if(isset($auth_role_info['only_oneself']) && 1 == $auth_role_info['only_oneself']){ $condition['a.admin_id'] = $admin_info['admin_id']; } if(! empty($auth_role_info['permission']['arctype'])){ $typeids = $auth_role_info['permission']['arctype']; } } } if (!empty($typeids)) { $condition['a.typeid'] = array('IN', $typeids); } } /*--end*/ if (empty($typeid)) { // 只显示允许发布文档的模型,且是开启状态 $channelIds = Db::name('channeltype')->where('status',0) ->whereOr('id','IN',[6,8])->column('id'); $condition['a.channel'] = array('NOT IN', $channelIds); } else { // 只显示当前栏目对应模型下的文档 $current_channel = Db::name('arctype')->where('id',$typeid)->getField('current_channel'); $condition['a.channel'] = array('eq', $current_channel); } /*多语言*/ $condition['a.lang'] = array('eq', $this->admin_lang); /*--end*/ /*回收站数据不显示*/ $condition['a.is_del'] = array('eq', 0); /*--end*/ /*自定义排序*/ $orderby = input('param.orderby/s'); $orderway = input('param.orderway/s'); if (!empty($orderby)) { $orderby = "a.{$orderby} {$orderway}"; $orderby .= ", a.aid desc"; } else { $orderby = "a.aid desc"; } /*end*/ /** * 数据查询,搜索出主键ID的值 */ $count = DB::name('archives')->alias('a')->where($condition)->count('aid');// 查询满足要求的总记录数 $Page = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数 $list = DB::name('archives') ->field("a.aid,a.channel") ->alias('a') ->where($condition) ->order($orderby) ->limit($Page->firstRow.','.$Page->listRows) ->getAllWithIndex('aid'); /** * 完善数据集信息 * 在数据量大的情况下,经过优化的搜索逻辑,先搜索出主键ID,再通过ID将其他信息补充完整; */ if ($list) { $aids = array_keys($list); $fields = "b.*, a.*, a.aid as aid"; $row = DB::name('archives') ->field($fields) ->alias('a') ->join('__ARCTYPE__ b', 'a.typeid = b.id', 'LEFT') ->where('a.aid', 'in', $aids) ->getAllWithIndex('aid'); /*获取当页文档的所有模型*/ $channelIds = get_arr_column($list, 'channel'); $channelRow = Db::name('channeltype')->field('id, ctl_name, ifsystem') ->where('id','IN',$channelIds) ->getAllWithIndex('id'); $assign_data['channelRow'] = $channelRow; /*--end*/ foreach ($list as $key => $val) { $row[$val['aid']]['arcurl'] = get_arcurl($row[$val['aid']]); $row[$val['aid']]['litpic'] = handle_subdir_pic($row[$val['aid']]['litpic']); // 支持子目录 $list[$key] = $row[$val['aid']]; } } $show = $Page->show(); // 分页显示输出 $assign_data['page'] = $show; // 赋值分页输出 $assign_data['list'] = $list; // 赋值数据集 $assign_data['pager'] = $Page; // 赋值分页对象 // 栏目ID $assign_data['typeid'] = $typeid; // 栏目ID /*当前栏目信息*/ $arctype_info = array(); if ($typeid > 0) { $arctype_info = M('arctype')->field('typename,current_channel')->find($typeid); } $assign_data['arctype_info'] = $arctype_info; /*--end*/ /*允许发布文档列表的栏目*/ $assign_data['arctype_html'] = allow_release_arctype($typeid, array()); /*--end*/ /*前台URL模式*/ $assign_data['seo_pseudo'] = tpCache('seo.seo_pseudo'); $this->assign($assign_data); return $this->fetch('index_archives'); } /** * 内容管理 - 栏目展开风格 */ private function index_arctype() { $arctype_list = array(); // 目录列表 $arctypeLogic = new ArctypeLogic(); $arctype_list = $arctypeLogic->arctype_list(0, 0, false, 0, array(), false); $this->assign('arctype_list', $arctype_list); // 模型列表 $channeltype_list = getChanneltypeList(); $this->assign('channeltype_list', $channeltype_list); // 栏目最多级别 $arctype_max_level = intval(config('global.arctype_max_level')); $this->assign('arctype_max_level', $arctype_max_level); // 允许发布文档的模型 $this->assign('allow_release_channel', $this->allowReleaseChannel); return $this->fetch('index_arctype'); } /** * 发布文档 */ public function add() { $typeid = input('param.typeid/d', 0); if (!empty($typeid)) { $row = Db::name('arctype') ->alias('a') ->field('b.ctl_name,b.id,b.ifsystem') ->join('__CHANNELTYPE__ b', 'a.current_channel = b.id', 'LEFT') ->where('a.id', 'eq', $typeid) ->find(); $data = [ 'typeid' => $typeid, ]; if (empty($row['ifsystem'])) { $ctl_name = 'Custom'; $data['channel'] = $row['id']; } else { $ctl_name = $row['ctl_name']; } $gourl = url('Archives/index_archives', array('typeid'=>$typeid)); $data['gourl'] = $gourl; $jumpUrl = url("{$ctl_name}/add", $data); } else { $jumpUrl = url("Archives/release"); } $this->redirect($jumpUrl); } /** * 编辑文档 */ public function edit() { $id = input('param.id/d', 0); $typeid = input('param.typeid/d', 0); $row = Db::name('archives') ->alias('a') ->field('a.channel,b.ctl_name,b.id,b.ifsystem') ->join('__CHANNELTYPE__ b', 'a.channel = b.id', 'LEFT') ->where('a.aid', 'eq', $id) ->find(); if (empty($row['channel'])) { $channelRow = Db::name('channeltype')->field('id as channel, ctl_name') ->where('nid','article') ->find(); $row = array_merge($row, $channelRow); } $data = [ 'id' => $id, ]; if (empty($row['ifsystem'])) { $ctl_name = 'Custom'; $data['channel'] = $row['id']; } else { $ctl_name = $row['ctl_name']; } $arcurl = input('param.arcurl/s'); $data['arcurl'] = $arcurl; $jumpUrl = url("{$ctl_name}/edit", $data); $this->redirect($jumpUrl); } /** * 删除文档 */ public function del() { if (IS_POST) { $del_id = input('del_id/a'); $thorough = input('thorough/d', 0); $archivesLogic = new \app\admin\logic\ArchivesLogic; $archivesLogic->del($del_id, $thorough); } } /** * 移动 */ public function move() { if (IS_POST) { $post = input('post.'); $typeid = !empty($post['typeid']) ? eyIntval($post['typeid']) : ''; $aids = !empty($post['aids']) ? eyIntval($post['aids']) : ''; if (empty($typeid) || empty($aids)) { $this->error('参数有误,请联系技术支持'); } // 获取移动栏目的模型ID $current_channel = Db::name('arctype')->where([ 'id' => $typeid, 'lang' => $this->admin_lang, ])->getField('current_channel'); // 抽取相符合模型ID的文档aid $aids = Db::name('archives')->where([ 'aid' => ['IN', $aids], 'channel' => $current_channel, 'lang' => $this->admin_lang, ])->column('aid'); // 移动文档处理 $update_data = array( 'typeid' => $typeid, 'update_time' => getTime(), ); $r = M('archives')->where([ 'aid' => ['IN', $aids], ])->update($update_data); if($r){ adminLog('移动文档-id:'.$aids); $this->success('操作成功'); }else{ $this->error('操作失败'); } } $typeid = input('param.typeid/d', 0); /*允许发布文档列表的栏目*/ $allowReleaseChannel = []; if (!empty($typeid)) { $channelId = Db::name('arctype')->where('id',$typeid)->getField('current_channel'); $allowReleaseChannel[] = $channelId; } $arctype_html = allow_release_arctype($typeid, $allowReleaseChannel); $this->assign('arctype_html', $arctype_html); /*--end*/ /*不允许发布文档的模型ID,用于JS判断*/ // $js_allow_channel_arr = '[]'; // if (!empty($allowReleaseChannel)) { // $js_allow_channel_arr = '['; // foreach ($allowReleaseChannel as $key => $val) { // if ($key > 0) { // $js_allow_channel_arr .= ','; // } // $js_allow_channel_arr .= $val; // } // $js_allow_channel_arr = $js_allow_channel_arr.']'; // } // $this->assign('js_allow_channel_arr', $js_allow_channel_arr); /*--end*/ /*表单提交URL*/ $form_action = url('Archives/move'); $this->assign('form_action', $form_action); /*--end*/ return $this->fetch(); } /** * 发布内容 */ public function release() { $typeid = input('param.typeid/d', 0); if (0 < $typeid) { $param = input('param.'); $row = Db::name('arctype') ->field('b.ctl_name,b.id,b.ifsystem') ->alias('a') ->join('__CHANNELTYPE__ b', 'a.current_channel = b.id', 'LEFT') ->where('a.id', 'eq', $typeid) ->find(); /*针对不支持发布文档的模型*/ if (!in_array($row['id'], $this->allowReleaseChannel)) { $this->error('该栏目不支持发布文档!', url('Archives/release')); exit; } /*-----end*/ $data = [ 'typeid' => $typeid, ]; if (empty($row['ifsystem'])) { $ctl_name = 'Custom'; $data['channel'] = $row['id']; } else { $ctl_name = $row['ctl_name']; } $gourl = url('Archives/index_archives', array('typeid'=>$typeid), true, true); $data['gourl'] = $gourl; $jumpUrl = url("{$ctl_name}/add", $data, true, true); header('Location: '.$jumpUrl); exit; } $iframe = input('param.iframe/d',0); /*允许发布文档列表的栏目*/ $select_html = allow_release_arctype(); $this->assign('select_html',$select_html); /*--end*/ /*不允许发布文档的模型ID,用于JS判断*/ $js_allow_channel_arr = '['; foreach ($this->allowReleaseChannel as $key => $val) { if ($key > 0) { $js_allow_channel_arr .= ','; } $js_allow_channel_arr .= $val; } $js_allow_channel_arr = $js_allow_channel_arr.']'; $this->assign('js_allow_channel_arr', $js_allow_channel_arr); /*--end*/ $this->assign('iframe', $iframe); $template = !empty($iframe) ? 'release_iframe' : 'release'; return $this->fetch($template); } public function ajax_get_arctype() { $pid = input('pid/d'); $html = ''; $status = 0; if (0 < $pid) { $map = array( 'current_channel' => array('IN', $this->allowReleaseChannel), 'parent_id' => $pid, ); $row = model('Arctype')->getAll('id,typename', $map, 'id'); if (!empty($row)) { $status = 1; $html = ''; foreach ($row as $key => $val) { $html .= ''; } } } respose(array( 'status' => $status, 'msg' => $html, )); } /** * 复制 */ public function batch_copy() { if (IS_AJAX_POST) { $typeid = input('post.typeid/d'); $aids = input('post.aids/s'); $num = input('post.num/d'); if (empty($typeid) || empty($aids)) { $this->error('复制失败!'); } else if (empty($num)) { $this->error('复制数量至少一篇!'); } // 获取复制栏目的模型ID $current_channel = Db::name('arctype')->where([ 'id' => $typeid, ])->getField('current_channel'); // 抽取相符合模型ID的文档aid $aids = Db::name('archives')->where([ 'aid' => ['IN', $aids], 'channel' => $current_channel, ])->column('aid'); // 复制文档处理 $archivesLogic = new \app\admin\logic\ArchivesLogic; $r = $archivesLogic->batch_copy($aids, $typeid, $current_channel, $num); if($r){ adminLog('复制文档-id:'.$aids); $this->success('操作成功'); }else{ $this->error('操作失败'); } } $typeid = input('param.typeid/d', 0); /*允许发布文档列表的栏目*/ $allowReleaseChannel = []; if (!empty($typeid)) { $channelId = Db::name('arctype')->where('id',$typeid)->getField('current_channel'); $allowReleaseChannel[] = $channelId; } $arctype_html = allow_release_arctype($typeid, $allowReleaseChannel); $this->assign('arctype_html', $arctype_html); /*--end*/ /*表单提交URL*/ $form_action = url('Archives/batch_copy'); $this->assign('form_action', $form_action); /*--end*/ return $this->fetch(); } /** * 远程图片本地化 * * @access public * @return string */ public function ajax_remote_to_local() { if (IS_AJAX_POST) { $body = input('post.body/s', '', null); $body = remote_to_local($body); $this->success('本地化成功!', null, ['body'=>$body]); } $this->error('本地化失败!'); } /** * 清除非站内链接 * * @access public * @return string */ public function ajax_replace_links() { if (IS_AJAX_POST) { $body = input('post.body/s', '', null); $body = replace_links($body); $this->success('清除成功!', null, ['body'=>$body]); } $this->error('清除失败!'); } }