vr-shopxo-plugin/shopxo/app/service/ThemeDataService.php

1880 lines
79 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2099 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( https://opensource.org/licenses/mit-license.php )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\service;
use think\facade\Db;
use app\service\ResourcesService;
use app\service\AttachmentService;
use app\service\ConfigService;
use app\service\StoreService;
use app\service\GoodsService;
use app\service\GoodsCategoryService;
use app\service\ArticleService;
use app\service\SystemService;
use app\service\AdminService;
/**
* 主题数据服务层
* @author Devil
* @blog http://gong.gg/
* @version 0.0.1
* @datetime 2016-12-01T21:51:08+0800
*/
class ThemeDataService
{
// 排除的文件后缀
private static $exclude_ext = ['php'];
/**
* 主题数据管理数据
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2024-04-02
* @desc description
* @param [array] $params [输入参数]
*/
public static function ThemeDataAdminData($params = [])
{
// 指定了就存储session、则从session读取
$status_key = 'user_is_theme_data_admin_sttaus_'.$params['default_theme'];
if(isset($params['is_theme_data_admin']))
{
$status = intval($params['is_theme_data_admin']);
MySession($status_key, $status);
} else {
$status = MySession($status_key);
if($status === null)
{
$status = 0;
}
}
if($status == 1)
{
$admin = AdminService::LoginInfo();
if(empty($admin))
{
$status = 0;
}
}
// 管理url地址
$admin_key = 'user_is_theme_data_admin_url_data_'.$params['default_theme'];
if(empty($params['admin_url_data']))
{
$admin_url_data = MySession($admin_key);
} else {
$admin_url_data = json_decode(base64_decode(urldecode($params['admin_url_data'])), true);
MySession($admin_key, $admin_url_data);
}
return [
'status' => $status,
'admin_url_data' => $admin_url_data,
];
}
/**
* 主题数据
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2024-04-02
* @desc description
* @param [array] $params [输入参数]
*/
public static function ThemeData($params = [])
{
$result = [];
if(!empty($params['mca']) && !empty($params['default_theme']))
{
// 页面条件、默认读取没有指定页面的数据
$view = [-1];
// 页面条件
$theme_view_list = MyConst('common_theme_view_list');
if(!empty($theme_view_list) && is_array($theme_view_list))
{
$theme_view_list = array_column($theme_view_list, 'value', 'type');
if(array_key_exists($params['mca'], $theme_view_list))
{
$view[] = $theme_view_list[$params['mca']];
}
}
// 条件
$where = [
['is_enable', '=', 1],
['view', 'in', $view],
['theme', '=', $params['default_theme']]
];
$result = array_column(self::ThemeDataListHandle(Db::name('ThemeData')->where($where)->field('id,unique,name,theme,type,data')->select()->toArray(), ['is_view'=>1]), null, 'unique');
}
return $result;
}
/**
* 列表数据处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2024-03-31
* @desc description
* @param [array] $data [列表数据]
* @param [array] $params [输入参数]
*/
public static function ThemeDataListHandle($data, $params = [])
{
if(!empty($data) && is_array($data))
{
// 指定的商品和文章
$appoint = self::ListAppointGoodsArticleData($data);
// 当前站点地址
$domain_url = SystemService::DomainUrl();
// 是否页面展示读取
$is_view = isset($params['is_view']) && $params['is_view'] == 1;
// 循环处理数据
foreach($data as &$v)
{
// 配置数据
if(!empty($v['data']))
{
// 非数组则解析json
if(!is_array($v['data']))
{
$v['data'] = json_decode($v['data'], true);
}
if(is_array($v['data']) && isset($v['type']))
{
// 配置数据处理
foreach($v['data'] as $ks=>$vs)
{
// 当前url地址当前所有数据类型都有基础标题的数据
if(isset($vs['url_data']))
{
$vs['url'] = self::UrlHandle($domain_url, $vs['url_data']);
}
// 附件url地址处理
if(substr($ks, 0, 7) == 'images_' && isset($vs['value']))
{
$vs['value'] = ResourcesService::AttachmentPathViewHandle($vs['value']);
}
// 不同数据类型处理
switch($v['type'])
{
// 单图文
case 0 :
// 自定义数据
if($ks == 'custom_data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
// 图标
$vs[$kss]['icon'] = empty($vss['icon']) ? '' : ResourcesService::AttachmentPathViewHandle($vss['icon']);
// 当前url地址
$vs[$kss]['url'] = empty($vss['url_data']) ? '' : self::UrlHandle($domain_url, $vss['url_data']);
}
}
break;
// 多图文
case 1 :
if($ks == 'data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
if(!empty($vss) && is_array($vss))
{
foreach($vss as $ksss=>$vsss)
{
// 附件url地址处理
if(substr($ksss, 0, 7) == 'images_' && isset($vsss['value']))
{
$vs[$kss][$ksss]['value'] = ResourcesService::AttachmentPathViewHandle($vsss['value']);
}
// 当前url地址
if(isset($vsss['url_data']))
{
$vs[$kss][$ksss]['url'] = self::UrlHandle($domain_url, $vsss['url_data']);
}
}
}
}
}
break;
// 商品
case 3 :
if(isset($v['data']['goods_data_type']) && $v['data']['goods_data_type'] == 1)
{
if($ks == 'goods_data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
// 处理商品自定义封面图片
if(!empty($vss['custom_cover']))
{
$vs[$kss]['custom_cover'] = ResourcesService::AttachmentPathViewHandle($vss['custom_cover']);
}
// 商品
if(!empty($appoint['goods_data']) && !empty($vss['data_id']) && array_key_exists($vss['data_id'], $appoint['goods_data']))
{
// 商品数据合并
$vs[$kss] = array_merge($appoint['goods_data'][$vss['data_id']], $vs[$kss]);
// 是否页面展示
if($is_view && !empty($vs[$kss]['custom_cover']))
{
$vs[$kss]['images'] = $vs[$kss]['custom_cover'];
}
} else {
// 不存在对应的数据则删除
unset($vs[$kss]);
}
}
$vs = array_values($vs);
}
}
break;
// 文章
case 4 :
if(isset($v['data']['article_data_type']) && $v['data']['article_data_type'] == 1)
{
if($ks == 'article_data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
// 处理文章自定义封面图片
if(!empty($vss['custom_cover']))
{
$vs[$kss]['custom_cover'] = ResourcesService::AttachmentPathViewHandle($vss['custom_cover']);
}
// 文章
if(!empty($appoint['article_data']) && !empty($vss['data_id']) && array_key_exists($vss['data_id'], $appoint['article_data']))
{
// 文章数据合并
$vs[$kss] = array_merge($appoint['article_data'][$vss['data_id']], $vs[$kss]);
// 是否页面展示
if($is_view && !empty($vs[$kss]['custom_cover']))
{
$vs[$kss]['cover'] = $vs[$kss]['custom_cover'];
}
} else {
// 不存在对应的数据则删除
unset($vs[$kss]);
}
}
$vs = array_values($vs);
}
}
break;
// 商品组
case 5 :
if($ks == 'data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
if(!empty($vss) && is_array($vss))
{
foreach($vss as $ksss=>$vsss)
{
// 当前url地址当前所有数据类型都有基础标题的数据
if(isset($vsss['url_data']))
{
$vs[$kss][$ksss]['url'] = self::UrlHandle($domain_url, $vsss['url_data']);
}
// 附件url地址处理
if(substr($ksss, 0, 7) == 'images_' && isset($vsss['value']))
{
$vs[$kss][$ksss]['value'] = ResourcesService::AttachmentPathViewHandle($vsss['value']);
}
}
}
// 手动指定的商品
if(isset($vss['goods_data_type']) && $vss['goods_data_type'] == 1 && !empty($vss['goods_data']) && is_array($vss['goods_data']))
{
foreach($vss['goods_data'] as $ksss=>$vsss)
{
// 处理商品自定义封面图片
if(!empty($vsss['custom_cover']))
{
$vs[$kss]['goods_data'][$ksss]['custom_cover'] = ResourcesService::AttachmentPathViewHandle($vsss['custom_cover']);
}
// 商品
if(!empty($appoint['goods_data']) && !empty($vsss['data_id']) && array_key_exists($vsss['data_id'], $appoint['goods_data']))
{
// 商品数据合并
$vs[$kss]['goods_data'][$ksss] = array_merge($appoint['goods_data'][$vsss['data_id']], $vs[$kss]['goods_data'][$ksss]);
// 是否页面展示
if($is_view && !empty($vs[$kss]['goods_data'][$ksss]['custom_cover']))
{
$vs[$kss]['goods_data'][$ksss]['images'] = $vs[$kss]['goods_data'][$ksss]['custom_cover'];
}
} else {
// 不存在对应的数据则删除
unset($vs[$kss]['goods_data'][$ksss]);
}
}
$vs[$kss]['goods_data'] = array_values($vs[$kss]['goods_data']);
} else {
$vs[$kss]['goods_data'] = [];
}
// 自动读取商品
if(!isset($vss['goods_data_type']) || $vss['goods_data_type'] == 0)
{
$vs[$kss]['goods_data'] = self::AutoGoodsList($vss);
}
}
}
break;
// 文章组
case 6 :
if($ks == 'data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
if(!empty($vss) && is_array($vss))
{
foreach($vss as $ksss=>$vsss)
{
// 当前url地址当前所有数据类型都有基础标题的数据
if(isset($vsss['url_data']))
{
$vs[$kss][$ksss]['url'] = self::UrlHandle($domain_url, $vsss['url_data']);
}
// 附件url地址处理
if(substr($ksss, 0, 7) == 'images_' && isset($vsss['value']))
{
$vs[$kss][$ksss]['value'] = ResourcesService::AttachmentPathViewHandle($vsss['value']);
}
}
}
// 手动指定的文章
if(isset($vss['article_data_type']) && $vss['article_data_type'] == 1 && !empty($vss['article_data']) && is_array($vss['article_data']))
{
foreach($vss['article_data'] as $ksss=>$vsss)
{
// 处理文章自定义封面图片
if(!empty($vsss['custom_cover']))
{
$vs[$kss]['article_data'][$ksss]['custom_cover'] = ResourcesService::AttachmentPathViewHandle($vsss['custom_cover']);
}
// 文章
if(!empty($appoint['article_data']) && !empty($vsss['data_id']) && array_key_exists($vsss['data_id'], $appoint['article_data']))
{
// 文章数据合并
$vs[$kss]['article_data'][$ksss] = array_merge($appoint['article_data'][$vsss['data_id']], $vs[$kss]['article_data'][$ksss]);
// 是否页面展示
if($is_view && !empty($vs[$kss]['article_data'][$ksss]['custom_cover']))
{
$vs[$kss]['article_data'][$ksss]['images'] = $vs[$kss]['article_data'][$ksss]['custom_cover'];
}
} else {
// 不存在对应的数据则删除
unset($vs[$kss]['article_data'][$ksss]);
}
}
$vs[$kss]['article_data'] = array_values($vs[$kss]['article_data']);
} else {
$vs[$kss]['article_data'] = [];
}
// 自动读取文章
if(!isset($vss['article_data_type']) || $vss['article_data_type'] == 0)
{
$vs[$kss]['article_data'] = self::AutoArticleList($vss);
}
}
}
break;
}
// 赋值数据
$v['data'][$ks] = $vs;
}
// 商品数据、自动读取获取商品
if($v['type'] == 3 && (!isset($v['data']['goods_data_type']) || $v['data']['goods_data_type'] == 0))
{
$v['data']['goods_data'] = self::AutoGoodsList($v['data']);
}
// 文章数据、自动读取获取文章
if($v['type'] == 4 && (!isset($v['data']['article_data_type']) || $v['data']['article_data_type'] == 0))
{
$v['data']['article_data'] = self::AutoArticleList($v['data']);
}
// 视频
if($v['type'] == 2)
{
$v['data']['video'] = (empty($v['data']) || empty($v['data']['video'])) ? '' : ResourcesService::AttachmentPathViewHandle($v['data']['video']);
$v['data']['custom_cover'] = (empty($v['data']) || empty($v['data']['custom_cover'])) ? '' : ResourcesService::AttachmentPathViewHandle($v['data']['custom_cover']);
}
}
}
}
}
return $data;
}
/**
* 指定商品和文章数据
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2024-07-24
* @desc description
* @param [array] $data [列表数据]
*/
public static function ListAppointGoodsArticleData($data)
{
$goods_ids = [];
$goods_data = [];
$article_ids = [];
$article_data = [];
foreach($data as $v)
{
if(isset($v['type']) && !empty($v['data']))
{
// 是否数组
if(!is_array($v['data']))
{
$v['data'] = json_decode($v['data'], true);
}
// 商品
if($v['type'] == 3 && !empty($v['data']['goods_data']) && is_array($v['data']['goods_data']))
{
$goods_ids = array_merge($goods_ids, array_filter(array_column($v['data']['goods_data'], 'data_id')));
}
// 商品组
if($v['type'] == 5 && !empty($v['data']['data']) && is_array($v['data']['data']))
{
foreach($v['data']['data'] as $vs)
{
if(!empty($vs['goods_data']) && is_array($vs['goods_data']))
{
$goods_ids = array_merge($goods_ids, array_filter(array_column($vs['goods_data'], 'data_id')));
}
}
}
// 文章
if($v['type'] == 4 && !empty($v['data']['article_data']) && is_array($v['data']['article_data']))
{
$article_ids = array_merge($article_ids, array_filter(array_column($v['data']['article_data'], 'data_id')));
}
// 文章组
if($v['type'] == 6 && !empty($v['data']['data']) && is_array($v['data']['data']))
{
foreach($v['data']['data'] as $vs)
{
if(!empty($vs['article_data']) && is_array($vs['article_data']))
{
$article_ids = array_merge($article_ids, array_filter(array_column($vs['article_data'], 'data_id')));
}
}
}
}
}
if(!empty($goods_ids))
{
$goods_data = array_column(self::AppointGoodsList(['goods_ids'=>$goods_ids]), null, 'id');
}
if(!empty($article_ids))
{
$article_data = array_column(self::AppointArticleList(['article_ids'=>$article_ids]), null, 'id');
}
return [
'goods_data' => $goods_data,
'article_data' => $article_data,
];
}
/**
* url处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2024-04-07
* @desc description
* @param [string] $domain_url [当前域名地址]
* @param [array] $url_data [url数据]
*/
public static function UrlHandle($domain_url, $url_data)
{
// 获取不同平台链接地址
$url = (!empty($url_data) && is_array($url_data) && !empty($url_data[APPLICATION_CLIENT_TYPE])) ? $url_data[APPLICATION_CLIENT_TYPE] : '';
// pc端处理url地址拼接
if(!empty($url) && APPLICATION_CLIENT_TYPE == 'pc')
{
if(!in_array(substr($url, 0, 6), ['http:/', 'https:']))
{
if(substr($url, 0, 1) == '/')
{
$url = substr($url, 1);
}
$url = $domain_url.$url;
}
}
return $url;
}
/**
* 指定读取文章列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-09-29
* @desc description
* @param [array] $params [输入参数]
*/
public static function AppointArticleList($params = [])
{
return ArticleService::AppointArticleList($params);
}
/**
* 自动读取文章列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-09-29
* @desc description
* @param [array] $config [配置信息]
*/
public static function AutoArticleList($config = [])
{
return ArticleService::AutoArticleList($config);
}
/**
* 指定读取商品列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-09-29
* @desc description
* @param [array] $params [输入参数]
*/
public static function AppointGoodsList($params = [])
{
return GoodsService::AppointGoodsList(array_merge($params, [
'is_spec' => 1,
'is_cart' => 1,
'is_favor' => 1,
]));
}
/**
* 自动读取商品列表
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-09-29
* @desc description
* @param [array] $params [输入参数]
*/
public static function AutoGoodsList($params = [])
{
return GoodsService::AutoGoodsList(array_merge($params, [
'is_spec' => 1,
'is_cart' => 1,
'is_favor' => 1,
]));
}
/**
* 保存
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-12-18
* @desc description
* @param [array] $params [输入参数]
*/
public static function ThemeDataSave($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'theme',
'is_checked' => 2,
'error_msg' => MyLang('common_service.themedata.form_item_theme_message'),
],
[
'checked_type' => 'length',
'key_name' => 'name',
'checked_data' => '1,80',
'is_checked' => 2,
'error_msg' => MyLang('common_service.themedata.form_item_name_message'),
],
[
'checked_type' => 'in',
'key_name' => 'type',
'checked_data' => array_column(MyConst('common_theme_type_list'), 'value'),
'error_msg' => MyLang('common_service.themedata.save_type_error_tips'),
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 根据数据类型处理
$data_content = [];
switch($params['type'])
{
// 单图文
case 0 :
// 基础数据
$data_content = self::DataValueSaveHandle($params);
// 自定义数据
if(!empty($params['custom_data']))
{
if(!is_array($params['custom_data']))
{
$params['custom_data'] = json_decode(htmlspecialchars_decode($params['custom_data']), true);
}
if(!empty($params['custom_data']) && is_array($params['custom_data']))
{
$data_content['custom_data'] = [];
foreach($params['custom_data'] as $k=>$v)
{
if(isset($v['name']) && isset($v['value']) && strlen($v['name'].$v['value']) > 0)
{
$data_content['custom_data'][] = [
'icon' => empty($v['icon']) ? '' : ResourcesService::AttachmentPathHandle($v['icon']),
'name' => $v['name'],
'value' => $v['value'],
'url_data' => empty($v['url_data']) ? '' : (is_array($v['url_data']) ? $v['url_data'] : json_decode(base64_decode(urldecode(htmlspecialchars_decode($v['url_data']))), true)),
];
}
}
}
}
break;
// 多图文
case 1 :
// 基础数据
$data_content = self::DataValueSaveHandle($params);
// 多图文数据
if(!empty($params['data']))
{
if(!is_array($params['data']))
{
$params['data'] = json_decode(htmlspecialchars_decode($params['data']), true);
}
if(!empty($params['data']) && is_array($params['data']))
{
$data_content['data'] = [];
foreach($params['data'] as $k=>$v)
{
$data_content['data'][] = self::DataValueSaveHandle($v);
}
}
}
break;
// 视频
case 2 :
// 基础数据
$data_content = self::DataValueSaveHandle($params);
// 视频
$data_content['video'] = empty($params['video']) ? '' : ResourcesService::AttachmentPathHandle($params['video']);
// 自定义使用封面
$data_content['custom_cover'] = empty($params['custom_cover']) ? '' : ResourcesService::AttachmentPathHandle($params['custom_cover']);
break;
// 商品
case 3 :
// 请求参数
$p = [
[
'checked_type' => 'in',
'key_name' => 'goods_data_type',
'checked_data' => array_column(MyConst('common_theme_goods_type_list'), 'value'),
'is_checked' => 2,
'error_msg' => MyLang('common_service.themedata.save_goods_data_type_error_tips'),
],
[
'checked_type' => 'in',
'key_name' => 'goods_order_by_type',
'checked_data' => array_keys(MyConst('common_goods_order_by_type_list')),
'is_checked' => 2,
'error_msg' => MyLang('common_service.themedata.save_goods_order_by_type_error_tips'),
],
[
'checked_type' => 'in',
'key_name' => 'goods_order_by_rule',
'checked_data' => array_keys(MyConst('common_data_order_by_rule_list')),
'is_checked' => 2,
'error_msg' => MyLang('common_service.themedata.save_goods_order_by_rule_error_tips'),
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 基础数据
$data_content = self::DataValueSaveHandle($params);
// 数据处理
$goods_data = [];
if(isset($params['goods_data_type']) && $params['goods_data_type'] == 1 && !empty($params['goods_data']))
{
if(!is_array($params['goods_data']))
{
$params['goods_data'] = json_decode(htmlspecialchars_decode($params['goods_data']), true);
}
if(!empty($params['goods_data']) && is_array($params['goods_data']))
{
foreach($params['goods_data'] as $v)
{
if(!empty($v['data_id']))
{
$goods_data[] = [
'data_id' => $v['data_id'],
'custom_cover' => empty($v['custom_cover']) ? '' : ResourcesService::AttachmentPathHandle($v['custom_cover']),
];
}
}
}
}
// 加入数据
$data_content['goods_data'] = $goods_data;
$data_content['goods_data_type'] = isset($params['goods_data_type']) ? intval($params['goods_data_type']) : 0;
$data_content['goods_order_by_type'] = isset($params['goods_order_by_type']) ? intval($params['goods_order_by_type']) : 0;
$data_content['goods_order_by_rule'] = isset($params['goods_order_by_rule']) ? intval($params['goods_order_by_rule']) : 0;
$data_content['goods_number'] = empty($params['goods_number']) ? '' : intval($params['goods_number']);
$data_content['goods_brand_ids'] = empty($params['goods_brand_ids']) ? '' : (is_array($params['goods_brand_ids']) ? $params['goods_brand_ids'] : explode(',', $params['goods_brand_ids']));
$data_content['goods_category_ids'] = empty($params['goods_category_ids']) ? '' : (is_array($params['goods_category_ids']) ? $params['goods_category_ids'] : explode(',', $params['goods_category_ids']));
break;
// 文章
case 4 :
// 请求参数
$p = [
[
'checked_type' => 'in',
'key_name' => 'article_data_type',
'checked_data' => array_column(MyConst('common_theme_article_type_list'), 'value'),
'is_checked' => 2,
'error_msg' => MyLang('common_service.themedata.save_article_data_type_error_tips'),
],
[
'checked_type' => 'in',
'key_name' => 'article_order_by_type',
'checked_data' => array_keys(MyConst('common_article_order_by_type_list')),
'is_checked' => 2,
'error_msg' => MyLang('common_service.themedata.save_article_order_by_type_error_tips'),
],
[
'checked_type' => 'in',
'key_name' => 'article_order_by_rule',
'checked_data' => array_keys(MyConst('common_data_order_by_rule_list')),
'is_checked' => 2,
'error_msg' => MyLang('common_service.themedata.save_article_order_by_rule_error_tips'),
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 基础数据
$data_content = self::DataValueSaveHandle($params);
// 数据处理
$article_data = [];
if(isset($params['article_data_type']) && $params['article_data_type'] == 1 && !empty($params['article_data']))
{
if(!is_array($params['article_data']))
{
$params['article_data'] = json_decode(htmlspecialchars_decode($params['article_data']), true);
}
if(!empty($params['article_data']) && is_array($params['article_data']))
{
foreach($params['article_data'] as $v)
{
if(!empty($v['data_id']))
{
$article_data[] = [
'data_id' => $v['data_id'],
'custom_cover' => empty($v['custom_cover']) ? '' : ResourcesService::AttachmentPathHandle($v['custom_cover']),
];
}
}
}
}
// 加入数据
$data_content['article_data'] = $article_data;
$data_content['article_data_type'] = isset($params['article_data_type']) ? intval($params['article_data_type']) : 0;
$data_content['article_order_by_type'] = isset($params['article_order_by_type']) ? intval($params['article_order_by_type']) : 0;
$data_content['article_order_by_rule'] = isset($params['article_order_by_rule']) ? intval($params['article_order_by_rule']) : 0;
$data_content['article_number'] = empty($params['article_number']) ? '' : intval($params['article_number']);
$data_content['article_category_ids'] = empty($params['article_category_ids']) ? '' : (is_array($params['article_category_ids']) ? $params['article_category_ids'] : explode(',', $params['article_category_ids']));
break;
// 商品组合
case 5 :
// 基础数据
$data_content = self::DataValueSaveHandle($params);
// 商品数据
$data = [];
if(!empty($params['data']) && !is_array($params['data']))
{
$params['data'] = json_decode(htmlspecialchars_decode($params['data']), true);
}
if(!empty($params['data']) && is_array($params['data']))
{
foreach($params['data'] as $v)
{
// 数据处理
$goods_data = [];
if(isset($v['goods_data_type']) && $v['goods_data_type'] == 1 && !empty($v['goods_data']))
{
if(!is_array($v['goods_data']))
{
$v['goods_data'] = json_decode(htmlspecialchars_decode($v['goods_data']), true);
}
if(!empty($v['goods_data']) && is_array($v['goods_data']))
{
foreach($v['goods_data'] as $vs)
{
if(!empty($vs['data_id']))
{
$goods_data[] = [
'data_id' => $vs['data_id'],
'custom_cover' => empty($vs['custom_cover']) ? '' : ResourcesService::AttachmentPathHandle($vs['custom_cover']),
];
}
}
}
}
// 其他数据
$data[] = array_merge(self::DataValueSaveHandle($v), [
'goods_data_type' => isset($v['goods_data_type']) ? intval($v['goods_data_type']) : 0,
'goods_order_by_type' => isset($v['goods_order_by_type']) ? intval($v['goods_order_by_type']) : 0,
'goods_order_by_rule' => isset($v['goods_order_by_rule']) ? intval($v['goods_order_by_rule']) : 0,
'goods_number' => empty($v['goods_number']) ? '' : intval($v['goods_number']),
'goods_brand_ids' => empty($v['goods_brand_ids']) ? '' : (is_array($v['goods_brand_ids']) ? $v['goods_brand_ids'] : explode(',', $v['goods_brand_ids'])),
'goods_category_ids' => empty($v['goods_category_ids']) ? '' : (is_array($v['goods_category_ids']) ? $v['goods_category_ids'] : explode(',', $v['goods_category_ids'])),
'goods_data' => $goods_data,
]);
}
}
if(!empty($data))
{
$data_content['data'] = $data;
}
break;
// 文章组合
case 6 :
// 基础数据
$data_content = self::DataValueSaveHandle($params);
// 文章数据
$data = [];
if(!empty($params['data']) && !is_array($params['data']))
{
$params['data'] = json_decode(htmlspecialchars_decode($params['data']), true);
}
if(!empty($params['data']) && is_array($params['data']))
{
foreach($params['data'] as $v)
{
// 数据处理
$article_data = [];
if(isset($v['article_data_type']) && $v['article_data_type'] == 1 && !empty($v['article_data']))
{
if(!is_array($v['article_data']))
{
$v['article_data'] = json_decode(htmlspecialchars_decode($v['article_data']), true);
}
if(!empty($v['article_data']) && is_array($v['article_data']))
{
foreach($v['article_data'] as $vs)
{
if(!empty($vs['data_id']))
{
$article_data[] = [
'data_id' => $vs['data_id'],
'custom_cover' => empty($vs['custom_cover']) ? '' : ResourcesService::AttachmentPathHandle($vs['custom_cover']),
];
}
}
}
}
// 其他数据
$data[] = array_merge(self::DataValueSaveHandle($v), [
'article_data_type' => isset($v['article_data_type']) ? intval($v['article_data_type']) : 0,
'article_order_by_type' => isset($v['article_order_by_type']) ? intval($v['article_order_by_type']) : 0,
'article_order_by_rule' => isset($v['article_order_by_rule']) ? intval($v['article_order_by_rule']) : 0,
'article_number' => empty($v['article_number']) ? '' : intval($v['article_number']),
'article_category_ids' => empty($v['article_category_ids']) ? '' : (is_array($v['article_category_ids']) ? $v['article_category_ids'] : explode(',', $v['article_category_ids'])),
'article_data' => $article_data,
]);
}
}
if(!empty($data))
{
$data_content['data'] = $data;
}
break;
}
// 数据
$data = [
'unique' => empty($params['unique']) ? ((isset($params['is_init']) && $params['is_init'] == 1) ? '' : md5(RandomString(10).time().GetNumberCode(10))) : $params['unique'],
'theme' => empty($params['theme']) ? '' : $params['theme'],
'name' => empty($params['name']) ? '' : $params['name'],
'view' => isset($params['view']) ? $params['view'] : -1,
'data' => empty($data_content) ? '' : json_encode($data_content, JSON_UNESCAPED_UNICODE),
'is_enable' => isset($params['is_enable']) ? intval($params['is_enable']) : 1,
];
// 捕获异常
try {
if(empty($params['id']))
{
$data['type'] = intval($params['type']);
$data['add_time'] = time();
$data_id = Db::name('ThemeData')->insertGetId($data);
if($data_id <= 0)
{
throw new \Exception(MyLang('insert_fail'));
}
} else {
$data_id = intval($params['id']);
$data['upd_time'] = time();
if(Db::name('ThemeData')->where(['id'=>$data_id])->update($data) === false)
{
throw new \Exception(MyLang('edit_fail'));
}
}
return DataReturn(MyLang('operate_success'), 0, $data_id);
} catch(\Exception $e) {
return DataReturn($e->getMessage(), -1);
}
}
/**
* 附件标识
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2021-06-23
* @desc description
* @param [int] $data_id [数据 id]
*/
public static function AttachmentPathTypeValue($data_id)
{
return 'theme_data-'.$data_id;
}
/**
* 保存数据处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2024-03-31
* @desc description
* @param [array] $data [需要处理解析的数据]
*/
public static function DataValueSaveHandle($data)
{
$result = [];
if(!empty($data) && is_array($data))
{
foreach($data as $k=>$v)
{
// url数据
$url_data = empty($v['url_data']) ? '' : (is_array($v['url_data']) ? $v['url_data'] : json_decode(base64_decode(urldecode(htmlspecialchars_decode($v['url_data']))), true));
// 文本
if(substr($k, 0, 5) == 'text_')
{
$result[$k] = [
'value' => empty($v['value']) ? '' : trim($v['value']),
'url_data' => $url_data,
];
// 图片
} else if(substr($k, 0, 7) == 'images_')
{
$result[$k] = [
'value' => empty($v['value']) ? '' : ResourcesService::AttachmentPathHandle($v['value']),
'url_data' => $url_data,
];
}
}
}
return $result;
}
/**
* 状态更新
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-12-18
* @desc description
* @param [array] $params [输入参数]
*/
public static function ThemeDataStatusUpdate($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'id',
'error_msg' => MyLang('data_id_error_tips'),
],
[
'checked_type' => 'empty',
'key_name' => 'field',
'error_msg' => MyLang('operate_field_error_tips'),
],
[
'checked_type' => 'in',
'key_name' => 'state',
'checked_data' => [0,1],
'error_msg' => MyLang('form_status_range_message'),
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 数据更新
if(Db::name('ThemeData')->where(['id'=>intval($params['id'])])->update([$params['field']=>intval($params['state']), 'upd_time'=>time()]))
{
return DataReturn(MyLang('operate_success'), 0);
}
return DataReturn(MyLang('operate_fail'), -100);
}
/**
* 删除
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2018-12-18
* @desc description
* @param [array] $params [输入参数]
*/
public static function ThemeDataDelete($params = [])
{
// 参数是否有误
if(empty($params['ids']))
{
return DataReturn(MyLang('data_id_error_tips'), -1);
}
// 是否数组
if(!is_array($params['ids']))
{
$params['ids'] = explode(',', $params['ids']);
}
// 删除操作
if(Db::name('ThemeData')->where(['id'=>$params['ids']])->delete())
{
// 删除数据库附件
foreach($params['ids'] as $v)
{
AttachmentService::AttachmentPathTypeDelete(self::AttachmentPathTypeValue($v));
}
return DataReturn(MyLang('delete_success'), 0);
}
return DataReturn(MyLang('delete_fail'), -100);
}
/**
* 商品搜索
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-07-13
* @desc description
* @param [array] $params [输入参数]
*/
public static function GoodsSearchList($params = [])
{
// 返回数据
$result = [
'page_total' => 0,
'page_size' => 20,
'page' => max(1, isset($params['page']) ? intval($params['page']) : 1),
'total' => 0,
'data' => [],
];
// 条件
$where = [
['g.is_delete_time', '=', 0],
['g.is_shelves', '=', 1]
];
// 关键字
if(!empty($params['keywords']))
{
$where[] = ['g.title', 'like', '%'.$params['keywords'].'%'];
}
// 分类id
if(!empty($params['category_id']))
{
$category_ids = GoodsCategoryService::GoodsCategoryItemsIds([$params['category_id']], 1);
$category_ids[] = $params['category_id'];
$where[] = ['gci.category_id', 'in', $category_ids];
}
// 获取商品总数
$result['total'] = GoodsService::CategoryGoodsTotal($where);
// 获取商品列表
if($result['total'] > 0)
{
// 基础参数
$field = 'g.id,g.title,g.images';
$order_by = 'g.sort_level desc, g.id desc';
// 分页计算
$m = intval(($result['page']-1)*$result['page_size']);
$goods = GoodsService::CategoryGoodsList(['where'=>$where, 'm'=>$m, 'n'=>$result['page_size'], 'field'=>$field, 'order_by'=>$order_by]);
$result['data'] = $goods['data'];
$result['page_total'] = ceil($result['total']/$result['page_size']);
// 数据处理
if(!empty($result['data']) && is_array($result['data']) && !empty($params['data_ids']) && is_array($params['data_ids']))
{
foreach($result['data'] as &$v)
{
// 是否已添加
$v['is_exist'] = in_array($v['id'], $params['data_ids']) ? 1 : 0;
}
}
}
return DataReturn(MyLang('handle_success'), 0, $result);
}
/**
* 文章搜索
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2020-07-13
* @desc description
* @param [array] $params [输入参数]
*/
public static function ArticleSearchList($params = [])
{
// 返回数据
$result = [
'page_total' => 0,
'page_size' => 20,
'page' => max(1, isset($params['page']) ? intval($params['page']) : 1),
'total' => 0,
'data' => [],
];
// 条件
$where = [
['is_enable', '=', 1]
];
// 关键字
if(!empty($params['keywords']))
{
$where[] = ['title', 'like', '%'.$params['keywords'].'%'];
}
// 分类id
if(!empty($params['category_id']))
{
$where[] = ['article_category_id', '=', intval($params['category_id'])];
}
// 获取商品总数
$result['total'] = ArticleService::ArticleTotal($where);
// 获取商品列表
if($result['total'] > 0)
{
// 基础参数
$field = 'id,title,cover';
$order_by = 'id desc';
// 分页计算
$m = intval(($result['page']-1)*$result['page_size']);
$ret = ArticleService::ArticleList(['where'=>$where, 'm'=>$m, 'n'=>$result['page_size'], 'field'=>$field, 'order_by'=>$order_by]);
$result['data'] = $ret['data'];
$result['page_total'] = ceil($result['total']/$result['page_size']);
// 数据处理
if(!empty($result['data']) && is_array($result['data']) && !empty($params['data_ids']) && is_array($params['data_ids']))
{
foreach($result['data'] as &$v)
{
// 是否已添加
$v['is_exist'] = in_array($v['id'], $params['data_ids']) ? 1 : 0;
}
}
}
return DataReturn(MyLang('handle_success'), 0, $result);
}
/**
* 主题包下载处理主题处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2024-04-03
* @desc description
* @param [array] $params [输入参数]
*/
public static function ThemeDownloadPackageHandle($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'theme',
'error_msg' => MyLang('common_service.themedata.download_theme_empty_tips'),
],
[
'checked_type' => 'empty',
'key_name' => 'dir',
'error_msg' => MyLang('common_service.themedata.download_dir_empty_tips'),
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 主题数据同步到主题包下载处理
return self::ThemeDataDownloaPackagedHandle(['theme'=>$params['theme']], $params['dir']);
}
/**
* 下载
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-04-17
* @desc description
* @param [array] $params [输入参数]
*/
public static function ThemeDataDownload($params = [])
{
// 请求参数
$p = [
[
'checked_type' => 'empty',
'key_name' => 'ids',
'error_msg' => MyLang('data_id_error_tips'),
],
];
$ret = ParamsChecked($params, $p);
if($ret !== true)
{
return DataReturn($ret, -1);
}
// 是否数组
if(!is_array($params['ids']))
{
$params['ids'] = explode(',', $params['ids']);
}
// 目录不存在则创建
$key = date('YmdHis').GetNumberCode(6);
$dir = ROOT.'runtime'.DS.'data'.DS.'theme_data'.DS.$key;
\base\FileUtil::CreateDir($dir);
// 包下载处理
$ret = self::ThemeDataDownloaPackagedHandle(['id'=>$params['ids']], $dir);
if($ret['code'] != 0)
{
return $ret;
}
// 生成压缩包
$dir_zip = $dir.'.zip';
$zip = new \base\ZipFolder();
if(!$zip->zip($dir_zip, $dir))
{
return DataReturn(MyLang('form_generate_zip_message'), -2);
}
// 生成成功删除目录
\base\FileUtil::UnlinkDir($dir);
// 开始下载
if(\base\FileUtil::DownloadFile($dir_zip, $key.'.zip', true))
{
return DataReturn(MyLang('download_success'), 0);
}
return DataReturn(MyLang('download_fail'), -100);
}
/**
* 主题数据下载包处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2024-04-03
* @desc description
* @param [array] $where [数据条件]
* @param [string] $dir [存储目录]
*/
public static function ThemeDataDownloaPackagedHandle($where, $dir)
{
// 获取数据
$data = Db::name('ThemeData')->where($where)->select()->toArray();
if(empty($data))
{
// 删除目录
\base\FileUtil::UnlinkDir($dir);
return DataReturn(MyLang('data_no_exist_error_tips'), -1);
}
// 批量处理
foreach($data as $v)
{
// 每条数据实际存储目录
$dir_data = $dir.DS.$v['unique'];
\base\FileUtil::CreateDir($dir_data);
// 解析下载数据
$config = self::ConfigDownloadHandle($v['type'], $v['unique'], $v['data'], $dir_data);
// 基础信息
$base = [
'unique' => $v['unique'],
'name' => $v['name'],
'theme' => $v['theme'],
'view' => $v['view'],
'type' => $v['type'],
'data' => $config,
];
if(@file_put_contents($dir_data.DS.'config.json', JsonFormat($base)) === false)
{
// 删除目录
\base\FileUtil::UnlinkDir($dir);
return DataReturn(MyLang('common_service.themedata.download_config_file_create_fail_tips'), -1);
}
}
return DataReturn(MyLang('operate_success'), 0);
}
/**
* 配置数据下载处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-04-17
* @desc description
* @param [int] $type [数据类型]
* @param [string] $unique [唯一标识]
* @param [array] $config [配置数据]
* @param [string] $dir [存储目录]
*/
public static function ConfigDownloadHandle($type, $unique, $config, $dir)
{
if(!empty($config))
{
// 非数组则解析
if(!is_array($config))
{
$config = json_decode($config, true);
}
// 开始处理数据
foreach($config as $ks=>&$vs)
{
// 附件url地址处理
if(substr($ks, 0, 7) == 'images_' && !empty($vs['value']))
{
$vs['value'] = self::FileSave($unique, $vs['value'], 'images', $dir);
}
switch($type)
{
// 单图文
case 0 :
// 自定义数据
if($ks == 'custom_data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
// 附件url地址处理
if(!empty($vss['icon']))
{
$vs[$kss]['icon'] = self::FileSave($unique, $vss['icon'], 'images', $dir);
}
}
}
break;
// 多图文
case 1 :
if($ks == 'data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
if(!empty($vss) && is_array($vss))
{
foreach($vss as $ksss=>$vsss)
{
// 附件url地址处理
if(substr($ksss, 0, 7) == 'images_' && !empty($vsss['value']))
{
$vs[$kss][$ksss]['value'] = self::FileSave($unique, $vsss['value'], 'images', $dir);
}
}
}
}
}
break;
// 视频
case 2 :
if(!empty($vs))
{
// 附件url地址处理
if($ks == 'video')
{
$vs = self::FileSave($unique, $vs, 'video', $dir);
}
if($ks == 'custom_cover')
{
$vs = self::FileSave($unique, $vs, 'images', $dir);
}
}
break;
// 商品
case 3 :
if($ks == 'goods_data' && !empty($vs) && is_array($vs) && isset($config['goods_data_type']) && $config['goods_data_type'] == 1)
{
foreach($vs as $kss=>$vss)
{
// 处理商品自定义封面图片
if(!empty($vss['custom_cover']))
{
$vs[$kss]['custom_cover'] = self::FileSave($unique, $vss['custom_cover'], 'images', $dir);
}
}
}
break;
// 文章
case 4 :
if($ks == 'article_data' && !empty($vs) && is_array($vs) && isset($config['article_data_type']) && $config['article_data_type'] == 1)
{
foreach($vs as $kss=>$vss)
{
// 处理文章自定义封面图片
if(!empty($vss['custom_cover']))
{
$vs[$kss]['custom_cover'] = self::FileSave($unique, $vss['custom_cover'], 'images', $dir);
}
}
}
break;
// 商品组
case 5 :
if($ks == 'data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
// 每项的图片
if(!empty($vss) && is_array($vss))
{
foreach($vss as $ksss=>$vsss)
{
// 附件url地址处理
if(substr($ksss, 0, 7) == 'images_' && !empty($vsss['value']))
{
$vs[$kss][$ksss]['value'] = self::FileSave($unique, $vsss['value'], 'images', $dir);
}
}
}
// 商品
if(!empty($vss['goods_data']) && is_array($vss['goods_data']) && isset($vss['goods_data_type']) && $vss['goods_data_type'] == 1)
{
foreach($vss['goods_data'] as $ksss=>$vsss)
{
// 处理商品自定义封面图片
if(!empty($vsss['custom_cover']))
{
$vs[$kss]['goods_data'][$ksss]['custom_cover'] = self::FileSave($unique, $vsss['custom_cover'], 'images', $dir);
}
}
}
}
}
break;
// 文章组
case 6 :
if($ks == 'data' && !empty($vs) && is_array($vs))
{
foreach($vs as $kss=>$vss)
{
// 每项的图片
if(!empty($vss) && is_array($vss))
{
foreach($vss as $ksss=>$vsss)
{
// 附件url地址处理
if(substr($ksss, 0, 7) == 'images_' && !empty($vsss['value']))
{
$vs[$kss][$ksss]['value'] = self::FileSave($unique, $vsss['value'], 'images', $dir);
}
}
}
// 文章
if(!empty($vss['article_data']) && is_array($vss['article_data']) && isset($vss['article_data_type']) && $vss['article_data_type'] == 1)
{
foreach($vss['article_data'] as $ksss=>$vsss)
{
// 处理文章自定义封面图片
if(!empty($vsss['custom_cover']))
{
$vs[$kss]['article_data'][$ksss]['custom_cover'] = self::FileSave($unique, $vsss['custom_cover'], 'images', $dir);
}
}
}
}
}
break;
}
}
}
return $config;
}
/**
* 文件保存
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-04-18
* @desc description
* @param [string] $unique [唯一表示]
* @param [string] $file [文件地址]
* @param [string] $type [类型]
* @param [string] $dir [存储路径]
*/
public static function FileSave($unique, $file, $type, $dir)
{
if(!empty($file))
{
$arr = explode('/', $file);
$path = 'static'.DS.'upload'.DS.$type.DS.'theme_data'.DS.$unique.DS.date('Y/m/d');
$filename = $path.DS.$arr[count($arr)-1];
\base\FileUtil::CreateDir($dir.DS.$path);
$status = false;
if(substr($file, 0, 4) == 'http')
{
$temp = ResourcesService::AttachmentPathHandle($file);
if(substr($temp, 0, 4) == 'http' || !file_exists(ROOT.'public'.$temp))
{
// 远程下载
$temp_data = RequestGet($file);
if(!empty($temp_data))
{
file_put_contents($dir.DS.$filename, $temp_data);
$status = true;
}
} else {
$file = $temp;
}
}
if(!$status)
{
\base\FileUtil::CopyFile(ROOT.'public'.$file, $dir.DS.$filename);
}
return DS.$filename;
}
return '';
}
/**
* 导入
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-04-19
* @desc description
* @param [array] $params [输入参数]
*/
public static function ThemeDataUpload($params = [])
{
// 文件上传校验
$error = FileUploadError('file');
if($error !== true)
{
return DataReturn($error, -1);
}
// 文件格式化校验
$type = ResourcesService::ZipExtTypeList();
if(!in_array($_FILES['file']['type'], $type))
{
return DataReturn(MyLang('form_upload_zip_message'), -2);
}
// 上传处理
return self::ThemeDataUploadHandle($_FILES['file']['tmp_name'], $params);
}
/**
* 导入处理
* @author Devil
* @blog http://gong.gg/
* @version 1.0.0
* @date 2022-04-19
* @desc description
* @param [string] $package_file [软件包地址]
* @param [array] $params [输入参数]
*/
public static function ThemeDataUploadHandle($package_file, $params = [])
{
// 是否主题导入
$is_theme_upload = isset($params['is_theme_upload']) && $params['is_theme_upload'] == 1;
$theme_dir_ds_unique = '_theme_data_';
// 应用upload目录权限校验
$app_upload_dir = ROOT.'public'.DS.'static'.DS.'upload';
if(!is_writable($app_upload_dir))
{
return DataReturn(MyLang('common_service.themedata.upload_dir_no_power_tips').'['.$app_upload_dir.']', -3);
}
// 开始解压文件
$zip = new \ZipArchive();
$resource = $zip->open($package_file);
if($resource !== true)
{
return DataReturn(MyLang('form_open_zip_message').'['.$resource.']', -11);
}
// 配置信息
$handle_data = [];
for($i=0; $i<$zip->numFiles; $i++)
{
$file = $zip->getNameIndex($i);
// 当前是配置文件
if(stripos($file, 'config.json') !== false)
{
// 是否主题上传,则需要验证主题包目录分隔符
if($is_theme_upload && stripos($file, $theme_dir_ds_unique) === false)
{
continue;
}
// 读取配置信息
$stream = $zip->getStream($file);
if($stream === false)
{
$zip->close();
return DataReturn(MyLang('common_service.themedata.upload_config_file_get_fail_tips'), -1);
}
// 排除后缀文件
$pos = strripos($file, '.');
if($pos !== false)
{
$info = pathinfo($file);
if(isset($info['extension']) && in_array(strtolower($info['extension']), self::$exclude_ext))
{
continue;
}
}
// 获取配置信息并解析
$file_content = stream_get_contents($stream);
$config = empty($file_content) ? [] : json_decode($file_content, true);
if(empty($config) || empty($config['unique']) || empty($config['name']) || empty($config['theme']))
{
$zip->close();
return DataReturn(MyLang('common_service.themedata.upload_config_file_error_tips'), -1);
}
// 数据
$data = [
'unique' => $config['unique'],
'name' => $config['name'],
'theme' => $config['theme'],
'view' => isset($config['view']) ? $config['view'] : -1,
'type' => isset($config['type']) ? $config['type'] : 0,
'data' => '',
];
// 是否存在数据
$data_id = Db::name('ThemeData')->where(['unique'=>$data['unique']])->value('id');
if(empty($data_id))
{
// 添加数据
$data['add_time'] = time();
$data_id = Db::name('ThemeData')->insertGetId($data);
if($data_id <= 0)
{
$zip->close();
return DataReturn(MyLang('insert_fail'), -1);
}
} else {
// 更新数据
$data['upd_time'] = time();
if(!Db::name('ThemeData')->where(['id'=>$data_id])->update($data))
{
$zip->close();
return DataReturn(MyLang('update_fail'), -1);
}
// 删除原有的附件
AttachmentService::AttachmentPathTypeDelete(self::AttachmentPathTypeValue($data_id));
}
// 更新配置信息
$upd_data = [
'data' => empty($config['data']) ? '' : str_replace($config['unique'], $data_id, json_encode($config['data'], JSON_UNESCAPED_UNICODE)),
'upd_time' => time(),
];
if(!Db::name('ThemeData')->where(['id'=>$data_id])->update($upd_data))
{
$zip->close();
return DataReturn(MyLang('update_fail'), -1);
}
// 加入已处理容器
$handle_data[$data['unique']] = [
'data_id' => $data_id,
'config' => $config,
];
}
}
if(empty($handle_data))
{
return DataReturn(MyLang('common_service.themedata.upload_config_file_handle_fail_tips'), -1);
}
// 文件处理
$success = 0;
for($i=0; $i<$zip->numFiles; $i++)
{
// 资源文件
$file = $zip->getNameIndex($i);
// 排除临时文件和临时目录
if(strpos($file, '/.') === false && strpos($file, '__') === false)
{
// 是否主题上传处理
if($is_theme_upload)
{
// 如果没有主题的目录分割标识则忽略
if(stripos($file, $theme_dir_ds_unique) === false)
{
continue;
}
// 去除以_theme_data_分割的和前面部分
$temp_file = substr($file, strpos($file, $theme_dir_ds_unique)+strlen($theme_dir_ds_unique)+1);
} else {
// 去除第一个目录为原始数据的id
$temp_file = substr($file, strpos($file, '/')+1);
}
// 获取第一个目录得到当前数据唯一标识
$unique = substr($temp_file, 0, strpos($temp_file, '/'));
// 再去除当前数据唯一标识目录段
$temp_file = substr($temp_file, strpos($temp_file, '/')+1);
// 空或者目录及配置文件则跳过
if(empty($temp_file) || in_array($temp_file, ['static/', 'static/upload/', 'config.json']) || empty($handle_data[$unique]))
{
continue;
}
// 截取文件路径
$new_file = ROOT.'public'.DS.str_replace($unique, $handle_data[$unique]['data_id'], $temp_file);
$file_path = substr($new_file, 0, strrpos($new_file, '/'));
// 路径不存在则创建
\base\FileUtil::CreateDir($file_path);
// 如果不是目录则写入文件
if(!is_dir($new_file))
{
// 读取这个文件
$stream = $zip->getStream($file);
if($stream !== false)
{
$file_content = stream_get_contents($stream);
if($file_content !== false)
{
if(file_put_contents($new_file, $file_content))
{
$success++;
}
}
fclose($stream);
}
}
}
}
// 关闭zip
$zip->close();
// 附件同步到数据库
foreach($handle_data as $v)
{
AttachmentService::AttachmentDiskFilesToDb('theme_data'.DS.$v['data_id'], self::AttachmentPathTypeValue($v['data_id']));
}
return DataReturn(MyLang('import_success'), 0);
}
}
?>