1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273 |
- <?php
- /**
- * 易优CMS
- * ============================================================================
- * 版权所有 2016-2028 海南赞赞网络科技有限公司,并保留所有权利。
- * 网站地址: http://www.eyoucms.com
- * ----------------------------------------------------------------------------
- * 如果商业用途务必到官方购买正版授权, 以免引起不必要的法律纠纷.
- * ============================================================================
- * Author: 易而优团队 by 小虎哥 <1105415366@qq.com>
- * 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 ShopProduct extends Base
- {
- // 模型标识
- public $nid = 'product';
- // 模型ID
- public $channeltype = '';
- // 表单类型
- public $attrInputTypeArr = array();
-
- public function _initialize() {
- parent::_initialize();
- $this->language_access(); // 多语言功能操作权限
- $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);
- // 产品属性表
- $this->product_attrlist_db = Db::name('product_attrlist');
- // 商城产品参数表
- $this->shop_product_attrlist_db = Db::name('shop_product_attrlist');
- // 产品规格表
- $this->product_spec_preset_db = Db::name('product_spec_preset');
- // 产品规格值表
- $this->product_spec_value_db = Db::name('product_spec_value');
- // 规格业务层
- $this->ProductSpecLogic = new ProductSpecLogic;
- // 规格名称模型层
- $this->ProductSpecPresetModel = model('ProductSpecPreset');
- // 规格值模型层
- $this->ProductSpecValueModel = model('ProductSpecValue');
- }
- /**
- * 文章列表
- */
- 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; // 赋值分页对象
- /*允许发布文档列表的栏目*/
- $arctype_html = allow_release_arctype($typeid, array($this->channeltype));
- $assign_data['arctype_html'] = $arctype_html;
- /*--end*/
- /*当前栏目信息*/
- $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', true);
- // ---------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("操作成功!", url('ShopProduct/index'), $successData);
- }
- $this->error("操作失败!");
- }
- $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();
- }
- /*商品参数列表*/
- $where = [
- 'is_del' => 0,
- 'status' => 1
- ];
- $assign_data['AttrList'] = $this->shop_product_attrlist_db->where($where)->order('sort_order asc')->select();
- /*END*/
- // 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', true);
-
- // 更新规格名称数据
- // 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("操作成功!", url('ShopProduct/index'), $successData);
- }
- $this->error("操作失败!");
- }
- $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'; // 相同
- }else{
- $IsSame = '1'; // 不相同
- }
- }
- $assign_data['IsSame'] = $IsSame;
- // URL模式
- $tpcache = config('tpcache');
- $assign_data['seo_pseudo'] = !empty($tpcache['seo_pseudo']) ? $tpcache['seo_pseudo'] : 1;
- /*商品参数列表*/
- $where = [
- 'is_del' => 0,
- 'status' => 1
- ];
- $assign_data['AttrList'] = $this->shop_product_attrlist_db->where($where)->order('sort_order asc')->select();
- /*END*/
- /*商品参数值*/
- $assign_data['canshu'] = '';
- if (!empty($info['attrlist_id'])) {
- $assign_data['canshu'] = $this->ajax_get_shop_attr_input($typeid, $id, $info['attrlist_id']);
- }
- /*--end*/
- $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 product_number_check()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- $where = [];
- if (!empty($post['aid'])) $where['aid'] = ['NOT IN', $post['aid']];
- if (!empty($post['product_number'])) {
- $where['product_number'] = $post['product_number'];
- } else {
- $this->error('请填写商品编号');
- }
- $Result = Db::name('archives')->where($where)->count('aid');
- if (!empty($Result)) {
- $this->error('商品编号已存在');
- } else {
- $this->success('商品编号正常');
- }
- }
- }
- // 商品规格列表
- public function spec_index()
- {
- // 获取所有商品规格名称,分页返回
- $PresetData = $this->ProductSpecPresetModel->GetAllSpecPreset(input('param.'));
- $this->assign($PresetData);
- return $this->fetch();
- }
- // 保存规格
- public function spec_save()
- {
- if (IS_AJAX_POST) {
- $param = input('param.');
- $SaveData = [];
- foreach ($param['preset_name'] as $key => $value) {
- // 规格名称为空则跳过
- if (empty($value)) continue;
- // 可添加数据
- $SaveData[$key] = [
- 'preset_id' => $param['preset_id'][$key],
- 'preset_name' => $value,
- 'preset_desc' => $param['preset_desc'][$key],
- 'preset_type' => $param['preset_type'][$key],
- 'sort_order' => $param['sort_order'][$key],
- 'update_time' => getTime()
- ];
- // 若为空则清除主键字段
- if (empty($SaveData[$key]['preset_id'])) {
- $SaveData[$key]['add_time'] = getTime();
- unset($SaveData[$key]['preset_id']);
- }
- }
- $ResultID = $this->ProductSpecPresetModel->saveAll($SaveData);
- if (!empty($ResultID)) {
- $this->success('更新成功');
- } else {
- $this->error('更新失败');
- }
- }
- }
- // 删除规格值
- public function spec_del()
- {
- $PresetID = input('del_id/a');
- $PresetID = eyIntval($PresetID);
- if(!empty($PresetID)) {
- $Result = $this->product_spec_preset_db->where('preset_id', 'IN', $PresetID)->delete();
- if($Result) {
- adminLog('删除商品规格-id:'.implode(',', $PresetID));
- $this->success('删除成功');
- } else {
- $this->error('删除失败');
- }
- } else {
- $this->error('参数有误');
- }
- }
- // 规格值列表
- public function spec_value_index()
- {
- $PresetID = input('id/d');
- // 获取单条规格名称数据
- $PresetData = $this->ProductSpecPresetModel->GetFindSpecPreset($PresetID);
- if (empty($PresetData)) $this->error('请先添加规格名称');
- $this->assign('PresetData', $PresetData);
- $Where['preset_id'] = $PresetID;
- $keywords = input('keywords/s');
- if (!empty($keywords)) $Where['preset_value'] = ['LIKE', "%{$keywords}%"];
- // 分页
- $count = $this->product_spec_value_db->where($Where)->count('preset_id');
- $pageObj = new Page($count, 10);
- $pageStr = $pageObj->show();
- $this->assign('pageObj', $pageObj);
- $this->assign('pageStr', $pageStr);
- // 查询规格数据
- $ValueData = $this->product_spec_value_db
- ->where($Where)
- ->order('sort_order asc, value_id asc')
- ->limit($pageObj->firstRow.','.$pageObj->listRows)
- ->select();
- foreach ($ValueData as $key => $value) {
- $ValueData[$key]['value_img_src'] = get_default_pic($value['value_img']);
- if (0 == $PresetData['preset_type']) unset($value['value_img']);
- }
- $this->assign('ValueData', $ValueData);
- return $this->fetch();
- }
- // 保存规格值
- public function spec_value_save()
- {
- if (IS_AJAX_POST) {
- $param = input('param.');
- $SaveData = [];
- $AddNum = 0;
- foreach ($param['value_name'] as $key => $value) {
- if (empty($value)) continue;
- // 可添加数据
- $SaveData[$key] = [
- 'value_id' => $param['value_id'][$key],
- 'preset_id' => $param['preset_id'],
- 'value_name' => $value,
- 'value_img' => !empty($param['value_img'][$key]) ? $param['value_img'][$key] : '',
- 'sort_order' => $param['sort_order'][$key],
- 'update_time' => getTime()
- ];
- // 若为空则清除主键字段
- if (empty($SaveData[$key]['value_id'])) {
- $AddNum++;
- $SaveData[$key]['add_time'] = getTime();
- unset($SaveData[$key]['value_id']);
- }
- }
- $ResultID = $this->ProductSpecValueModel->saveAll($SaveData);
- if (!empty($ResultID)) {
- /*更新规格名称表的规格值数量*/
- $this->product_spec_preset_db->where('preset_id', $param['preset_id'])->setInc('preset_value', $AddNum);
- /*END*/
- $this->success('更新成功');
- } else {
- $this->error('更新失败');
- }
- }
- }
- // 删除规格值
- public function spec_value_del()
- {
- $ValueID = input('del_id/a');
- $ValueID = eyIntval($ValueID);
- if(!empty($ValueID)){
- $Result = $this->product_spec_value_db->where('value_id', 'IN', $ValueID)->delete();
- if($Result){
- adminLog('删除商品规格值-id:'.implode(',', $ValueID));
- /*更新规格名称表的规格值数量*/
- $DelNum = count($ValueID);
- $this->product_spec_preset_db->where('preset_id', input('post.preset_id/d'))->setDec('preset_value', $DelNum);
- /*END*/
- $this->success('删除成功');
- }else{
- $this->error('删除失败');
- }
- }else{
- $this->error('参数有误');
- }
- }
- // 规格模板
- public function spec_template()
- {
- // 查询规格数据
- $PresetData = $this->product_spec_preset_db->where('status', 1)->order('sort_order asc')->select();
- $PresetID = get_arr_column($PresetData, 'preset_id');
-
- $where = [
- 'status' => 1,
- 'preset_id' => ['IN', $PresetID]
- ];
- $ValueData = $this->product_spec_value_db->where($where)->order('sort_order asc')->select();
- $ValueData = group_same_key($ValueData, 'preset_id');
- foreach ($PresetData as $key => $value) {
- $PresetData[$key]['SpecValue'] = !empty($ValueData[$value['preset_id']]) ? $ValueData[$value['preset_id']] : [];
- }
- $this->assign('PresetData', $PresetData);
- return $this->fetch('spec_template');
- }
- public function combi_spec_data()
- {
- if (IS_AJAX_POST) {
- $post = input('post.');
- // 刷新或重新进入产品添加页则清除关于产品session
- if (isset($post['initialization']) && !empty($post['initialization'])) {
- session('SpecID', null); $this->success('初始化完成');
- }
- // 初始化变量
- $HtmlTable = $SelectedSpec = null;
- // 获取已选规格拼装及生成规格HTML的ID
- if (!empty($post['preset_id'])) {
- $ResultData = $this->ProductSpecLogic->GetSelectedSpec($post);
- $SelectedSpec = $ResultData['SelectedSpec'];
- }
- // 清除一整条规格信息,清除session中相应的数据
- if (!empty($post['del_preset_id']) && empty($post['del_value_id'])) {
- $ResultData = $this->ProductSpecLogic->ClearSpecPresetMarkID($post);
- }
- // 删除单个规格值则清除session对应的值
- if (!empty($post['del_preset_id']) && !empty($post['del_value_id'])) {
- $ResultData = $this->ProductSpecLogic->ClearSpecPresetValueID($post);
- }
- // 获取规格拼装后的html表格
- if (isset($post['aid']) && !empty($post['aid'])) {
- // 编辑
- $HtmlTable = $this->ProductSpecLogic->SpecAssembly($ResultData['ResultID'], $post['aid']);
- } else {
- // 新增
- $HtmlTable = $this->ProductSpecLogic->SpecAssembly($ResultData['ResultID'], $post['aid']);
- }
- // 返回数据
- $ReturnData = [
- 'HtmlTable' => $HtmlTable,
- 'SelectedSpec' => $SelectedSpec
- ];
- $this->success('加载成功!', null, $ReturnData);
- }
- }
- // 商品属性列表
- public function attrlist_index()
- {
- // 查询条件
- $Where['is_del'] = 0;
- $keywords = input('keywords/s');
- if (!empty($keywords)) $Where['list_name'] = ['LIKE', "%{$keywords}%"];
- // 分页
- $count = $this->shop_product_attrlist_db->where($Where)->count('list_id');
- $pageObj = new Page($count, config('paginate.list_rows'));
- $pageStr = $pageObj->show();
- $this->assign('pageObj', $pageObj);
- $this->assign('pageStr', $pageStr);
- // 数据
- $list = $this->shop_product_attrlist_db
- ->where($Where)
- ->order('sort_order asc')
- ->limit($pageObj->firstRow.','.$pageObj->listRows)
- ->select();
- $this->assign('list', $list);
- return $this->fetch();
- }
- // 新增商品属性
- public function attrlist_add()
- {
- function_exists('set_time_limit') && set_time_limit(0);
- if(IS_AJAX_POST) {
- $post = input('post.');
- // 参数名称不可重复
- $ListName = array_unique($post['list_name']);
- if (count($ListName) != count($post['list_name'])) $this->error('参数名称不可重复!');
-
- // 数据拼装
- $SaveData = [];
- foreach ($ListName as $key => $value) {
- if (!empty($value)) {
- $list_id = $post['list_id'][$key];
- $list_name = trim($value);
- $SaveData[$key] = [
- 'list_id' => !empty($list_id) ? $list_id : 0,
- 'list_name' => $list_name,
- 'desc' => !empty($post['desc'][$key]) ? $post['desc'][$key] : '',
- 'sort_order' => !empty($post['sort_order'][$key]) ? $post['sort_order'][$key] : 100,
- 'update_time' => getTime()
- ];
- if (empty($list_id)) {
- $SaveData[$key]['add_time'] = getTime();
- unset($SaveData[$key]['list_id']);
- }
- }
- }
- $ReturnId = model('ShopProductAttrlist')->saveAll($SaveData);
- if ($ReturnId) {
- adminLog('新增商品参数:'.implode(',', $post['list_name']));
- $this->success('操作成功', url('Product/attrlist_index'));
- } else {
- $this->error('操作失败');
- }
- }
- }
- // 参数删除
- public function attrlist_del()
- {
- $id_arr = input('del_id/a');
- $id_arr = eyIntval($id_arr);
- if(!empty($id_arr)){
- $Result = $this->shop_product_attrlist_db->where('list_id', 'IN', $id_arr)->delete();
- if($Result){
- adminLog('删除商品参数-id:'.implode(',', $id_arr));
- $this->success('删除成功');
- }else{
- $this->error('删除失败');
- }
- }else{
- $this->error('参数有误');
- }
- }
- /**
- * 商品参数值列表
- */
- public function attribute_index()
- {
- $condition = array();
- // 获取到所有GET参数
- $get = input('get.');
- $list_id = input('list_id/d', 0);
- // 应用搜索条件
- foreach (['keywords', 'list_id'] as $key) {
- if (isset($get[$key]) && $get[$key] !== '') {
- if ($key == 'keywords') {
- $condition['a.attr_name'] = ['LIKE', "%{$get[$key]}%"];
- } else if ($key == 'list_id') {
- $condition['a.list_id'] = $list_id;
- } else {
- $condition['a.'.$key] = ['eq', $get[$key]];
- }
- }
- }
- $condition['a.is_del'] = 0;
- // 分页
- $count = DB::name('shop_product_attribute')->alias('a')->where($condition)->count();
- $pageObj = new Page($count, config('paginate.list_rows'));
- $pageStr = $pageObj->show();
- $this->assign('pageObj', $pageObj);
- $this->assign('pageStr', $pageStr);
-
- // 数据
- $list = DB::name('shop_product_attribute')
- ->alias('a')
- ->where($condition)
- ->order('a.sort_order asc, a.attr_id asc')
- ->limit($pageObj->firstRow.','.$pageObj->listRows)
- ->select();
- $attrInputTypeArr = [
- 0 => '手工录入',
- 1 => '选取默认值'
- ];
- $this->assign('attrInputTypeArr', $attrInputTypeArr);
- $this->assign('list', $list);
- return $this->fetch();
- }
-
- /**
- * 新增商品参数
- */
- public function attribute_add()
- {
- //防止php超时
- function_exists('set_time_limit') && set_time_limit(0);
-
- if(IS_AJAX_POST) {
- $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'],
- 'list_id' => $post_data['list_id'],
- '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'],
- 'status' => 1,
- 'add_time' => getTime(),
- 'update_time' => getTime(),
- );
- $ReturnId = Db::name('shop_product_attribute')->add($SaveData);
- if ($ReturnId) {
- // 参数值合计增加
- Db::name('shop_product_attrlist')->where('list_id', $post_data['list_id'])->setInc('attr_count');
- adminLog('新增商品参数:'.$SaveData['attr_name']);
- $this->success('操作成功');
- } else {
- $this->error('操作失败');
- }
- }
- $list_id = input('param.list_id/d', 0);
- $list = $this->shop_product_attrlist_db->where('list_id', $list_id)->find();
- $this->assign('list', $list);
- return $this->fetch();
- }
- /**
- * 编辑商品参数
- */
- public function attribute_edit()
- {
- //防止php超时
- function_exists('set_time_limit') && set_time_limit(0);
- if(IS_AJAX_POST) {
- $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'],
- 'list_id' => $post_data['list_id'],
- '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(),
- );
- $ReturnId = Db::name('shop_product_attribute')->where('attr_id', $post_data['attr_id'])->update($SaveData);
- if ($ReturnId) {
- adminLog('编辑商品参数:'.$SaveData['attr_name']);
- $this->success('操作成功');
- } else {
- $this->error('操作失败');
- }
- }
- $info = Db::name('shop_product_attribute')->where('attr_id', input('id/d'))->find();
- if (empty($info)) $this->error('数据不存在,请联系管理员!');
- $this->assign('field', $info);
- $list = $this->shop_product_attrlist_db->where('list_id', $info['list_id'])->find();
- $this->assign('list', $list);
- return $this->fetch();
- }
-
- /**
- * 删除商品参数
- */
- public function attribute_del()
- {
- $id_arr = input('del_id/a');
- $id_arr = eyIntval($id_arr);
- if(!empty($id_arr)){
- $r = Db::name('shop_product_attribute')->where(['attr_id' => ['IN', $id_arr]])->delete();
- if($r){
- $IDCount = count($id_arr);
- Db::name('shop_product_attrlist')->where('list_id', input('list_id/d'))->setDec('attr_count', $IDCount);
- adminLog('删除商品参数-id:'.implode(',', $id_arr));
- $this->success('删除成功');
- } else {
- $this->error('删除失败');
- }
- } else {
- $this->error('参数有误');
- }
- }
- /**
- * 动态获取商品参数输入框 根据不同的数据返回不同的输入框类型
- */
- public function ajax_get_shop_attr_input($typeid = '', $aid = '', $list_id = '')
- {
- $productLogic = new ProductLogic();
- $str = $productLogic->getShopAttrInput($aid, $typeid, $list_id);
- if (empty($str)) {
- $str = '<div style="font-size: 12px;text-align: center;">提示:该参数还没有参数值,若有需要请点击【<a href="'.url('Product/attribute_index', array('list_id'=>$list_id)).'">商品参数</a>】进行更多操作。</div>';
- }
- if (IS_AJAX) {
- exit($str);
- } else {
- return $str;
- }
- }
- /**
- * 动态获取商品参数输入框 根据不同的数据返回不同的输入框类型
- */
- public function ajax_get_attr_input($typeid = '', $aid = '', $list_id = '')
- {
- $productLogic = new ProductLogic();
- $str = $productLogic->getAttrInput($aid, $typeid, $list_id);
- if (empty($str)) {
- $str = '<div style="font-size: 12px;text-align: center;">提示:该参数还没有参数值,若有需要请点击【<a href="'.url('Product/attribute_index', array('list_id'=>$list_id)).'">商品参数</a>】进行更多操作。</div>';
- }
- if (IS_AJAX) {
- exit($str);
- } else {
- return $str;
- }
- }
- }
|