* Date: 2018-4-3 */ namespace app\admin\controller; use think\Page; use think\Db; use app\common\logic\ArctypeLogic; use app\admin\logic\ProductLogic; use app\admin\logic\ProductSpecLogic; // 用于产品规格逻辑功能处理 class Product extends Base { // 模型标识 public $nid = 'product'; // 模型ID public $channeltype = ''; // 表单类型 public $attrInputTypeArr = array(); public function _initialize() { parent::_initialize(); $channeltype_list = config('global.channeltype_list'); $this->channeltype = $channeltype_list[$this->nid]; empty($this->channeltype) && $this->channeltype = 2; $this->attrInputTypeArr = config('global.attr_input_type_arr'); $this->assign('nid', $this->nid); $this->assign('channeltype', $this->channeltype); } /** * 文章列表 */ public function index() { $assign_data = array(); $condition = array(); // 获取到所有GET参数 $param = input('param.'); $flag = input('flag/s'); $typeid = input('typeid/d', 0); $begin = strtotime(input('add_time_begin')); $end = strtotime(input('add_time_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(! 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 小虎哥*/ $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']; } } } /*--end*/ // 时间检索 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); } // 模型ID $condition['a.channel'] = array('eq', $this->channeltype); // 多语言 $condition['a.lang'] = array('eq', $this->admin_lang); // 回收站 $condition['a.is_del'] = array('eq', 0); /*自定义排序*/ $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") ->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'); 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')->find($typeid); } $assign_data['arctype_info'] = $arctype_info; /*--end*/ /*选项卡*/ $tab = input('param.tab/d', 3); $assign_data['tab'] = $tab; /*--end*/ $this->assign($assign_data); return $this->fetch(); } /** * 添加 */ public function add() { if (IS_POST) { $post = input('post.'); $content = input('post.addonFieldExt.content', '', null); // 根据标题自动提取相关的关键字 $seo_keywords = $post['seo_keywords']; if (!empty($seo_keywords)) { $seo_keywords = str_replace(',', ',', $seo_keywords); } else { // $seo_keywords = get_split_word($post['title'], $content); } // 自动获取内容第一张图片作为封面图 $is_remote = !empty($post['is_remote']) ? $post['is_remote'] : 0; $litpic = ''; if ($is_remote == 1) { $litpic = $post['litpic_remote']; } else { $litpic = $post['litpic_local']; } if (empty($litpic)) { $litpic = get_html_first_imgurl($content); } $post['litpic'] = $litpic; /*是否有封面图*/ if (empty($post['litpic'])) { $is_litpic = 0; // 无封面图 } else { $is_litpic = 1; // 有封面图 } // SEO描述 $seo_description = ''; if (empty($post['seo_description']) && !empty($content)) { $seo_description = @msubstr(checkStrHtml($content), 0, config('global.arc_seo_description_length'), false); } else { $seo_description = $post['seo_description']; } // 外部链接跳转 $jumplinks = ''; $is_jump = isset($post['is_jump']) ? $post['is_jump'] : 0; if (intval($is_jump) > 0) { $jumplinks = $post['jumplinks']; } // 模板文件,如果文档模板名与栏目指定的一致,默认就为空。让它跟随栏目的指定而变 if ($post['type_tempview'] == $post['tempview']) { unset($post['type_tempview']); unset($post['tempview']); } //处理自定义文件名,仅由字母数字下划线和短横杆组成,大写强制转换为小写 if (!empty($post['htmlfilename'])) { $post['htmlfilename'] = preg_replace("/[^a-zA-Z0-9_-]+/", "", $post['htmlfilename']); $post['htmlfilename'] = strtolower($post['htmlfilename']); //判断是否存在相同的自定义文件名 $filenameCount = Db::name('archives')->where([ 'htmlfilename' => $post['htmlfilename'], ])->count(); if (!empty($filenameCount)) { $this->error("自定义文件名已存在,请重新设置!"); } } // 产品类型 if (!empty($post['prom_type'])) { if ($post['prom_type_vir'] == 2) { $post['netdisk_url'] = trim($post['netdisk_url']); if (empty($post['netdisk_url'])) { $this->error("网盘地址不能为空!"); } $post['prom_type'] = 2; } else if ($post['prom_type_vir'] == 3) { $post['text_content'] = trim($post['text_content']); if (empty($post['text_content'])) { $this->error("虚拟文本内容不能为空!"); } $post['prom_type'] = 3; } } // --存储数据 $newData = array( 'typeid'=> empty($post['typeid']) ? 0 : $post['typeid'], 'channel' => $this->channeltype, 'is_b' => empty($post['is_b']) ? 0 : $post['is_b'], 'is_head' => empty($post['is_head']) ? 0 : $post['is_head'], 'is_special' => empty($post['is_special']) ? 0 : $post['is_special'], 'is_recom' => empty($post['is_recom']) ? 0 : $post['is_recom'], 'is_jump' => $is_jump, 'is_litpic' => $is_litpic, 'jumplinks' => $jumplinks, 'seo_keywords' => $seo_keywords, 'seo_description' => $seo_description, 'admin_id' => session('admin_info.admin_id'), 'stock_show' => empty($post['stock_show']) ? 0 : $post['stock_show'], 'lang' => $this->admin_lang, 'sort_order' => 100, 'add_time' => strtotime($post['add_time']), 'update_time' => strtotime($post['add_time']), ); $data = array_merge($post, $newData); $aid = Db::name('archives')->insertGetId($data); $_POST['aid'] = $aid; if ($aid) { // ---------后置操作 model('Product')->afterSave($aid, $data, 'add'); // ---------end // 添加产品规格 model('ProductSpecPreset')->ProductSpecInsertAll($aid, $data); adminLog('新增产品:'.$data['title']); //虚拟商品保存 if (!empty($post['prom_type']) && in_array($post['prom_type'], [2,3])) { model('ProductNetdisk')->saveProductNetdisk($aid, $data); } // 生成静态页面代码 $successData = [ 'aid' => $aid, 'tid' => $post['typeid'], ]; $this->success("操作成功!", null, $successData); exit; } $this->error("操作失败!"); exit; } $typeid = input('param.typeid/d', 0); $assign_data['typeid'] = $typeid; // 栏目ID // 栏目信息 $arctypeInfo = Db::name('arctype')->find($typeid); /*允许发布文档列表的栏目*/ $arctype_html = allow_release_arctype($typeid, array($this->channeltype)); $assign_data['arctype_html'] = $arctype_html; /*--end*/ /*自定义字段*/ $addonFieldExtList = model('Field')->getChannelFieldList($this->channeltype); $channelfieldBindRow = Db::name('channelfield_bind')->where([ 'typeid' => ['IN', [0,$typeid]], ])->column('field_id'); if (!empty($channelfieldBindRow)) { foreach ($addonFieldExtList as $key => $val) { if (!in_array($val['id'], $channelfieldBindRow)) { unset($addonFieldExtList[$key]); } } } $assign_data['addonFieldExtList'] = $addonFieldExtList; $assign_data['aid'] = 0; /*--end*/ /*可控制的字段列表*/ $assign_data['ifcontrolRow'] = Db::name('channelfield')->field('id,name')->where([ 'channel_id' => $this->channeltype, 'ifmain' => 1, 'ifeditable' => 1, 'ifcontrol' => 0, 'status' => 1, ])->getAllWithIndex('name'); // 阅读权限 $arcrank_list = get_arcrank_list(); $assign_data['arcrank_list'] = $arcrank_list; /*产品参数*/ $assign_data['canshu'] = $this->ajax_get_attr_input($typeid); /*--end*/ /*模板列表*/ $archivesLogic = new \app\admin\logic\ArchivesLogic; $templateList = $archivesLogic->getTemplateList($this->nid); $this->assign('templateList', $templateList); /*--end*/ /*默认模板文件*/ $tempview = 'view_'.$this->nid.'.'.config('template.view_suffix'); !empty($arctypeInfo['tempview']) && $tempview = $arctypeInfo['tempview']; $this->assign('tempview', $tempview); /*--end*/ // 商城配置 $shopConfig = getUsersConfigData('shop'); $assign_data['shopConfig'] = $shopConfig; // 商品规格 if (isset($shopConfig['shop_open_spec']) && 1 == $shopConfig['shop_open_spec']) { // 预设值名称 $assign_data['preset_value'] = Db::name('product_spec_preset')->where('lang',$this->admin_lang)->field('preset_id,preset_mark_id,preset_name')->group('preset_mark_id')->order('preset_mark_id desc')->select(); } // URL模式 $tpcache = config('tpcache'); $assign_data['seo_pseudo'] = !empty($tpcache['seo_pseudo']) ? $tpcache['seo_pseudo'] : 1; $this->assign($assign_data); return $this->fetch(); } /** * 编辑 */ public function edit() { if (IS_POST) { $post = input('post.'); $typeid = input('post.typeid/d', 0); $content = input('post.addonFieldExt.content', '', null); // 根据标题自动提取相关的关键字 $seo_keywords = $post['seo_keywords']; if (!empty($seo_keywords)) { $seo_keywords = str_replace(',', ',', $seo_keywords); } else { // $seo_keywords = get_split_word($post['title'], $content); } // 自动获取内容第一张图片作为封面图 $is_remote = !empty($post['is_remote']) ? $post['is_remote'] : 0; $litpic = ''; if ($is_remote == 1) { $litpic = $post['litpic_remote']; } else { $litpic = $post['litpic_local']; } if (empty($litpic)) { $litpic = get_html_first_imgurl($content); } $post['litpic'] = $litpic; /*是否有封面图*/ if (empty($post['litpic'])) { $is_litpic = 0; // 无封面图 } else { $is_litpic = !empty($post['is_litpic']) ? $post['is_litpic'] : 0; // 有封面图 } // SEO描述 $seo_description = ''; if (empty($post['seo_description']) && !empty($content)) { $seo_description = @msubstr(checkStrHtml($content), 0, config('global.arc_seo_description_length'), false); } else { $seo_description = $post['seo_description']; } // --外部链接 $jumplinks = ''; $is_jump = isset($post['is_jump']) ? $post['is_jump'] : 0; if (intval($is_jump) > 0) { $jumplinks = $post['jumplinks']; } // 模板文件,如果文档模板名与栏目指定的一致,默认就为空。让它跟随栏目的指定而变 if ($post['type_tempview'] == $post['tempview']) { unset($post['type_tempview']); unset($post['tempview']); } // 产品类型 if (!empty($post['prom_type'])) { if ($post['prom_type_vir'] == 2) { $post['netdisk_url'] = trim($post['netdisk_url']); if (empty($post['netdisk_url'])) { $this->error("网盘地址不能为空!"); } $post['prom_type'] = 2; } else if ($post['prom_type_vir'] == 3) { $post['text_content'] = trim($post['text_content']); if (empty($post['text_content'])) { $this->error("虚拟文本内容不能为空!"); } $post['prom_type'] = 3; } } //处理自定义文件名,仅由字母数字下划线和短横杆组成,大写强制转换为小写 if (!empty($post['htmlfilename'])) { $post['htmlfilename'] = preg_replace("/[^a-zA-Z0-9_-]+/", "", $post['htmlfilename']); $post['htmlfilename'] = strtolower($post['htmlfilename']); //判断是否存在相同的自定义文件名 $filenameCount = Db::name('archives')->where([ 'aid' => ['NEQ', $post['aid']], 'htmlfilename' => $post['htmlfilename'], ])->count(); if (!empty($filenameCount)) { $this->error("自定义文件名已存在,请重新设置!"); } } // 同步栏目切换模型之后的文档模型 $channel = Db::name('arctype')->where(['id'=>$typeid])->getField('current_channel'); // --存储数据 $newData = array( 'typeid'=> $typeid, 'channel' => $channel, 'is_b' => empty($post['is_b']) ? 0 : $post['is_b'], 'is_head' => empty($post['is_head']) ? 0 : $post['is_head'], 'is_special' => empty($post['is_special']) ? 0 : $post['is_special'], 'is_recom' => empty($post['is_recom']) ? 0 : $post['is_recom'], 'is_jump' => $is_jump, 'is_litpic' => $is_litpic, 'jumplinks' => $jumplinks, 'seo_keywords' => $seo_keywords, 'seo_description' => $seo_description, 'stock_show' => empty($post['stock_show']) ? 0 : $post['stock_show'], 'add_time' => strtotime($post['add_time']), 'update_time' => getTime(), ); $data = array_merge($post, $newData); $r = Db::name('archives')->where([ 'aid' => $data['aid'], 'lang' => $this->admin_lang, ])->update($data); if ($r) { // ---------后置操作 model('Product')->afterSave($data['aid'], $data, 'edit'); // 更新规格名称数据 // model('ProductSpecData')->ProducSpecNameEditSave($data); //虚拟商品保存 if (!empty($post['prom_type']) && in_array($post['prom_type'], [2,3])) { model('ProductNetdisk')->saveProductNetdisk($data['aid'], $data); } // 更新规格值及金额数据 model('ProductSpecValue')->ProducSpecValueEditSave($data); // ---------end adminLog('编辑产品:'.$data['title']); // 生成静态页面代码 $successData = [ 'aid' => $data['aid'], 'tid' => $typeid, ]; $this->success("操作成功!", null, $successData); exit; } $this->error("操作失败!"); exit; } $assign_data = array(); $id = input('id/d'); $info = model('Product')->getInfo($id); // 获取规格数据信息 // 包含:SpecSelectName、HtmlTable、spec_mark_id_arr、preset_value $assign_data = model('ProductSpecData')->GetProductSpecData($id); if (empty($info)) { $this->error('数据不存在,请联系管理员!'); exit; } /*兼容采集没有归属栏目的文档*/ if (empty($info['channel'])) { $channelRow = Db::name('channeltype')->field('id as channel') ->where('id',$this->channeltype) ->find(); $info = array_merge($info, $channelRow); } /*--end*/ $typeid = $info['typeid']; // 栏目信息 $arctypeInfo = Db::name('arctype')->find($typeid); $info['channel'] = $arctypeInfo['current_channel']; if (is_http_url($info['litpic'])) { $info['is_remote'] = 1; $info['litpic_remote'] = handle_subdir_pic($info['litpic']); } else { $info['is_remote'] = 0; $info['litpic_local'] = handle_subdir_pic($info['litpic']); } // SEO描述 if (!empty($info['seo_description'])) { $info['seo_description'] = @msubstr(checkStrHtml($info['seo_description']), 0, config('global.arc_seo_description_length'), false); } $assign_data['field'] = $info; // 产品相册 $proimg_list = model('ProductImg')->getProImg($id); foreach ($proimg_list as $key => $val) { $proimg_list[$key]['image_url'] = handle_subdir_pic($val['image_url']); // 支持子目录 } $assign_data['proimg_list'] = $proimg_list; /*允许发布文档列表的栏目,文档所在模型以栏目所在模型为主,兼容切换模型之后的数据编辑*/ $arctype_html = allow_release_arctype($typeid, array($info['channel'])); $assign_data['arctype_html'] = $arctype_html; /*--end*/ /*自定义字段*/ $addonFieldExtList = model('Field')->getChannelFieldList($info['channel'], 0, $id, $info); $channelfieldBindRow = Db::name('channelfield_bind')->where([ 'typeid' => ['IN', [0,$typeid]], ])->column('field_id'); if (!empty($channelfieldBindRow)) { foreach ($addonFieldExtList as $key => $val) { if (!in_array($val['id'], $channelfieldBindRow)) { unset($addonFieldExtList[$key]); } } } $assign_data['addonFieldExtList'] = $addonFieldExtList; $assign_data['aid'] = $id; /*--end*/ /*可控制的主表字段列表*/ $assign_data['ifcontrolRow'] = Db::name('channelfield')->field('id,name')->where([ 'channel_id' => $this->channeltype, 'ifmain' => 1, 'ifeditable' => 1, 'ifcontrol' => 0, 'status' => 1, ])->getAllWithIndex('name'); /*虚拟商品内容读取*/ $assign_data['netdisk'] = Db::name("product_netdisk")->where('aid', $id)->find(); /*end*/ // 阅读权限 $arcrank_list = get_arcrank_list(); $assign_data['arcrank_list'] = $arcrank_list; /*产品参数*/ $assign_data['canshu'] = $this->ajax_get_attr_input($typeid, $id); /*--end*/ /*模板列表*/ $archivesLogic = new \app\admin\logic\ArchivesLogic; $templateList = $archivesLogic->getTemplateList($this->nid); $this->assign('templateList', $templateList); /*--end*/ /*默认模板文件*/ $tempview = $info['tempview']; empty($tempview) && $tempview = $arctypeInfo['tempview']; $this->assign('tempview', $tempview); /*--end*/ // 商城配置 $shopConfig = getUsersConfigData('shop'); $assign_data['shopConfig'] = $shopConfig; // 处理产品价格属性 $IsSame = ''; if (empty($shopConfig['shop_type']) || 1 == $shopConfig['shop_type']) { if ($shopConfig['shop_type'] == $assign_data['field']['prom_type']) { $IsSame = '0'; // 相同 }elseif ($shopConfig['shop_type']==1 && in_array($assign_data['field']['prom_type'], [2,3])) { $IsSame = '0'; // 相同 }else{ $IsSame = '1'; // 不相同 } } $assign_data['IsSame'] = $IsSame; // URL模式 $tpcache = config('tpcache'); $assign_data['seo_pseudo'] = !empty($tpcache['seo_pseudo']) ? $tpcache['seo_pseudo'] : 1; $this->assign($assign_data); return $this->fetch(); } /** * 删除 */ public function del() { if (IS_POST) { $archivesLogic = new \app\admin\logic\ArchivesLogic; $archivesLogic->del(); } } /** * 删除商品相册图 */ public function del_proimg() { if (IS_POST) { $filename= input('filename/s'); $filename= str_replace('../','',$filename); $filename= trim($filename,'.'); if(eyPreventShell($filename) && !empty($filename)){ $filename_new = trim($filename,'/'); $filetype = preg_replace('/^(.*)\.(\w+)$/i', '$2', $filename); $phpfile = strtolower(strstr($filename,'.php')); //排除PHP文件 $size = getimagesize($filename_new); $fileInfo = explode('/',$size['mime']); if((file_exists($filename_new) && $fileInfo[0] != 'image') || $phpfile || !in_array($filetype, explode(',', config('global.image_ext')))){ exit; } if (!empty($filename)) { M('product_img')->where("image_url = '$filename'")->delete(); } } } } /** * 产品参数 */ public function attribute_index() { $assign_data = array(); $condition = array(); // 获取到所有GET参数 $get = input('get.'); $typeid = input('typeid/d', 0); // 应用搜索条件 foreach (['keywords','typeid'] as $key) { if (isset($get[$key]) && $get[$key] !== '') { if ($key == 'keywords') { $condition['a.attr_name'] = array('LIKE', "%{$get[$key]}%"); } else if ($key == 'typeid') { $typeids = model('Arctype')->getHasChildren($get[$key]); $condition['a.typeid'] = array('IN', array_keys($typeids)); } else { $condition['a.'.$key] = array('eq', $get[$key]); } } } $condition['a.is_del'] = 0; // 多语言 $condition['a.lang'] = $this->admin_lang; /** * 数据查询,搜索出主键ID的值 */ $count = DB::name('product_attribute')->alias('a')->where($condition)->count();// 查询满足要求的总记录数 $Page = new Page($count, config('paginate.list_rows'));// 实例化分页类 传入总记录数和每页显示的记录数 $list = DB::name('product_attribute') ->field("a.attr_id") ->alias('a') ->where($condition) ->order('a.sort_order asc, a.attr_id asc') ->limit($Page->firstRow.','.$Page->listRows) ->getAllWithIndex('attr_id'); /** * 完善数据集信息 * 在数据量大的情况下,经过优化的搜索逻辑,先搜索出主键ID,再通过ID将其他信息补充完整; */ if ($list) { $attr_ids = array_keys($list); $fields = "b.*, a.*"; $row = DB::name('product_attribute') ->field($fields) ->alias('a') ->join('__ARCTYPE__ b', 'a.typeid = b.id', 'LEFT') ->where('a.attr_id', 'in', $attr_ids) ->getAllWithIndex('attr_id'); /*获取多语言关联绑定的值*/ $row = model('LanguageAttr')->getBindValue($row, 'product_attribute', $this->main_lang); // 多语言 /*--end*/ 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; // 赋值分页对象 /*获取当前模型栏目*/ $selected = $typeid; $arctypeLogic = new ArctypeLogic(); $map = array( 'channeltype' => $this->channeltype, 'is_del' => 0, ); $arctype_max_level = intval(config('global.arctype_max_level')); $select_html = $arctypeLogic->arctype_list(0, $selected, true, $arctype_max_level, $map); $this->assign('select_html',$select_html); /*--end*/ // 栏目ID $assign_data['typeid'] = $typeid; // 栏目ID /*当前栏目信息*/ $arctype_info = array(); if ($typeid > 0) { $arctype_info = M('arctype')->field('typename')->find($typeid); } $assign_data['arctype_info'] = $arctype_info; /*--end*/ /*选项卡*/ $tab = input('param.tab/d', 3); $assign_data['tab'] = $tab; /*--end*/ $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_AJAX && IS_POST)//ajax提交验证 { $model = model('ProductAttribute'); $attr_values = str_replace('_', '', input('attr_values')); // 替换特殊字符 $attr_values = str_replace('@', '', $attr_values); // 替换特殊字符 $attr_values = trim($attr_values); $post_data = input('post.'); $post_data['attr_values'] = $attr_values; $savedata = array( 'attr_name' => $post_data['attr_name'], 'typeid' => $post_data['typeid'], 'attr_input_type' => isset($post_data['attr_input_type']) ? $post_data['attr_input_type'] : '', 'attr_values' => isset($post_data['attr_values']) ? $post_data['attr_values'] : '', 'sort_order' => $post_data['sort_order'], 'lang' => $this->admin_lang, 'add_time' => getTime(), 'update_time' => getTime(), ); // 数据验证 $validate = \think\Loader::validate('ProductAttribute'); 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->syn_add_language_attribute($insertId); /*--end*/ $return_arr = array( 'status' => 1, 'msg' => '操作成功', 'data' => array('url'=>url('Product/attribute_index', array('typeid'=>$post_data['typeid']))), ); adminLog('新增产品参数:'.$savedata['attr_name']); respose($return_arr); } } $typeid = input('param.typeid/d', 0); $assign_data = array(); /*允许发布文档列表的栏目*/ $arctype_html = allow_release_arctype($typeid, array($this->channeltype)); $assign_data['arctype_html'] = $arctype_html; /*--end*/ $this->assign($assign_data); return $this->fetch(); } /** * 编辑产品参数 */ public function attribute_edit() { if(IS_AJAX && IS_POST)//ajax提交验证 { $model = model('ProductAttribute'); $attr_values = str_replace('_', '', input('attr_values')); // 替换特殊字符 $attr_values = str_replace('@', '', $attr_values); // 替换特殊字符 $attr_values = trim($attr_values); $post_data = input('post.'); $post_data['attr_values'] = $attr_values; $savedata = array( 'attr_id' => $post_data['attr_id'], 'attr_name' => $post_data['attr_name'], 'typeid' => $post_data['typeid'], 'attr_input_type' => isset($post_data['attr_input_type']) ? $post_data['attr_input_type'] : '', 'attr_values' => isset($post_data['attr_values']) ? $post_data['attr_values'] : '', 'sort_order' => $post_data['sort_order'], 'update_time' => getTime(), ); // 数据验证 $validate = \think\Loader::validate('ProductAttribute'); 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'], 'lang' => $this->admin_lang, ])->save(); // 写入数据到数据库 $return_arr = array( 'status' => 1, 'msg' => '操作成功', 'data' => array('url'=>url('Product/attribute_index', array('typeid'=>$post_data['typeid']))), ); adminLog('编辑产品参数:'.$savedata['attr_name']); respose($return_arr); } } $assign_data = array(); $id = input('id/d'); /*获取多语言关联绑定的值*/ $new_id = model('LanguageAttr')->getBindValue($id, 'product_attribute'); // 多语言 !empty($new_id) && $id = $new_id; /*--end*/ $info = M('ProductAttribute')->where([ 'attr_id' => $id, 'lang' => $this->admin_lang, ])->find(); if (empty($info)) { $this->error('数据不存在,请联系管理员!'); exit; } $assign_data['field'] = $info; /*允许发布文档列表的栏目*/ $arctype_html = allow_release_arctype($info['typeid'], array($this->channeltype)); $assign_data['arctype_html'] = $arctype_html; /*--end*/ $this->assign($assign_data); return $this->fetch(); } /** * 删除产品参数 */ public function attribute_del() { $id_arr = input('del_id/a'); $id_arr = eyIntval($id_arr); if(!empty($id_arr)){ /*多语言*/ if (is_language()) { $attr_name_arr = []; foreach ($id_arr as $key => $val) { $attr_name_arr[] = 'attr_'.$val; } $new_id_arr = Db::name('language_attr')->where([ 'attr_name' => ['IN', $attr_name_arr], 'attr_group' => 'product_attribute', ])->column('attr_value'); !empty($new_id_arr) && $id_arr = $new_id_arr; } /*--end*/ $r = M('ProductAttribute')->where([ 'attr_id' => ['IN', $id_arr], ])->update([ 'is_del' => 1, 'update_time' => getTime(), ]); if($r){ adminLog('删除产品参数-id:'.implode(',', $id_arr)); $this->success('删除成功'); }else{ $this->error('删除失败'); } }else{ $this->error('参数有误'); } } /** * 动态获取产品参数输入框 根据不同的数据返回不同的输入框类型 */ public function ajax_get_attr_input($typeid = '', $aid = '') { $productLogic = new ProductLogic(); $str = $productLogic->getAttrInput($aid, $typeid); if (empty($str)) { $str = '