* Date: 2023-3-8 */ namespace app\admin\controller; use think\Page; use think\Db; use think\Cache; use app\admin\logic\FormLogic; class Form extends Base { // 表单类型 public $attrInputTypeArr = array(); public function _initialize() { parent::_initialize(); $this->attrInputTypeArr = config('global.guestbook_attr_input_type'); // 数据表 $this->form_db = Db::name('form'); // 业务层 $this->formLogic = new FormLogic; // 模型层 $this->form_model = model('Form'); } /** * 留言列表 - 栏目关联、表单的留言 */ public function index() { $assign_data = array(); $condition = array(); // 获取到所有GET参数 $param = input('param.'); $typeid = $param['typeid'] = empty($param['typeid']) ? '' : intval($param['typeid']); $form_type = $param['form_type'] = empty($param['form_type']) ? '' : intval($param['form_type']); $source = $param['source'] = empty($param['source']) ? 1 : intval($param['source']); $count_type = empty($param['count_type']) ? 'all' : $param['count_type']; $begin = strtotime(input('param.add_time_begin/s')); $end = input('param.add_time_end/s'); !empty($end) && $end .= ' 23:59:59'; $end = strtotime($end); // 应用搜索条件 foreach (['keywords', 'typeid', 'count_type','source'] as $key) { if (isset($param[$key]) && $param[$key] !== '') { if ($key == 'keywords') { $attr_row = Db::name('guestbook_attr')->field('aid')->where(array('attr_value' => array('LIKE', "%{$param[$key]}%")))->group('aid')->getAllWithIndex('aid'); $aids = array_keys($attr_row); $condition['a.aid'] = array('IN', $aids); } else if ($key == 'count_type') { if ('unread' == $count_type) { $condition['a.is_read'] = 0; } else if ('read' == $count_type) { $condition['a.is_read'] = 1; } else if ('star' == $count_type) { $condition['a.is_star'] = 1; } } else { $condition['a.' . $key] = array('eq', $param[$key]); } } } // 时间检索 if ($begin > 0 && $end > 0) { $condition['a.add_time'] = array('between',"$begin,$end"); } else if ($begin > 0) { $condition['a.add_time'] = array('egt', $begin); } else if ($end > 0) { $condition['a.add_time'] = array('elt', $end); } if (empty($typeid)) { /*权限控制 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)){ $is_notaccess = false; $permission_arctype = !empty($auth_role_info['permission']['arctype']) ? $auth_role_info['permission']['arctype'] : []; if(!empty($permission_arctype)){ $typeids_tmp = Db::name('arctype')->where(['current_channel'=>8,'lang'=>$this->admin_lang])->cache(true, EYOUCMS_CACHE_TIME, 'arctype')->column('id'); $typeids_tmp = !empty($typeids_tmp) ? $typeids_tmp : []; $typeids_tmp1 = array_intersect($typeids_tmp, $auth_role_info['permission']['arctype']); if (!empty($typeids_tmp1)) { $is_notaccess = true; $typeids_tmp2 = implode(',', $typeids_tmp1); $rawstr = " (a.typeid IN ({$typeids_tmp2}) AND a.form_type = 0) "; $formids_tmp1 = Db::name('form')->where(['lang'=>$this->admin_lang])->cache(true, EYOUCMS_CACHE_TIME, 'form')->column('form_id'); if (!empty($formids_tmp1)) { $formids_tmp2 = implode(',', $formids_tmp1); $rawstr .= " OR (a.typeid IN ({$formids_tmp2}) AND a.form_type = 1) "; } $condition[] = Db::raw("({$rawstr})"); } } if (false === $is_notaccess) { $this->error('您没有操作权限,请联系超级管理员分配权限'); } } } /*--end*/ } // 多语言 $condition['a.lang'] = array('eq', $this->admin_lang); /** * 数据查询,搜索出主键ID的值 */ $count = Db::name('guestbook')->alias('a')->where($condition)->count('aid');// 查询满足要求的总记录数 $Page = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数 $list = Db::name('guestbook') ->field("a.*") ->alias('a') ->where($condition) ->order('a.is_read asc, a.add_time desc') ->limit($Page->firstRow . ',' . $Page->listRows) ->getAllWithIndex('aid'); /** * 完善数据集信息 * 在数据量大的情况下,经过优化的搜索逻辑,先搜索出主键ID,再通过ID将其他信息补充完整; */ $aids = $typeids = $formids = []; if ($list) { foreach ($list as $key => $val) { $aids[] = $val['aid']; if (1 == $val['form_type']) { $formids[] = $val['typeid']; } else { $typeids[] = $val['typeid']; } } $where = [ 'b.aid' => ['IN', $aids], 'a.is_showlist' => 1, 'a.is_del' => 0, ]; $row = Db::name('guestbook_attribute') ->field('a.attr_name, a.typeid, b.attr_value, b.aid, b.attr_id,a.attr_input_type') ->alias('a') ->join('__GUESTBOOK_ATTR__ b', 'b.attr_id = a.attr_id', 'LEFT') ->where($where) ->order('b.aid desc, a.sort_order asc, a.attr_id asc') ->getAllWithIndex(); $attr_list = array(); foreach ($row as $key => $val) { if (9 == $val['attr_input_type']){ //如果是区域类型,转换名称 $val['attr_value'] = Db::name('region')->where('id','in',$val['attr_value'])->column('name'); $val['attr_value'] = implode('',$val['attr_value']); }else if(10 == $val['attr_input_type']){ $val['attr_value'] = date('Y-m-d H:i:s',$val['attr_value']); }else if(in_array($val['attr_input_type'], [5,11])){ $val['attr_value'] = str_replace(['|',PHP_EOL], ',', $val['attr_value']); $attr_values = explode(',', $val['attr_value']); foreach ($attr_values as $_k => $_v) { $_v = handle_subdir_pic($_v); $_v = ""; $attr_values[$_k] = $_v; } $val['attr_value'] = implode(' ', $attr_values); }else if(8 == $val['attr_input_type']){ $val['attr_value'] = handle_subdir_pic($val['attr_value']); $val['attr_value'] = "下载附件"; } $attr_list[$val['aid']][] = $val; } $formList = Db::name('form')->field('form_id,form_name')->where(['form_id'=>['IN',$formids]])->getAllWithIndex('form_id'); $arctypeList = Db::name('arctype')->field('id,typename')->where(['id'=>['IN',$typeids]])->getAllWithIndex('id'); foreach ($list as $key => $val) { if (1 == $val['form_type']) { $val['form_name'] = empty($formList[$val['typeid']]) ? '' : $formList[$val['typeid']]['form_name']; } else { $val['form_name'] = empty($arctypeList[$val['typeid']]) ? '' : $arctypeList[$val['typeid']]['typename']; } $val['attr_list'] = isset($attr_list[$val['aid']]) ? $attr_list[$val['aid']] : array(); $list[$key] = $val; } } $typeids_arr = array_merge($typeids, $formids); $tab_list = Db::name('guestbook_attribute')->where([ 'typeid' => ['IN', $typeids_arr], 'is_showlist' => 1, 'is_del' => 0, ])->order('typeid asc, sort_order asc, attr_id asc')->select(); $tab_list = group_same_key($tab_list, 'typeid'); $assign_data['tab_list'] = $tab_list; $show = $Page->show(); // 分页显示输出 $assign_data['page'] = $show; // 赋值分页输出 $assign_data['list'] = $list; // 赋值数据集 $assign_data['pager'] = $Page; // 赋值分页对象 $assign_data['typeid'] = $typeid; // 栏目/表单的ID $assign_data['form_type'] = $form_type; $assign_data['count_type'] = $count_type; $assign_data['source'] = $source; $assign_data['iframe'] = input('param.iframe/d', 0); //计算留言数量 $gbCountList = [ 'all' => [ 'type' => 'all', 'name' => '全部', 'count' => 0, ], ]; if (isset($condition['a.is_read'])) { unset($condition['a.is_read']); } if (isset($condition['a.is_star'])) { unset($condition['a.is_star']); } $condition['lang'] = $this->admin_lang; $gbCountRow = Db::name('guestbook')->alias('a')->field('is_read,count(aid) as num')->where($condition)->group('is_read')->order('is_read asc')->select(); if (empty($gbCountRow)) { $gbCountRow = [ ['is_read'=>0,'num'=>0], ['is_read'=>1,'num'=>0], ]; } foreach ($gbCountRow as $key => $val) { $type = 'unread'; $name = '未读'; if (!empty($val['is_read'])) { $type = 'read'; $name = '已读'; } $gbCountList[$type] = [ 'type' => $type, 'name' => $name, 'count' => $val['num'], ]; $gbCountList['all']['count'] += $val['num']; } if (isset($condition['a.is_read'])) { unset($condition['a.is_read']); } $condition['is_star'] = 1; $star_num = Db::name('guestbook')->alias('a')->where($condition)->count(); $gbCountList['star'] = [ 'type' => 'star', 'name' => '星标', 'count' => intval($star_num), ]; $assign_data['gbCountList'] = $gbCountList; // 获取留言类型(系统留言、可视化百度小程序留言、可视化微信小程序留言) $gbTypeList = $this->getGbTypeList(1); $assign_data['gbTypeList'] = $gbTypeList; // 加载数据 $this->assign($assign_data); // 手机端后台管理插件特定使用参数 $isMobile = input('param.isMobile/d', 0); // 如果安装手机端后台管理插件并且在手机端访问时执行 if (is_dir('./weapp/Mbackend/') && !empty($isMobile)) { $mbPage = input('param.p/d', 1); $nullShow = intval($Page->totalPages) === intval($mbPage) ? 1 : 0; $this->assign('nullShow', $nullShow); if ($mbPage >= 2) { return $this->display('form/form_list'); } else { return $this->display('form/index'); } } else { return $this->fetch(); } } /*可视化百度小程序*/ // 可视化百度小程序留言列表 public function baidu_diyminipro_index() { // 查询当前小程序 mini_id $result = $this->getBaiduDiyminiproInfo(); // 查询条件 $where = [ 'a.lang' => $result['lang'], 'a.mini_id' => $result['mini_id'] ]; // 全部、已读、未读查询条件 $count_type = input('param.count_type/s', 'all'); if ('unread' == $count_type) { $where['a.is_read'] = 0; } else if ('read' == $count_type) { $where['a.is_read'] = 1; } $assign_data['count_type'] = $count_type; // 模糊查询 $keywords = input('param.keywords/s', 'all'); if (!empty($keywords)) { $list_ids = Db::name('weapp_bd_diyminipro_form_value')->where(['field_value' => ['LIKE', "%{$keywords}%"]])->column('list_id'); if (!empty($list_ids)) $where['a.list_id'] = ['IN', array_unique($list_ids)]; } // 如果有表单ID则指定查询 $form_id = input('param.form_id/d', 0); if (!empty($form_id)) $where['a.form_id'] = $form_id; // 分页查询 $count = Db::name('weapp_bd_diyminipro_form_list')->alias('a')->where($where)->join('weapp_bd_diyminipro_form b', 'a.form_id = b.form_id', 'LEFT')->count(); $Page = new Page($count, config('paginate.list_rows')); // 数据查询 $list = Db::name('weapp_bd_diyminipro_form_list') ->field('a.*, b.form_name') ->alias('a') ->where($where) ->join('weapp_bd_diyminipro_form b', 'a.form_id = b.form_id', 'LEFT') ->order('a.update_time desc, a.list_id desc') ->limit($Page->firstRow.','.$Page->listRows) ->select(); // 内容查询 $result = Db::name('weapp_bd_diyminipro_form_field') ->field('b.*, a.field_name') ->alias('a') ->join('weapp_bd_diyminipro_form_value b', 'b.field_id = a.field_id', 'LEFT') ->where(['b.list_id' => ['IN', get_arr_column($list, 'list_id')]]) ->order('b.value_id asc') ->select(); $field_list = []; foreach ($result as $key => $value) { if ('checkbox' == $value['field_type'] && !empty($value['field_value'])) { $value['field_value'] = str_replace(',', '] [', '['.$value['field_value'].']'); } else if ('datetime' == $value['field_type'] && !empty($value['field_value'])){ $value['field_value'] = date('Y-m-d H:i:s', $value['field_value']); } else if ('location' == $value['field_type'] && !empty($value['field_value'])){ $value['field_value'] = htmlspecialchars_decode($value['field_value']); $location_value = json_decode($value['field_value'], true); $value['field_value'] = $location_value['address']. $location_value['number']; } $field_list[$value['list_id']][] = $value; } // 数据处理 foreach ($list as $key => $value) { $value['field_list'] = isset($field_list[$value['list_id']]) ? $field_list[$value['list_id']] : []; $list[$key] = $value; } $assign_data['list'] = $list; $assign_data['pager'] = $Page; $assign_data['page'] = $Page->show(); // 查询所有留言 unset($where['a.is_read']); $formCountRow = Db::name('weapp_bd_diyminipro_form_list')->alias('a')->where($where)->select(); // 计算(全部、已读、未读)留言数量 $all = $read = $unread = 0; foreach ($formCountRow as $value) { $all++; if (!empty($value['is_read'])) { $read++; } else { $unread++; } } $formCountList = [ 'all' => [ 'type' => 'all', 'name' => '全部', 'count' => intval($all), ], 'read' => [ 'type' => 'read', 'name' => '已读', 'count' => intval($read), ], 'unread' => [ 'type' => 'unread', 'name' => '未读', 'count' => intval($unread), ], ]; $assign_data['formCountList'] = $formCountList; // 获取留言类型(系统留言、可视化百度小程序留言、可视化微信小程序留言) $gbTypeList = $this->getGbTypeList(2); $assign_data['gbTypeList'] = $gbTypeList; // 加载数据 $this->assign($assign_data); return $this->fetch(); } // 可视化百度小程序留言详情 public function baidu_diyminipro_details() { $list_id = input('list_id/d', 0); $form_id = input('form_id/d', 0); if (empty($list_id) || empty($form_id)) $this->error('参数有误'); // 查询当前小程序 mini_id $result = $this->getBaiduDiyminiproInfo(); // 查询条件 $where = [ 'a.list_id' => $list_id, 'a.form_id' => $form_id, 'a.lang' => $result['lang'], 'a.mini_id' => $result['mini_id'] ]; // 更新为已读 $update = [ 'is_read' => 1, 'update_time' => getTime() ]; Db::name('weapp_bd_diyminipro_form_list')->alias('a')->where($where)->update($update); // 执行查询 $info = Db::name('weapp_bd_diyminipro_form_list') ->field('a.*, b.form_name') ->alias('a') ->where($where) ->join('weapp_bd_diyminipro_form b', 'a.form_id = b.form_id', 'LEFT') ->find(); $assign_data['info'] = $info; // 执行查询 $value_list = Db::name('weapp_bd_diyminipro_form_value') ->field('a.*, b.field_name') ->alias('a') ->where($where) ->join('weapp_bd_diyminipro_form_field b', 'a.field_id = b.field_id', 'LEFT') ->select(); foreach ($value_list as $key => $value) { if ('checkbox' == $value['field_type'] && !empty($value['field_value'])) { $value_list[$key]['field_value'] = str_replace(',', '] [', '['.$value['field_value'].']'); } else if ('datetime' == $value['field_type'] && !empty($value['field_value'])){ $value_list[$key]['field_value'] = date('Y-m-d H:i:s', $value['field_value']); } else if ('location' == $value['field_type'] && !empty($value['field_value'])){ $value['field_value'] = htmlspecialchars_decode($value['field_value']); $location_value = json_decode($value['field_value'], true); $value_list[$key]['field_value'] = $location_value['address']. $location_value['number']; } } $assign_data['value_list'] = $value_list; $this->assign($assign_data); return $this->fetch(); } // 删除可视化百度小程序留言 public function baidu_diyminipro_del() { if (IS_AJAX_POST) { $list_id = input('post.list_id/d', 0); if (empty($list_id)) $this->error('参数有误'); // 查询当前小程序 mini_id $result = $this->getBaiduDiyminiproInfo(); // 执行条件 $where = [ 'list_id' => $list_id, 'lang' => $result['lang'], 'mini_id' => $result['mini_id'] ]; // 删除表单列表数据 $resultID = Db::name('weapp_bd_diyminipro_form_list')->where($where)->delete(true); if (!empty($resultID)) { // 同步删除表单下的字段 Db::name('weapp_bd_diyminipro_form_value')->where($where)->delete(true); $this->success('删除成功'); } else { $this->error('删除失败'); } } } // 查询 查询可视化百度小程序 当前使用的 mini_id private function getBaiduDiyminiproInfo() { return Db::name('weapp_bd_diyminipro')->where(['is_del'=> 0])->order('mini_id desc')->find(); } /*end*/ /*可视化微信小程序*/ // 可视化微信小程序留言列表 public function wechat_diyminipro_index() { // 查询当前小程序 mini_id $result = $this->getWechatDiyminiproInfo(); // 查询条件 $where = [ 'a.lang' => $result['lang'], 'a.mini_id' => $result['mini_id'] ]; // 全部、已读、未读查询条件 $count_type = input('param.count_type/s', 'all'); if ('unread' == $count_type) { $where['a.is_read'] = 0; } else if ('read' == $count_type) { $where['a.is_read'] = 1; } $assign_data['count_type'] = $count_type; // 模糊查询 $keywords = input('param.keywords/s', 'all'); if (!empty($keywords)) { $list_ids = Db::name('diyminipro_form_value')->where(['field_value' => ['LIKE', "%{$keywords}%"]])->column('list_id'); if (!empty($list_ids)) $where['a.list_id'] = ['IN', array_unique($list_ids)]; } // 如果有表单ID则指定查询 $form_id = input('param.form_id/d', 0); if (!empty($form_id)) $where['a.form_id'] = $form_id; // 分页查询 $count = Db::name('diyminipro_form_list')->alias('a')->where($where)->join('diyminipro_form b', 'a.form_id = b.form_id', 'LEFT')->count(); $Page = new Page($count, config('paginate.list_rows')); // 数据查询 $list = Db::name('diyminipro_form_list') ->field('a.*, b.form_name') ->alias('a') ->where($where) ->join('diyminipro_form b', 'a.form_id = b.form_id', 'LEFT') ->order('a.update_time desc, a.list_id desc') ->limit($Page->firstRow.','.$Page->listRows) ->select(); // 内容查询 $result = Db::name('weapp_bd_diyminipro_form_field') ->field('b.*, a.field_name') ->alias('a') ->join('diyminipro_form_value b', 'b.field_id = a.field_id', 'LEFT') ->where(['b.list_id' => ['IN', get_arr_column($list, 'list_id')]]) ->order('b.value_id asc') ->select(); $field_list = []; foreach ($result as $key => $value) { if ('checkbox' == $value['field_type'] && !empty($value['field_value'])) { $value['field_value'] = str_replace(',', '] [', '['.$value['field_value'].']'); } else if ('datetime' == $value['field_type'] && !empty($value['field_value'])){ $value['field_value'] = date('Y-m-d H:i:s', $value['field_value']); } else if ('location' == $value['field_type'] && !empty($value['field_value'])){ $value['field_value'] = htmlspecialchars_decode($value['field_value']); $location_value = json_decode($value['field_value'], true); $value['field_value'] = $location_value['address']. $location_value['number']; } $field_list[$value['list_id']][] = $value; } // 数据处理 foreach ($list as $key => $value) { $value['field_list'] = isset($field_list[$value['list_id']]) ? $field_list[$value['list_id']] : []; $list[$key] = $value; } $assign_data['list'] = $list; $assign_data['pager'] = $Page; $assign_data['page'] = $Page->show(); // 查询所有留言 unset($where['a.is_read']); $formCountRow = Db::name('diyminipro_form_list')->alias('a')->where($where)->select(); // 计算(全部、已读、未读)留言数量 $all = $read = $unread = 0; foreach ($formCountRow as $value) { $all++; if (!empty($value['is_read'])) { $read++; } else { $unread++; } } $formCountList = [ 'all' => [ 'type' => 'all', 'name' => '全部', 'count' => intval($all), ], 'read' => [ 'type' => 'read', 'name' => '已读', 'count' => intval($read), ], 'unread' => [ 'type' => 'unread', 'name' => '未读', 'count' => intval($unread), ], ]; $assign_data['formCountList'] = $formCountList; // 获取留言类型(系统留言、可视化百度小程序留言、可视化微信小程序留言) $gbTypeList = $this->getGbTypeList(3); $assign_data['gbTypeList'] = $gbTypeList; // 加载数据 $this->assign($assign_data); return $this->fetch(); } // 可视化微信小程序留言详情 public function wechat_diyminipro_details() { $list_id = input('list_id/d', 0); $form_id = input('form_id/d', 0); if (empty($list_id) || empty($form_id)) $this->error('参数有误'); // 查询当前小程序 mini_id $result = $this->getWechatDiyminiproInfo(); // 查询条件 $where = [ 'a.list_id' => $list_id, 'a.form_id' => $form_id, 'a.lang' => $result['lang'], 'a.mini_id' => $result['mini_id'] ]; // 更新为已读 $update = [ 'is_read' => 1, 'update_time' => getTime() ]; Db::name('diyminipro_form_list')->alias('a')->where($where)->update($update); // 执行查询 $info = Db::name('diyminipro_form_list') ->field('a.*, b.form_name') ->alias('a') ->where($where) ->join('diyminipro_form b', 'a.form_id = b.form_id', 'LEFT') ->find(); $assign_data['info'] = $info; // 执行查询 $value_list = Db::name('diyminipro_form_value') ->field('a.*, b.field_name') ->alias('a') ->where($where) ->join('diyminipro_form_field b', 'a.field_id = b.field_id', 'LEFT') ->select(); foreach ($value_list as $key => $value) { if ('checkbox' == $value['field_type'] && !empty($value['field_value'])) { $value_list[$key]['field_value'] = str_replace(',', '] [', '['.$value['field_value'].']'); } else if ('datetime' == $value['field_type'] && !empty($value['field_value'])){ $value_list[$key]['field_value'] = date('Y-m-d H:i:s', $value['field_value']); } else if ('location' == $value['field_type'] && !empty($value['field_value'])){ $value['field_value'] = htmlspecialchars_decode($value['field_value']); $location_value = json_decode($value['field_value'], true); $value_list[$key]['field_value'] = $location_value['address']. $location_value['number']; } } $assign_data['value_list'] = $value_list; $this->assign($assign_data); return $this->fetch(); } // 删除可视化微信小程序留言 public function wechat_diyminipro_del() { if (IS_AJAX_POST) { $list_id = input('post.list_id/d', 0); if (empty($list_id)) $this->error('参数有误'); // 查询当前小程序 mini_id $result = $this->getWechatDiyminiproInfo(); // 执行条件 $where = [ 'list_id' => $list_id, 'lang' => $result['lang'], 'mini_id' => $result['mini_id'] ]; // 删除表单列表数据 $resultID = Db::name('diyminipro_form_list')->where($where)->delete(true); if (!empty($resultID)) { // 同步删除表单下的字段 Db::name('diyminipro_form_value')->where($where)->delete(true); $this->success('删除成功'); } else { $this->error('删除失败'); } } } // 查询 可视化微信小程序 当前使用的 mini_id private function getWechatDiyminiproInfo() { return Db::name('diyminipro')->where(['is_del'=> 0])->order('mini_id desc')->find(); } /*end*/ // 获取留言类型(系统留言、可视化百度小程序留言、可视化微信小程序留言) private function getGbTypeList($type = 1) { $source = input('param.source/d', 1); // 系统留言 $result['pc'] = [ 'url' => url('Form/index', ['source'=>1]), 'name' => '电脑端', 'count' => Db::name('guestbook')->where(['source'=>1, 'lang'=>$this->admin_lang])->count(), 'class' => 1 === intval($type) && 1 === intval($source) ? 'cur' : '', ]; $result['mobile'] = [ 'url' => url('Form/index', ['source'=>2]), 'name' => '手机端', 'count' => Db::name('guestbook')->where(['source'=>2, 'lang'=>$this->admin_lang])->count(), 'class' => 1 === intval($type) && 2 === intval($source) ? 'cur' : '', ]; // 如果安装了可视化百度小程序插件则执行 if (is_dir('./weapp/BdDiyminipro/')) { // 开启可视化百度小程序插件则执行 $data = model('Weapp')->getWeappList('BdDiyminipro'); if (!empty($data['status']) && 1 == $data['status']) { $result['baidu'] = [ 'url' => url('Form/baidu_diyminipro_index'), 'name' => '可视化百度小程序', 'count' => Db::name('weapp_bd_diyminipro_form_list')->count(), 'class' => 2 === intval($type) ? 'cur' : '', ]; } } // 如果安装了可视化微信小程序插件则执行 if (is_dir('./weapp/Diyminipro/')) { // 开启可视化微信小程序插件则执行 $data = model('Weapp')->getWeappList('Diyminipro'); if (!empty($data['status']) && 1 == $data['status']) { $result['wechat'] = [ 'url' => url('Form/wechat_diyminipro_index'), 'name' => '可视化微信小程序', 'count' => Db::name('diyminipro_form_list')->count(), 'class' => 3 === intval($type) ? 'cur' : '', ]; } } return $result; } public function field() { $assign_data = []; // 查询条件 $condition = [ 'lang' => $this->admin_lang, ]; // 应用搜索条件 $keywords = input('keywords/s'); $keywords = trim($keywords); if (!empty($keywords)) $condition['form_name'] = array('LIKE', "%{$keywords}%"); // 分页查询 $count = $this->form_db->where($condition)->count(); $Page = new Page($count, config('paginate.list_rows')); $show = $Page->show(); $assign_data['page'] = $show; $assign_data['pager'] = $Page; // 数据查询 $list = $this->form_db ->where($condition) ->order('form_id asc') ->limit($Page->firstRow.','.$Page->listRows) ->select(); $assign_data['list'] = $list; $form_ids = get_arr_column($list, 'form_id'); // 查询表单填写数量 $assign_data['form_list_count'] = $this->form_model->GetFormListCount($form_ids); /*多语言模式下,表单ID显示主体语言的ID*/ $main_form_list = []; if ($this->admin_lang != $this->main_lang && empty($this->globalConfig['language_split'])) { $attr_values = get_arr_column($list, 'form_id'); $languageAttrRow = Db::name('language_attr')->field('attr_name,attr_value')->where([ 'attr_value' => ['IN', $attr_values], 'attr_group' => 'form', 'lang' => $this->admin_lang, ])->getAllWithIndex('attr_value'); $groupids = []; foreach ($languageAttrRow as $key => $val) { $gid_tmp = str_replace('form', '', $val['attr_name']); array_push($groupids, intval($gid_tmp)); } $main_FormRow = Db::name('form')->field("form_id,CONCAT('form', form_id) AS attr_name") ->where([ 'form_id' => ['IN', $groupids], 'lang' => $this->main_lang, ])->getAllWithIndex('attr_name'); foreach ($list as $key => $val) { $key_tmp = !empty($languageAttrRow[$val['form_id']]['attr_name']) ? $languageAttrRow[$val['form_id']]['attr_name'] : ''; $main_form_list[$val['form_id']] = [ 'form_id' => !empty($main_FormRow[$key_tmp]['form_id']) ? $main_FormRow[$key_tmp]['form_id'] : 0, ]; } } $this->assign('main_form_list', $main_form_list); /*end*/ $this->assign($assign_data); return $this->fetch(); } /** * 新增表单 */ public function field_add() { if (is_language() && empty($this->globalConfig['language_split'])) { $this->language_access(); // 多语言功能操作权限 } if (IS_POST) { $post = input('post.'); $post['form_name'] = trim($post['form_name']); if (empty($post['form_name'])) { $this->error('表单名称不能为空!'); } $data = array( 'form_name' => $post['form_name'], 'intro' => '', 'status' => 1, 'attr_auto' => intval($post['attr_auto']), 'lang' => $this->admin_lang, 'add_time' => getTime(), 'update_time' => getTime(), ); $insertID = Db::name('form')->insertGetId($data); if (!empty($insertID)) { // 同步表单ID到多语言的模板变量里,添加多语言表单 $this->formLogic->syn_add_language_form($insertID); Cache::clear('form'); adminLog('新增表单:'.$data['form_name']); $this->success("操作成功", url('Form/field')); } $this->error("操作失败", url('Form/field')); } return $this->fetch(); } /** * 编辑表单 */ public function field_edit() { if (IS_POST) { $post = input('post.'); $post['form_id'] = intval($post['form_id']); if (!empty($post['form_id'])) { $post['form_name'] = trim($post['form_name']); if (empty($post['form_name'])) { $this->error('表单名称不能为空!'); } $data = array( 'form_name' => $post['form_name'], 'attr_auto' => intval($post['attr_auto']), 'update_time' => getTime(), ); $resultID = Db::name('form')->where(['form_id'=>$post['form_id']])->cache(true,null,'form')->update($data); if ($resultID !== false) { adminLog('编辑表单:'.$data['form_name']); $this->success("操作成功", url('Form/field')); } } $this->error("操作失败", url('Form/field')); } $id = input('id/d'); $info = Db::name('form')->where([ 'form_id' => $id, ])->find(); if (empty($info)) { $this->error('表单不存在,请联系管理员!'); exit; } $assign_data = array(); $assign_data['info'] = $info; $this->assign($assign_data); return $this->fetch(); } /** * 删除表单 */ public function field_del() { $id_arr = input('del_id/a'); $id_arr = eyIntval($id_arr); if (IS_POST && !empty($id_arr)) { /*多语言*/ $attr_name_arr = []; foreach ($id_arr as $key => $val) { $attr_name_arr[] = 'form'.$val; } if (is_language() && empty($this->globalConfig['language_split'])) { $new_id_arr = Db::name('language_attr')->where([ 'attr_name' => ['IN', $attr_name_arr], 'attr_group' => 'form', ])->column('attr_value'); !empty($new_id_arr) && $id_arr = $new_id_arr; } /*--end*/ $form_name_list = $this->form_db->where([ 'form_id' => ['IN', $id_arr], ])->column('form_name'); $r = $this->form_db->where([ 'form_id' => ['IN', $id_arr], ])->delete(); if($r !== false){ $aid_arr = Db::name('guestbook')->where([ 'typeid' => ['IN', $id_arr], 'form_type' => 1, ])->column('aid'); if (!empty($aid_arr)) { Db::name('guestbook')->where([ 'aid' => ['IN', $aid_arr], ])->delete(); Db::name('guestbook_attr')->where([ 'aid' => ['IN', $aid_arr], ])->delete(); Db::name('guestbook_attribute')->where([ 'typeid' => ['IN', $id_arr], 'form_type' => 1, ])->delete(); } Cache::clear('form'); Cache::clear('guestbook'); adminLog('删除表单:'.implode(',', $form_name_list)); $this->success('删除成功'); } } $this->error('删除失败'); } //留言表单列表 public function attribute_index() { $assign_data = array(); $condition = array(); $get = input('get.'); $typeid = input('typeid/d'); foreach (['keywords','typeid'] as $key) { if (isset($get[$key]) && $get[$key] !== '') { if ($key == 'keywords') { $condition['a.attr_name'] = array('LIKE', "%{$get[$key]}%"); } else { $condition['a.'.$key] = array('eq', $get[$key]); } } } $condition['a.form_type'] = 1; $condition['b.form_id'] = ['gt', 0]; $condition['a.is_del'] = 0; $condition['a.lang'] = $this->admin_lang; $count = Db::name('guestbook_attribute')->alias('a') ->join('__FORM__ b', 'a.typeid = b.form_id', 'LEFT') ->where($condition) ->count(); $Page = new Page($count, config('paginate.list_rows')); $list = Db::name('guestbook_attribute') ->field("a.attr_id") ->alias('a') ->join('__FORM__ b', 'a.typeid = b.form_id', 'LEFT') ->where($condition) ->order('a.typeid desc, a.sort_order asc, a.attr_id asc') ->limit($Page->firstRow.','.$Page->listRows) ->getAllWithIndex('attr_id'); if ($list) { $attr_ida = array_keys($list); $fields = "b.*, a.*,a.attr_id as orgin_attr_id"; $row = Db::name('guestbook_attribute') ->field($fields) ->alias('a') ->join('__FORM__ b', 'a.typeid = b.form_id', 'LEFT') ->where('a.attr_id', 'in', $attr_ida) ->getAllWithIndex('attr_id'); $row = model('LanguageAttr')->getBindValue($row, 'form_attribute', $this->main_lang); // 获取多语言关联绑定的值 foreach ($row as $key => $val) { $val['fieldname'] = 'attr_'.$val['attr_id']; $row[$key] = $val; } foreach ($list as $key => $val) { $list[$key] = $row[$val['attr_id']]; } } $show = $Page->show(); $assign_data['page'] = $show; $assign_data['list'] = $list; $assign_data['pager'] = $Page; $assign_data['typeid'] = $typeid; // 表单列表 $assign_data['attrInputTypeArr'] = $this->attrInputTypeArr; // 表单类型 $this->assign($assign_data); return $this->fetch(); } /** * 新增表单属性 */ public function attribute_add() { //防止php超时 function_exists('set_time_limit') && set_time_limit(0); if (is_language() && empty($this->globalConfig['language_split'])) { $this->language_access(); // 多语言功能操作权限 } if(IS_AJAX && IS_POST)//ajax提交验证 { $model = model('GuestbookAttribute'); $attr_values = str_replace('_', '', input('attr_values')); // 替换特殊字符 $attr_values = str_replace('@', '', $attr_values); // 替换特殊字符 $attr_values = trim($attr_values); /*过滤重复值*/ $attr_values_arr = explode(PHP_EOL, $attr_values); foreach ($attr_values_arr as $key => $val) { $tmp_val = trim($val); if (empty($tmp_val)) { unset($attr_values_arr[$key]); continue; } $attr_values_arr[$key] = $tmp_val; } $attr_values_arr = array_unique($attr_values_arr); $attr_values = implode(PHP_EOL, $attr_values_arr); /*end*/ $post_data = input('post.'); $post_data['attr_values'] = $attr_values; $attr_input_type = isset($post_data['attr_input_type']) ? $post_data['attr_input_type'] : 0; /*前台输入是否JS验证*/ $validate_type = 0; $validate_type_list = config("global.validate_type_list"); // 前台输入验证类型 if (!empty($validate_type_list[$attr_input_type])) { $validate_type = $attr_input_type; } /*end*/ if (9 == $post_data['attr_input_type']) { if (!empty($post_data['region_data'])) { $post_data['attr_values'] = serialize($post_data['region_data']); } else { $this->error("请选择区域范围!"); } } $savedata = array( 'attr_name' => $post_data['attr_name'], 'typeid' => $post_data['typeid'], 'form_type' => 1, 'attr_input_type' => $attr_input_type, 'attr_values' => isset($post_data['attr_values']) ? $post_data['attr_values'] : '', 'is_showlist' => $post_data['is_showlist'], 'required' => $post_data['required'], 'real_validate' => $post_data['real_validate'], 'validate_type' => $validate_type, 'sort_order' => 100, 'lang' => $this->admin_lang, 'add_time' => getTime(), 'update_time' => getTime(), ); // 如果是添加手机号码类型则执行 if (!empty($savedata['typeid']) && 6 === intval($savedata['attr_input_type']) && 1 === intval($savedata['real_validate'])) { // 查询是否已添加需要真实验证的手机号码类型 $where = [ 'typeid' => $savedata['typeid'], 'form_type' => 1, 'real_validate' => $savedata['real_validate'], 'attr_input_type' => $savedata['attr_input_type'] ]; $realValidate = $model->get($where); if (!empty($realValidate)) $this->error('只能设置一个需要真实验证的手机号码类型'); } // 数据验证 $validate = \think\Loader::validate('GuestbookAttribute'); if(!$validate->batch()->check($savedata)) { $error = $validate->getError(); $error_msg = array_values($error); $return_arr = array( 'status' => -1, 'msg' => $error_msg[0], 'data' => $error, ); respose($return_arr); } else { $model->data($savedata,true); // 收集数据 $model->save(); // 写入数据到数据库 $insertId = $model->getLastInsID(); // 同步表单ID到多语言的模板变量里,添加多语言表单 $this->formLogic->syn_add_language_attribute($insertId); $return_arr = array( 'status' => 1, 'msg' => '操作成功', 'data' => array('url'=>url('Form/attribute_index', array('typeid'=>$post_data['typeid']))), ); adminLog('新增表单:'.$savedata['attr_name']); respose($return_arr); } } $typeid = input('param.typeid/d', 0); if ($typeid > 0) { $formdata = $this->form_db->where(['form_id'=>$typeid])->find(); } else { $formdata = $this->form_db->where(['lang'=>$this->admin_lang,'status'=>1])->select(); } $assign_data['formdata'] = $formdata; // $assign_data['typeid'] = $typeid; // 表单ID $assign_data['attrInputTypeArr'] = $this->attrInputTypeArr; // 表单类型 //区域 $China[] = [ 'id' => 0, 'name' => '全国', ]; $Province = get_province_list(); $assign_data['Province'] = array_merge($China, $Province); $this->assign($assign_data); return $this->fetch(); } /** * 编辑表单属性 */ public function attribute_edit() { if(IS_AJAX && IS_POST)//ajax提交验证 { $model = model('GuestbookAttribute'); $attr_values = str_replace('_', '', input('attr_values')); // 替换特殊字符 $attr_values = str_replace('@', '', $attr_values); // 替换特殊字符 $attr_values = trim($attr_values); /*过滤重复值*/ $attr_values_arr = explode(PHP_EOL, $attr_values); foreach ($attr_values_arr as $key => $val) { $tmp_val = trim($val); if (empty($tmp_val)) { unset($attr_values_arr[$key]); continue; } $attr_values_arr[$key] = $tmp_val; } $attr_values_arr = array_unique($attr_values_arr); $attr_values = implode(PHP_EOL, $attr_values_arr); /*end*/ $post_data = input('post.'); $post_data['attr_id'] = intval($post_data['attr_id']); $post_data['attr_values'] = $attr_values; $attr_input_type = isset($post_data['attr_input_type']) ? $post_data['attr_input_type'] : 0; /*前台输入是否JS验证*/ $validate_type = 0; $validate_type_list = config("global.validate_type_list"); // 前台输入验证类型 if (!empty($validate_type_list[$attr_input_type])) { $validate_type = $attr_input_type; } /*end*/ if (9 == $post_data['attr_input_type']) { if (!empty($post_data['region_data'])) { $post_data['attr_values'] = serialize($post_data['region_data']); } else { $this->error("请选择区域范围!"); } } $savedata = array( 'attr_id' => $post_data['attr_id'], 'attr_name' => $post_data['attr_name'], 'typeid' => $post_data['typeid'], 'form_type' => 1, 'attr_input_type' => $attr_input_type, 'attr_values' => isset($post_data['attr_values']) ? $post_data['attr_values'] : '', 'is_showlist' => $post_data['is_showlist'], 'required' => $post_data['required'], 'real_validate' => $post_data['real_validate'], 'validate_type' => $validate_type, 'sort_order' => 100, 'update_time' => getTime(), ); // 如果是添加手机号码类型则执行 if (!empty($savedata['typeid']) && 6 === intval($savedata['attr_input_type']) && 1 === intval($savedata['real_validate'])) { // 查询是否已添加需要真实验证的手机号码类型 $where = [ 'typeid' => $savedata['typeid'], 'form_type' => 1, 'attr_id' => ['NEQ', $savedata['attr_id']], 'real_validate' => $savedata['real_validate'], 'attr_input_type' => $savedata['attr_input_type'] ]; $realValidate = $model->get($where); if (!empty($realValidate)) $this->error('只能设置一个需要真实验证的手机号码类型'); } // 数据验证 $validate = \think\Loader::validate('GuestbookAttribute'); if(!$validate->batch()->check($savedata)) { $error = $validate->getError(); $error_msg = array_values($error); $return_arr = array( 'status' => -1, 'msg' => $error_msg[0], 'data' => $error, ); respose($return_arr); } else { $model->data($savedata, true); // 收集数据 $model->isUpdate(true, [ 'attr_id' => $post_data['attr_id'], ])->save(); // 写入数据到数据库 $return_arr = array( 'status' => 1, 'msg' => '操作成功', 'data' => array('url' => url('Form/attribute_index', array('typeid' => intval($post_data['typeid'])))), ); adminLog('编辑表单:' . $savedata['attr_name']); respose($return_arr); } } $assign_data = array(); $id = input('id/d'); /*获取多语言关联绑定的值*/ $new_id = model('LanguageAttr')->getBindValue($id, 'form_attribute'); // 多语言 !empty($new_id) && $id = $new_id; /*--end*/ $info = Db::name('GuestbookAttribute')->where([ 'attr_id' => $id, 'form_type' => 1, ])->find(); if (empty($info)) { $this->error('数据不存在,请联系管理员!'); exit; } $assign_data['field'] = $info; // 所在表单 $formdata = $this->form_db->where('form_id', $info['typeid'])->find(); $assign_data['formdata'] = $formdata; $assign_data['attrInputTypeArr'] = $this->attrInputTypeArr; // 表单类型 /*区域字段处理*/ // 初始化参数 $assign_data['region'] = [ 'parent_id' => '-1', 'region_id' => '-1', 'region_names' => '', 'region_ids' => '', ]; // 定义全国参数 $China[] = [ 'id' => 0, 'name' => '全国', ]; // 查询省份信息并且拼装上$China数组 $Province = get_province_list(); $assign_data['Province'] = array_merge($China, $Province); // 区域选择时,指定不出现下级地区列表 $assign_data['parent_array'] = "[]"; // 如果是区域类型则执行 if (9 == $info['attr_input_type']) { // 反序列化默认值参数 $dfvalue = unserialize($info['attr_values']); if (0 == $dfvalue['region_id']) { $parent_id = $dfvalue['region_id']; } else { // 查询当前选中的区域父级ID $parent_id = Db::name('region')->where("id", $dfvalue['region_id'])->getField('parent_id'); if (0 == $parent_id) { $parent_id = $dfvalue['region_id']; } } // 查询市\区\县信息 $assign_data['City'] = Db::name('region')->where("parent_id", $parent_id)->select(); // 加载数据到模板 $assign_data['region'] = [ 'parent_id' => $parent_id, 'region_id' => $dfvalue['region_id'], 'region_names' => $dfvalue['region_names'], 'region_ids' => $dfvalue['region_ids'], ]; // 删除默认值,防止切换其他类型时使用到 unset($info['attr_values']); // 区域选择时,指定不出现下级地区列表 $assign_data['parent_array'] = convert_js_array(config('global.field_region_all_type')); } /*区域字段处理结束*/ $this->assign($assign_data); return $this->fetch(); } /** * 删除表单属性 */ public function attribute_del() { if (is_language() && empty($this->globalConfig['language_split'])) { $this->language_access(); // 多语言功能操作权限 } $thorough = input('thorough/d'); $id_arr = input('del_id/a'); $id_arr = eyIntval($id_arr); if (!empty($id_arr)) { //多语言 $attr_name_arr = []; foreach ($id_arr as $key => $val) { $attr_name_arr[] = 'attr_' . $val; } if (is_language() && empty($this->globalConfig['language_split'])) { $new_id_arr = Db::name('language_attr')->where([ 'attr_name' => ['IN', $attr_name_arr], 'attr_group' => 'form_attribute', ])->column('attr_value'); !empty($new_id_arr) && $id_arr = $new_id_arr; } if (1 == $thorough){//彻底删除 $r = Db::name('GuestbookAttribute')->where([ 'attr_id' => ['IN', $id_arr], 'form_type' => 1, ])->delete(); }else{ $r = Db::name('GuestbookAttribute')->where([ 'attr_id' => ['IN', $id_arr], 'form_type' => 1, ])->update([ 'is_del' => 1, 'update_time' => getTime(), ]); } if($r !== false){ // 删除多语言表单属性关联绑定 if (1 == $thorough){//彻底删除 if (!empty($attr_name_arr)) { if (get_admin_lang() == get_main_lang()) { Db::name('language_attribute')->where([ 'attr_name' => ['IN', $attr_name_arr], 'attr_group' => 'form_attribute', ])->delete(); } if (empty($this->globalConfig['language_split'])) { Db::name('language_attr')->where([ 'attr_name' => ['IN', $attr_name_arr], 'attr_group' => 'form_attribute', ])->delete(); } else { Db::name('language_attr')->where([ 'attr_value' => ['IN', $id_arr], 'attr_group' => 'form_attribute', ])->delete(); } } } /*--end*/ adminLog('删除表单属性-id:'.implode(',', $id_arr)); $this->success('删除成功'); } } $this->error('删除失败'); } //标签调用 public function label_call(){ $form_id = input('form_id/d',0); if (!empty($form_id)) { $form = model('form')->where(['form_id'=>$form_id])->find(); $content =<< {eyou:volist name="\$field.attrlist" id="attr"} {\$attr.attr_name}:{\$attr.attr_html} {/eyou:volist}
{\$field.hidden} {/eyou:form} EOF; $assign_data = [ 'content' => htmlspecialchars($content) ]; $this->assign($assign_data); return $this->fetch(); } $this->error('数据不存在!'); } }