ThemeService.php 7.7 KB
Newer Older
D
v1.2.0  
devil_gong 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
<?php
// +----------------------------------------------------------------------
// | ShopXO 国内领先企业级B2C免费开源电商系统
// +----------------------------------------------------------------------
// | Copyright (c) 2011~2018 http://shopxo.net All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: Devil
// +----------------------------------------------------------------------
namespace app\service;

use think\Db;

/**
 * 主题服务层
 * @author   Devil
 * @blog     http://gong.gg/
 * @version  0.0.1
 * @datetime 2016-12-01T21:51:08+0800
 */
class ThemeService
{
    // 静态目录和html目录
25 26
    private static $html_path = 'application'.DS.'index'.DS.'view'.DS;
    private static $static_path = 'public'.DS.'static'.DS.'index'.DS;
D
v1.2.0  
devil_gong 已提交
27 28 29 30 31 32 33 34 35 36

    /**
     * 获取模板列表
     * @author   Devil
     * @blog     http://gong.gg/
     * @version  0.0.1
     * @datetime 2017-05-10T10:24:40+0800
     * @param    [array]          $params [输入参数]
     * @return   [array]                  [模板列表]
     */
37
    public static function ThemeList($params = [])
D
v1.2.0  
devil_gong 已提交
38 39
    {
        $result = [];
40
        $dir = ROOT.self::$html_path;
D
v1.2.0  
devil_gong 已提交
41 42 43 44
        if(is_dir($dir))
        {
            if($dh = opendir($dir))
            {
D
devil_gong 已提交
45
                $default_preview = __MY_PUBLIC_URL__.'static'.DS.'common'.DS.'images'.DS.'default-preview.jpg';
D
v1.2.0  
devil_gong 已提交
46 47
                while(($temp_file = readdir($dh)) !== false)
                {
D
devil_gong 已提交
48 49 50 51 52
                    if(in_array($temp_file, ['.', '..', 'index.html']))
                    {
                        continue;
                    }

D
v1.2.0  
devil_gong 已提交
53 54 55 56 57 58 59 60 61 62 63 64 65 66
                    $config = $dir.$temp_file.DS.'config.json';
                    if(!file_exists($config))
                    {
                        continue;
                    }

                    // 读取配置文件
                    $data = json_decode(file_get_contents($config), true);
                    if(!empty($data) && is_array($data))
                    {
                        if(empty($data['name']) || empty($data['ver']) || empty($data['author']))
                        {
                            continue;
                        }
67
                        $preview = ROOT.self::$static_path.$temp_file.DS.'images'.DS.'preview.jpg';
D
v1.2.0  
devil_gong 已提交
68 69 70 71 72 73
                        $result[] = array(
                            'theme'     =>  $temp_file,
                            'name'      =>  htmlentities($data['name']),
                            'ver'       =>  str_replace(array(',',','), ', ', htmlentities($data['ver'])),
                            'author'    =>  htmlentities($data['author']),
                            'home'      =>  isset($data['home']) ? $data['home'] : '',
D
devil_gong 已提交
74
                            'preview'   =>  file_exists($preview) ? __MY_PUBLIC_URL__.'static'.DS.'index'.DS.$temp_file.DS.'images'.DS.'preview.jpg' : $default_preview,
D
v1.2.0  
devil_gong 已提交
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
                            'is_delete' => ($temp_file == 'default') ? 0 : 1,
                        );
                    }
                }
                closedir($dh);
            }
        }
        return $result;
    }

    /**
     * 模板上传
     * @author   Devil
     * @blog     http://gong.gg/
     * @version  1.0.0
     * @datetime 2018-12-19T00:53:45+0800
     * @param    [array]          $params [输入参数]
     */
93
    public static function ThemeUpload($params = [])
D
v1.2.0  
devil_gong 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109
    {
        // 文件上传校验
        $error = FileUploadError('theme');
        if($error !== true)
        {
            return DataReturn($error, -1);
        }

        // 文件格式化校验
        $type = array('application/zip', 'application/octet-stream');
        if(!in_array($_FILES['theme']['type'], $type))
        {
            return DataReturn('文件格式有误,请上传zip压缩包', -2);
        }

        // 目录是否有权限
110
        if(!is_writable(ROOT.self::$html_path))
D
v1.2.0  
devil_gong 已提交
111 112 113
        {
            return DataReturn('视图目录没权限', -10);
        }
114
        if(!is_writable(ROOT.self::$static_path))
D
v1.2.0  
devil_gong 已提交
115 116 117 118
        {
            return DataReturn('资源目录没权限', -10);
        }

D
devil_gong 已提交
119 120 121 122 123 124
        // 资源目录
        $dir_list = [
            '_html_'        => ROOT.self::$html_path,
            '_static_'      => ROOT.self::$static_path,
        ];

D
v1.2.0  
devil_gong 已提交
125 126 127 128 129 130 131 132 133 134 135 136
        // 开始解压文件
        $resource = zip_open($_FILES['theme']['tmp_name']);
        while(($temp_resource = zip_read($resource)) !== false)
        {
            if(zip_entry_open($resource, $temp_resource))
            {
                // 当前压缩包中项目名称
                $file = zip_entry_name($temp_resource);

                // 排除临时文件和临时目录
                if(strpos($file, '/.') === false && strpos($file, '__') === false)
                {
D
devil_gong 已提交
137
                    // 文件包对应系统所在目录
D
devil_gong 已提交
138
                    $is_has_find = false;
D
devil_gong 已提交
139
                    foreach($dir_list as $dir_key=>$dir_value)
D
v1.2.0  
devil_gong 已提交
140
                    {
D
devil_gong 已提交
141 142 143
                        if(strpos($file, $dir_key) !== false)
                        {
                            $file = str_replace($dir_key.'/', '', $dir_value.$file);
D
devil_gong 已提交
144
                            $is_has_find = true;
D
devil_gong 已提交
145 146
                            break;
                        }
D
v1.2.0  
devil_gong 已提交
147 148
                    }

D
devil_gong 已提交
149 150 151 152 153 154
                    // 没有匹配到则指定目录跳过
                    if($is_has_find == false)
                    {
                        continue;
                    }

D
v1.2.0  
devil_gong 已提交
155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
                    // 截取文件路径
                    $file_path = substr($file, 0, strrpos($file, '/'));

                    // 路径不存在则创建
                    if(!is_dir($file_path))
                    {
                        mkdir($file_path, 0777, true);
                    }

                    // 如果不是目录则写入文件
                    if(!is_dir($file))
                    {
                        // 读取这个文件
                        $file_size = zip_entry_filesize($temp_resource);
                        $file_content = zip_entry_read($temp_resource, $file_size);
                        file_put_contents($file, $file_content);
                    }
D
devil_gong 已提交
172
                    
D
v1.2.0  
devil_gong 已提交
173 174 175 176 177
                    // 关闭目录项  
                    zip_entry_close($temp_resource);
                }
            }
        }
D
devil_gong 已提交
178
        return DataReturn('安装成功');
D
v1.2.0  
devil_gong 已提交
179 180 181 182 183 184 185 186 187 188
    }

    /**
     * 模板删除
     * @author   Devil
     * @blog     http://gong.gg/
     * @version  1.0.0
     * @datetime 2018-12-19T00:46:02+0800
     * @param    [array]          $params [输入参数]
     */
189
    public static function ThemeDelete($params = [])
D
v1.2.0  
devil_gong 已提交
190 191 192 193 194
    {
        if(empty($params['id']))
        {
            return DataReturn('模板id有误', -1);
        }
195
        // 防止路径回溯
G
gongfuxiang 已提交
196
        $id = htmlentities(str_replace(array('.', '/', '\\', ':'), '', strip_tags($params['id'])));
D
v1.2.0  
devil_gong 已提交
197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217
        if(empty($id))
        {
            return DataReturn('主题名称有误', -1);
        }

        // default不能删除
        if($id == 'default')
        {
            return DataReturn('系统模板不能删除', -2);
        }

        // 默认主题
        $theme = MyC('common_default_theme', 'default', true);

        // 不能删除正在使用的主题
        if($theme == $id)
        {
            return DataReturn('不能删除正在使用的主题', -2);
        }

        // 开始删除主题
218
        if(\base\FileUtil::UnlinkDir(ROOT.self::$html_path.$id) && \base\FileUtil::UnlinkDir(ROOT.self::$static_path.$id))
D
v1.2.0  
devil_gong 已提交
219 220 221 222 223 224 225
        {
            return DataReturn('删除成功');
        }
        return DataReturn('删除失败或资源不存在', -100);
    }
}
?>