1880 lines
79 KiB
PHP
1880 lines
79 KiB
PHP
<?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);
|
||
}
|
||
}
|
||
?>
|