Ggongfuxiangv6.8.0
bdf1fe5c创建于 3月4日历史提交
<?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\module;

use think\facade\Db;
use app\service\ResourcesService;
use app\service\GoodsService;
use app\service\GoodsCategoryService;

/**
 * 布局自动化服务层
 * @author  Devil
 * @blog    http://gong.gg/
 * @version 1.0.0
 * @date    2020-05-25
 * @desc    description
 */
class LayoutModule
{
    /**
     * 静态配置数据
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2023-03-23
     * @desc    description
     * @param   [string]          $key [配置key]
     */
    public static function ConstData($key)
    {
        $lang_border = MyLang('layout.border_style_type_list');
        $lang_goods_view = MyLang('layout.goods_view_list_show_style');
        $lang_many_images_view = MyLang('layout.many_images_view_list_show_style');
        $lang_images_text_view = MyLang('layout.images_text_view_list_show_style');
        $lang_images_magic_cube_view = MyLang('layout.images_magic_cube_view_list_show_style');
        $data = [
            // 边线样式类型
            'border_style_type_list' => [
                'solid'     => $lang_border['solid'],
                'dashed'    => $lang_border['dashed'],
                'dotted'    => $lang_border['dotted'],
                'double'    => $lang_border['double'],
            ],
            // 商品样式类型
            'goods_view_list_show_style' => [
                'routine'   => $lang_goods_view['routine'],
                'leftright' => $lang_goods_view['leftright'],
                'rolling'   => $lang_goods_view['rolling'],
            ],
            // 多图样式类型
            'many_images_view_list_show_style' => [
                'routine'   => $lang_many_images_view['routine'],
                'rolling'   => $lang_many_images_view['rolling'],
                'list'      => $lang_many_images_view['list'],
            ],
            // 图文样式类型
            'images_text_view_list_show_style' => [
                'updown'    => $lang_images_text_view['updown'],
                'leftright' => $lang_images_text_view['leftright'],
                'rolling'   => $lang_images_text_view['rolling'],
            ],
            // 图片魔方样式类型
            'images_magic_cube_view_list_show_style' => [
                'g1'    => $lang_images_magic_cube_view['g1'],
                'v2'    => $lang_images_magic_cube_view['v2'],
                'v3'    => $lang_images_magic_cube_view['v3'],
                'v4'    => $lang_images_magic_cube_view['v4'],
                'h2'    => $lang_images_magic_cube_view['h2'],
                'h3'    => $lang_images_magic_cube_view['h4'],
                'h4'    => $lang_images_magic_cube_view['lr12'],
                'lr12'  => $lang_images_magic_cube_view['lr13'],
                'lr13'  => $lang_images_magic_cube_view['lr13'],
                'lr21'  => $lang_images_magic_cube_view['lr21'],
                'lr31'  => $lang_images_magic_cube_view['lr31'],
                'tb12'  => $lang_images_magic_cube_view['tb12'],
                'tb13'  => $lang_images_magic_cube_view['tb13'],
                'tb21'  => $lang_images_magic_cube_view['tb21'],
                'tb31'  => $lang_images_magic_cube_view['tb31'],
                'lrv2h2'=> $lang_images_magic_cube_view['lrv2h2'],
                'lrh2v2'=> $lang_images_magic_cube_view['lrh2v2'],
                'g4'    => $lang_images_magic_cube_view['g4'],
            ],
        ];
        return isset($data[$key]) ? $data[$key] : [];
    }

    /**
     * 配置处理-保存
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2021-06-17
     * @desc    description
     * @param   [array]          $config [配置信息]
     * @param   [array]          $params [输入参数]
     */
    public static function ConfigSaveHandle($config, $params = [])
    {
        $config = empty($config) ? [] : (is_array($config) ? $config : json_decode(htmlspecialchars_decode($config), true));
        if(!empty($config) && is_array($config))
        {
            foreach($config as &$v)
            {
                // 配置信息处理
                if(!empty($v['config']))
                {
                    $v['config'] = self::ConfigSaveFieldHandle($v['config']);
                }

                // 布局
                if(!empty($v['children']) && is_array($v['children']))
                {
                    foreach($v['children'] as &$vs)
                    {
                        // 配置信息处理
                        if(!empty($vs['config']))
                        {
                            $vs['config'] = self::ConfigSaveFieldHandle($vs['config']);
                        }

                        // 容器
                        if(!empty($vs['children']) && is_array($vs['children']))
                        {
                            // 模块
                            foreach($vs['children'] as &$vss)
                            {
                                if(!empty($vss['value']) && !empty($vss['config']))
                                {
                                    // 配置信息处理
                                    $vss['config'] = self::ConfigSaveFieldHandle($vss['config']);

                                    // 根据模块类型处理
                                    switch($vss['value'])
                                    {
                                        // 视频 video
                                        case 'video' :
                                            $vss['config']['content_video'] = ResourcesService::AttachmentPathHandle($vss['config']['content_video']);
                                            break;

                                        // 单图 images
                                        case 'images' :
                                            $vss['config']['content_images'] = ResourcesService::AttachmentPathHandle($vss['config']['content_images']);
                                            break;

                                        // 多图 many-images
                                        case 'many-images' :
                                            foreach($vss['config']['data_list'] as &$mil)
                                            {
                                                $mil['images'] = ResourcesService::AttachmentPathHandle($mil['images']);
                                            }
                                            $key = 'content_images_';
                                            foreach($vss['config'] as $mik=>$miv)
                                            {
                                                if(substr($mik, 0, strlen($key)) == $key)
                                                {
                                                    $vss['config'][$mik] = ResourcesService::AttachmentPathHandle($miv);
                                                }
                                            }
                                            break;

                                        // 图文 images-text
                                        case 'images-text' :
                                            foreach($vss['config']['data_list'] as &$itl)
                                            {
                                                $itl['images'] = ResourcesService::AttachmentPathHandle($itl['images']);
                                            }
                                            $key = 'content_images_';
                                            foreach($vss['config'] as $mik=>$miv)
                                            {
                                                if(substr($mik, 0, strlen($key)) == $key)
                                                {
                                                    $vss['config'][$mik] = ResourcesService::AttachmentPathHandle($miv);
                                                }
                                            }
                                            break;

                                        // 图片魔方 images-magic-cube
                                        case 'images-magic-cube' :
                                            foreach($vss['config']['data_list'] as &$imc)
                                            {
                                                $imc['images'] = ResourcesService::AttachmentPathHandle($imc['images']);
                                            }
                                            $key = 'content_images_';
                                            foreach($vss['config'] as $mik=>$miv)
                                            {
                                                if(substr($mik, 0, strlen($key)) == $key)
                                                {
                                                    $vss['config'][$mik] = ResourcesService::AttachmentPathHandle($miv);
                                                }
                                            }
                                            break;

                                        // 商品 goods
                                        case 'goods' :
                                            unset($vss['config']['data_list']);
                                            break;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return empty($config) ? '' : json_encode($config, JSON_UNESCAPED_UNICODE);
    }

    /**
     * 配置处理-管理
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2021-06-17
     * @desc    description
     * @param   [array]          $config [配置信息]
     * @param   [array]          $params [输入参数]
     */
    public static function ConfigAdminHandle($config, $params = [])
    {
        if(!empty($config))
        {
            // 是否数组
            if(!is_array($config))
            {
                $config = json_decode($config, true);
            }
            if(!empty($config))
            {
                foreach($config as &$v)
                {
                    // 配置信息处理
                    if(!empty($v['config']))
                    {
                        $v['config'] = self::ConfigViewFieldHandle($v['config']);
                    }

                    // 布局类型
                    $v['value_arr'] = empty($v['value']) ? [] : explode(':', $v['value']);

                    // 布局
                    if(!empty($v['children']) && is_array($v['children']))
                    {
                        foreach($v['children'] as &$vs)
                        {
                            // 配置信息处理
                            if(!empty($vs['config']))
                            {
                                $vs['config'] = self::ConfigViewFieldHandle($vs['config']);
                            }

                            // 容器
                            if(!empty($vs['children']) && is_array($vs['children']))
                            {
                                // 模块
                                foreach($vs['children'] as &$vss)
                                {
                                    if(!empty($vss['value']) && !empty($vss['config']))
                                    {
                                        // 配置信息处理
                                        $vss['config'] = self::ConfigViewFieldHandle($vss['config']);

                                        // 根据模块类型处理
                                        switch($vss['value'])
                                        {
                                            // 视频 video
                                            case 'video' :
                                                $vss['config']['content_video'] = ResourcesService::AttachmentPathViewHandle($vss['config']['content_video']);
                                                break;

                                            // 单图 images
                                            case 'images' :
                                                $vss['config']['content_images'] = ResourcesService::AttachmentPathViewHandle($vss['config']['content_images']);
                                                break;

                                            // 多图 many-images
                                            case 'many-images' :
                                                foreach($vss['config']['data_list'] as &$mil)
                                                {
                                                    $mil['images'] = ResourcesService::AttachmentPathViewHandle($mil['images']);
                                                }
                                                $key = 'content_images_';
                                                foreach($vss['config'] as $mik=>$miv)
                                                {
                                                    if(substr($mik, 0, strlen($key)) == $key)
                                                    {
                                                        $vss['config'][$mik] = ResourcesService::AttachmentPathViewHandle($miv);
                                                    }
                                                }
                                                break;

                                            // 图文 images-text
                                            case 'images-text' :
                                                foreach($vss['config']['data_list'] as &$itl)
                                                {
                                                    $itl['images'] = ResourcesService::AttachmentPathViewHandle($itl['images']);
                                                }
                                                $key = 'content_images_';
                                                foreach($vss['config'] as $mik=>$miv)
                                                {
                                                    if(substr($mik, 0, strlen($key)) == $key)
                                                    {
                                                        $vss['config'][$mik] = ResourcesService::AttachmentPathViewHandle($miv);
                                                    }
                                                }
                                                break;

                                            // 图片魔方 images-magic-cube
                                            case 'images-magic-cube' :
                                                foreach($vss['config']['data_list'] as &$imc)
                                                {
                                                    $imc['images'] = ResourcesService::AttachmentPathViewHandle($imc['images']);
                                                }
                                                $key = 'content_images_';
                                                foreach($vss['config'] as $mik=>$miv)
                                                {
                                                    if(substr($mik, 0, strlen($key)) == $key)
                                                    {
                                                        $vss['config'][$mik] = ResourcesService::AttachmentPathViewHandle($miv);
                                                    }
                                                }
                                                break;

                                            // 商品
                                            case 'goods' :
                                                $p = [
                                                    'data_type' => $vss['config']['goods_data_type'],
                                                ];
                                                switch($vss['config']['goods_data_type'])
                                                {
                                                    // 指定商品
                                                    case 'goods' :
                                                        $p['goods_ids'] = $vss['config']['goods_ids'];
                                                        break;

                                                    // 商品分类
                                                    case 'category' :
                                                        $category = json_decode(urldecode($vss['config']['goods_category_value']), true);
                                                        $p['category_id'] = $category[count($category)-1]['id'];
                                                        $p['order_limit_number'] = empty($vss['config']['goods_order_limit_number']) ? 0 : $vss['config']['goods_order_limit_number'];
                                                        $p['order_by_type'] = isset($vss['config']['goods_order_by_type']) ? $vss['config']['goods_order_by_type'] : 0;
                                                        $p['order_by_rule'] = isset($vss['config']['goods_order_by_rule']) ? $vss['config']['goods_order_by_rule'] : 0;
                                                        break;
                                                }
                                                $res = self::GoodsDataList($p);
                                                $vss['config']['data_list'] = $res['data'];
                                                break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return $config;
    }

    /**
     * 配置处理-展示使用
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2021-06-17
     * @desc    description
     * @param   [array]          $config [配置信息]
     * @param   [array]          $params [输入参数]
     */
    public static function ConfigHandle($config, $params = [])
    {
        if(!empty($config))
        {
            // 是否数组
            if(!is_array($config))
            {
                $config = json_decode($config, true);
            }
            if(!empty($config))
            {
                foreach($config as &$v)
                {
                    // 配置信息处理
                    if(!empty($v['config']))
                    {
                        $v['config'] = self::ConfigViewFieldHandle($v['config'], true);
                    }

                    // 布局类型
                    $v['value_arr'] = empty($v['value']) ? [] : explode(':', $v['value']);

                    // 布局
                    if(!empty($v['children']) && is_array($v['children']))
                    {
                        foreach($v['children'] as &$vs)
                        {
                            // 配置信息处理
                            if(!empty($vs['config']))
                            {
                                $vs['config'] = self::ConfigViewFieldHandle($vs['config'], true);
                            }

                            // 容器
                            if(!empty($vs['children']) && is_array($vs['children']))
                            {
                                // 模块
                                foreach($vs['children'] as &$vss)
                                {
                                    if(!empty($vss['value']) && !empty($vss['config']))
                                    {
                                        // 配置信息处理
                                        $vss['config'] = self::ConfigViewFieldHandle($vss['config'], true);

                                        // 根据模块类型处理
                                        switch($vss['value'])
                                        {
                                            // 视频 video
                                            case 'video' :
                                                $vss['config']['video'] = ResourcesService::AttachmentPathViewHandle($vss['config']['content_video']);
                                                unset($vss['config']['content_video']);
                                                break;

                                            // 单图 images
                                            case 'images' :
                                                // 配置重新组合
                                                $vss['config'] = [
                                                    'frontend_config'   => $vss['config']['frontend_config'],
                                                    'images'            => ResourcesService::AttachmentPathViewHandle($vss['config']['content_images']),
                                                    'url'               => self::LayoutUrlValueHandle($vss['config']['content_to_type'], $vss['config']['content_to_value']),
                                                ];
                                                break;

                                            // 多图 many-images
                                            case 'many-images' :
                                                foreach($vss['config']['data_list'] as &$mil)
                                                {
                                                    $mil = [
                                                        'images'    => ResourcesService::AttachmentPathViewHandle($mil['images']),
                                                        'url'       => self::LayoutUrlValueHandle($mil['type'], $mil['value']),
                                                    ];
                                                }
                                                break;

                                            // 图文 images-text
                                            case 'images-text' :
                                                foreach($vss['config']['data_list'] as &$itl)
                                                {
                                                    $itl['images'] = ResourcesService::AttachmentPathViewHandle($itl['images']);
                                                    $itl['url'] = self::LayoutUrlValueHandle($itl['type'], $itl['value']);
                                                }
                                                break;

                                            // 图片魔方 images-magic-cube
                                            case 'images-magic-cube' :
                                                foreach($vss['config']['data_list'] as &$imc)
                                                {
                                                    $imc['images'] = ResourcesService::AttachmentPathViewHandle($imc['images']);
                                                    $imc['url'] = self::LayoutUrlValueHandle($imc['type'], $imc['value']);
                                                }
                                                break;

                                            // 商品
                                            case 'goods' :
                                                $p = [
                                                    'data_type'     => $vss['config']['goods_data_type'],
                                                ];
                                                switch($vss['config']['goods_data_type'])
                                                {
                                                    // 指定商品
                                                    case 'goods' :
                                                        $p['goods_ids'] = $vss['config']['goods_ids'];
                                                        break;

                                                    // 商品分类
                                                    case 'category' :
                                                        $category = json_decode(urldecode($vss['config']['goods_category_value']), true);
                                                        $p['category_id'] = $category[count($category)-1]['id'];
                                                        $p['order_limit_number'] = empty($vss['config']['goods_order_limit_number']) ? 0 : $vss['config']['goods_order_limit_number'];
                                                        $p['order_by_type'] = isset($vss['config']['goods_order_by_type']) ? $vss['config']['goods_order_by_type'] : 0;
                                                        $p['order_by_rule'] = isset($vss['config']['goods_order_by_rule']) ? $vss['config']['goods_order_by_rule'] : 0;
                                                        break;
                                                }
                                                $res = self::GoodsDataList($p);
                                                if(!empty($res['data']) && is_array($res['data']))
                                                {
                                                    foreach($res['data'] as &$g)
                                                    {
                                                        $g['goods_url'] = self::LayoutUrlValueHandle('goods', $g);
                                                    }
                                                }
                                                $vss['config']['data_list'] = $res['data'];
                                                break;

                                            // 标题
                                            case 'title' :
                                                // 关键字
                                                $keywords_list = [];
                                                if(!empty($vss['config']['keywords_list']))
                                                {
                                                    foreach($vss['config']['keywords_list'] as $wd)
                                                    {
                                                        $keywords_list[] = [
                                                            'keywords'  => $wd['content_keywords'],
                                                            'color'     => empty($wd['style_keywords_color']) ? '' : $wd['style_keywords_color'],
                                                            'url'       => self::LayoutUrlValueHandle($wd['content_to_type'], $wd['content_to_value']),
                                                        ];
                                                    }
                                                }

                                                // 配置重新组合
                                                $vss['config'] = [
                                                    'frontend_config'   => $vss['config']['frontend_config'],
                                                    'title'             => $vss['config']['content_title'],
                                                    'title_vice'        => $vss['config']['content_title_vice'],
                                                    'title_more'        => $vss['config']['content_title_more'],
                                                    'title_more_url'    => self::LayoutUrlValueHandle($vss['config']['content_to_type'], $vss['config']['content_to_value']),
                                                    'keywords_list'     => $keywords_list,
                                                ];
                                                break;

                                            // 自定义html
                                            case 'custom' :
                                                $vss['config']['custom'] = empty($vss['config']['custom']) ? '' : htmlspecialchars_decode($vss['config']['custom']);
                                                break;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
        return $config;
    }

    /**
     * 配置信息字段保存处理
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2021-06-22
     * @desc    description
     * @param   [array]          $config [配置信息]
     */
    public static function ConfigSaveFieldHandle($config)
    {
        if(!empty($config) && is_array($config))
        {
            // 背景图片地址
            $fields = ['style_background_images'];
            foreach($fields as $v)
            {
                if(!empty($config[$v]))
                {
                    $config[$v] = ResourcesService::AttachmentPathHandle($config[$v]);
                }
            }
        }
        return $config;
    }

    /**
     * 配置信息字段展示处理
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2021-06-22
     * @desc    description
     * @param   [array]          $config                [配置信息]
     * @param   [boolean]        $is_del_surplus_field  [移除多余字段]
     */
    public static function ConfigViewFieldHandle($config, $is_del_surplus_field = false)
    {
        if(!empty($config) && is_array($config))
        {
            // 滚动配置
            if(array_key_exists('view_list_show_style_value', $config))
            {
                $config['view_list_show_style_value_arr'] = empty($config['view_list_show_style_value']) ? '' : json_decode(urldecode($config['view_list_show_style_value']), true);
            }

            // 附件
            $attachment_fields = ['style_background_images'];
            foreach($attachment_fields as $av)
            {
                if(!empty($config[$av]))
                {
                    $config[$av] = ResourcesService::AttachmentPathViewHandle($config[$av]);
                }
            }

            // 配置信息多余字段移除
            if($is_del_surplus_field)
            {
                $fields = [
                    'style_',
                    'content_item_keywords_',
                    'content_images_',
                    'content_to_type_',
                    'content_to_name_',
                    'content_to_value_',
                    'view_list_number_',
                ];
                foreach($config as $k=>$v)
                {
                    if(!in_array($k, $attachment_fields))
                    {
                        foreach($fields as $f)
                        {
                            $length = strlen($f);
                            if(substr($k, 0, $length) == $f)
                            {
                                unset($config[$k]);
                            }
                        }
                    }
                }
            }
        }
        return $config;
    }

    /**
     * 链接地址处理
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2021-06-22
     * @desc    description
     * @param   [string]          $type  [类型]
     * @param   [string]          $value [特殊地址配置值]
     */
    public static function LayoutUrlValueHandle($type, $value)
    {
        // 扩展参数处理
        if(!empty($value) && !is_array($value))
        {
            $value = json_decode(urldecode($value), true);
        }

        // 当前客户端类型
        $client_type = APPLICATION_CLIENT_TYPE;

        // url地址、默认空字符串
        $url = '';

        // 静态地址定义-web端
        $static_url_web_arr = [
            'home'                                      => __MY_URL__,
            'goods_category'                            => MyUrl('index/category/index'),
            'cart'                                      => MyUrl('index/cart/index'),
            'user_center'                               => MyUrl('index/user/index'),
            'user_order_list'                           => MyUrl('index/order/index'),
            'user_order_aftersale_list'                 => MyUrl('index/orderaftersale/index'),
            'user_goods_favor_list'                     => MyUrl('index/usergoodsfavor/index'),
            'user_address_list'                         => MyUrl('index/useraddress/index'),
            'user_goods_browse_list'                    => MyUrl('index/usergoodsbrowse/index'),
            'user_integral_list'                        => MyUrl('index/userintegral/index'),
            'user_message_list'                         => MyUrl('index/message/index'),
        ];

        // 静态地址定义-手机端
        $static_url_app_arr = [
            'home'                                      => '/pages/index/index',
            'goods_category'                            => '/pages/goods-category/goods-category',
            'cart'                                      => '/pages/cart/cart',
            'user_center'                               => '/pages/user/user',
            'user_order_list'                           => '/pages/user-order/user-order',
            'user_order_aftersale_list'                 => '/pages/user-orderaftersale/user-orderaftersale',
            'user_goods_favor_list'                     => '/pages/user-favor/user-favor',
            'user_address_list'                         => '/pages/user-address/user-address',
            'user_goods_browse_list'                    => '/pages/user-goods-browse/user-goods-browse',
            'user_integral_list'                        => '/pages/user-integral/user-integral',
            'user_message_list'                         => '/pages/message/message',
        ];

        // url值处理前钩子
        $hook_name = 'plugins_layout_service_url_value_begin';
        MyEventTrigger($hook_name, [
            'hook_name'           => $hook_name,
            'is_backend'          => true,
            'type'                => $type,
            'value'               => $value,
            'client_type'         => $client_type,
            'static_url_web_arr'  => &$static_url_web_arr,
            'static_url_app_arr'  => &$static_url_app_arr,
        ]);

        // 静态地址
        $url = '';
        $static_url_arr = ($client_type == 'pc') ? $static_url_web_arr : $static_url_app_arr;
        if(array_key_exists($type, $static_url_arr))
        {
            $url = $static_url_arr[$type];
        } else {
            switch($type)
            {
                // 商品
                case 'goods' :
                    if(!empty($value) && !empty($value['id']))
                    {
                        // 商品处理
                        $res = GoodsService::GoodsDataHandle([['goods_id'=>$value['id']]], ['data_key_field'=>'goods_id']);
                        if(!empty($res['data']) && !empty($res['data'][0]) && !empty($res['data'][0]['goods_url']))
                        {
                            $url = $res['data'][0]['goods_url'];
                        }
                    }
                    break;

                // 商品分类
                case 'goods_search' :
                    $gsp = [];
                    if(!empty($value) && !empty($value['type']) && !empty($value['value']))
                    {
                        switch($value['type'])
                        {
                            // 关键字
                            case 'keywords' :
                                $gsp = ($client_type == 'pc') ? ['wd'=>StrToAscii($value['value'])] : '?keywords='.$value['value'];
                                break;

                            // 分类
                            case 'category' :
                                $cid = $value['value'][count($value['value'])-1]['id'];
                                $gsp = ($client_type == 'pc') ? ['cid'=>$cid] : '?category_id='.$cid;
                                break;

                            // 品牌
                            case 'brand' :
                                $gsp = ($client_type == 'pc') ? ['brand'=>$value['value']['id']] : '?brand='.$value['value']['id'];
                                break;
                        }
                    }
                    // 默认搜索页面、无条件
                    $url = ($client_type == 'pc') ? MyUrl('index/search/index', $gsp) : '/pages/goods-search/goods-search'.(empty($gsp) ? '' : $gsp);
                    break;

                // 自定义链接
                case 'pages-custom-url' :
                    $key = 'pages_custom_url_'.$client_type;
                    if(!empty($value) && is_array($value) && array_key_exists($key, $value) && !empty($value[$key]))
                    {
                        $url = htmlspecialchars_decode($value[$key]);
                    }
                    break;
            }
        }

        // url值处理钩子
        $hook_name = 'plugins_layout_service_url_value_handle';
        MyEventTrigger($hook_name, [
            'hook_name'     => $hook_name,
            'is_backend'    => true,
            'type'          => $type,
            'value'         => $value,
            'client_type'   => $client_type,
            'url'           => &$url,
        ]);

        // 返回url
        return $url;
    }

    /**
     * 商品搜索
     * @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_field = empty($params['category_field']) ? 'gci.category_id' : $params['category_field'];
            if($category_field == 'gci.category_id')
            {
                $category_id = GoodsCategoryService::GoodsCategoryItemsIds([intval($params['category_id'])]);
            } else {
                $category_id = [intval($params['category_id'])];
            }
            $where[] = [$category_field, 'in', $category_id];
        }

        // 商品搜索列表读取钩子
        $hook_name = 'plugins_layout_service_search_goods_begin';
        MyEventTrigger($hook_name, [
            'hook_name'     => $hook_name,
            'is_backend'    => true,
            'params'        => $params,
            'where'         => &$where,
        ]);

        // 获取商品总数
        $result['total'] = GoodsService::CategoryGoodsTotal($where);

        // 获取商品列表
        if($result['total'] > 0)
        {
            // 基础参数
            $field = 'g.id,g.title,g.images';
            $order_by = 'g.id desc';

            // 分页计算
            $m = intval(($result['page']-1)*$result['page_size']);
            $ret = GoodsService::CategoryGoodsList(['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['goods_ids']))
            {
                $goods_ids = is_array($params['goods_ids']) ? $params['goods_ids'] : explode(',', $params['goods_ids']);
                foreach($result['data'] as &$v)
                {
                    // 是否已添加
                    $v['is_exist'] = in_array($v['id'], $goods_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 GoodsDataList($params = [])
    {
        // 数据类型、默认商品
        $data_type = empty($params['data_type']) ? 'goods' : $params['data_type'];
        switch($data_type)
        {
            // 商品
            case 'goods' :
                // 参数处理
                if(empty($params['goods_ids']))
                {
                    return DataReturn(MyLang('layout.base_goods_id_empty_tips'), -1);
                }
                if(!is_array($params['goods_ids']))
                {
                    $params['goods_ids'] = explode(',', $params['goods_ids']);
                }

                // 读取数量
                $m = 0;
                $n = 50;

                // 获取商品
                $order_by = 'id desc';
                $field = 'id,title,images,price,original_price,min_price,max_price,min_original_price,max_original_price,inventory,inventory_unit';
                $where = [
                    ['is_delete_time', '=', 0],
                    ['is_shelves', '=', 1],
                    ['id', 'in', $params['goods_ids']],
                ];
                break;

            // 商品分类
            case 'category' :
                // 参数处理
                if(empty($params['category_id']))
                {
                    return DataReturn(MyLang('layout.base_goods_category_empty_tips'), -1);
                }

                // 排序处理
                $order_by_type_list = MyConst('common_goods_order_by_type_list');
                $order_by_rule_list = MyConst('common_data_order_by_rule_list');

                // 排序类型
                $order_by_type = empty($params['order_by_type']) ? $order_by_type_list[0]['value'] : (array_key_exists($params['order_by_type'], $order_by_type_list) ? $order_by_type_list[$params['order_by_type']]['value'] : $order_by_type_list[0]['value']);

                // 排序规则
                $order_by_rule = empty($params['order_by_rule']) ? $order_by_rule_list[0]['value'] : (array_key_exists($params['order_by_rule'], $order_by_rule_list) ? $order_by_rule_list[$params['order_by_rule']]['value'] : $order_by_rule_list[0]['value']);

                // 读取数量
                $m = 0;
                $n = min(empty($params['order_limit_number']) ? 50 : intval($params['order_limit_number']), 50);

                // 获取商品
                $order_by = $order_by_type.' '.$order_by_rule;
                $field = 'g.id,g.title,g.images,g.price,g.original_price,g.min_price,g.max_price,g.min_original_price,g.max_original_price,g.inventory,g.inventory_unit';
                $where = [
                    ['gci.category_id', 'in', GoodsCategoryService::GoodsCategoryItemsIds([intval($params['category_id'])])],
                    ['g.is_delete_time', '=', 0],
                    ['g.is_shelves', '=', 1],
                ];
                break;

            default :
                return DataReturn(MyLang('layout.base_data_type_not_handle_tips').'['.$params['data_type'].']', -1);
        }

        // 商品数据列表读取钩子
        $hook_name = 'plugins_layout_service_goods_data_begin';
        MyEventTrigger($hook_name, [
            'hook_name'     => $hook_name,
            'is_backend'    => true,
            'params'        => $params,
            'data_type'     => $data_type,
            'where'         => &$where,
            'field'         => &$field,
            'm'             => &$m,
            'n'             => &$n,
            'order_by'      => &$order_by,
        ]);

        // 根据请求类型处理数据读取
        switch($data_type)
        {
            // 商品
            case 'goods' :
                $request_params = [
                    'where'     => $where,
                    'm'         => $m,
                    'n'         => $n,
                    'field'     => $field,
                    'order_by'  => $order_by,
                ];
                $ret = GoodsService::GoodsList($request_params);
                if(!empty($ret['data']))
                {
                    // 商品自定义按照顺序重新调整
                    $goods = [];
                    $temp = array_column($ret['data'], null, 'id');
                    foreach($params['goods_ids'] as $v)
                    {
                        if(array_key_exists($v, $temp))
                        {
                            $goods[] = $temp[$v];
                        }
                    }
                    $ret['data'] = $goods;
                }
                break;

            // 商品分类
            case 'category' :
                $request_params = [
                    'where'     => $where,
                    'm'         => $m,
                    'n'         => $n,
                    'field'     => $field,
                    'order_by'  => $order_by,
                ];
                $ret = GoodsService::CategoryGoodsList($request_params);
                break;
        }
        if(!empty($ret) && isset($ret['code']) && $ret['code'] == 0 && !empty($ret['data']))
        {
            return $ret;
        }
        return DataReturn(MyLang('layout.base_goods_empty_tips'), -1);
    }

    /**
     * 页面数据
     * @author  Devil
     * @blog    http://gong.gg/
     * @version 1.0.0
     * @date    2021-05-14
     * @desc    description
     * @param   [array]           $params [输入参数]
     */
    public static function PagesList($params = [])
    {
        // 返回页面数据定义
        $data = [
            // 公共
            'common' => [
                'name'  => MyLang('layout.page_system_title'),
                'data'  => [
                    [ 'value' => 'home', 'name' => MyLang('shop_home_title')],
                    [ 'value' => 'goods_category', 'name' => MyLang('layout.page_goods_category')],
                    [ 'value' => 'goods_search', 'name' => MyLang('layout.page_goods_search'), 'tips' => MyLang('layout.page_goods_search_tips')],
                    [ 'value' => 'goods', 'name' => MyLang('layout.page_goods')],
                    [ 'value' => 'cart', 'name' => MyLang('layout.page_cart')],
                    [ 'value' => 'user_center', 'name' => MyLang('layout.page_user_center')],
                    [ 'value' => 'user_order_list', 'name' => MyLang('layout.page_user_order_list')],
                    [ 'value' => 'user_order_aftersale_list', 'name' => MyLang('layout.page_user_order_aftersale_list')],
                    [ 'value' => 'user_goods_favor_list', 'name' => MyLang('layout.page_user_goods_favor_list')],
                    [ 'value' => 'user_address_list', 'name' => MyLang('layout.page_user_address_list')],
                    [ 'value' => 'user_goods_browse_list', 'name' => MyLang('layout.page_user_goods_browse_list')],
                    [ 'value' => 'user_integral_list', 'name' => MyLang('layout.page_user_integral_list')],
                    [ 'value' => 'user_message_list', 'name' => MyLang('layout.page_user_message_list')],
                ],
            ],

            // 插件
            'plugins' => [
                'name'  => MyLang('layout.page_plugins_title'),
                'data'  => [],
            ],
        ];

        // 页面列表钩子
        $hook_name = 'plugins_layout_service_pages_list';
        MyEventTrigger($hook_name, [
            'hook_name'     => $hook_name,
            'is_backend'    => true,
            'params'        => $params,
            'data'          => &$data,
        ]);

        // 返回页面数据
        return $data;
    }
}
?>