function unZip($themeName, $filename, $tmp_path)
{
    $base_upload_dir = get_base_upload_dir();
    $archive_file = $base_upload_dir . '/' . $filename . '.tmp';
    $tmp_dir = $base_upload_dir . '/zip-data.tmp';
    FilesHelper::emptyDirRecursive($tmp_dir);
    $archive = new PclZip($archive_file);
    if (0 == $archive->extract(PCLZIP_OPT_PATH, $tmp_dir)) {
        return array('status' => 'error', 'message' => "<p><b>Invalid zip</b></p>Extract error : " . $archive->errorInfo(true));
    }
    $fso = FilesHelper::generateFso($tmp_dir);
    FilesHelper::deleteFile($archive_file);
    FilesHelper::emptyDirRecursive($tmp_dir);
    return array('status' => 'done', 'fso' => $fso);
}
 private function _fixPreviewImagePaths()
 {
     $fixStr = "{assign var=theme_name value=\$tpl_dir|regex_replace:'/(.*)([\\/\\\\\\]themes[\\/\\\\\\])(.*)(_preview[\\/\\\\\\]\$)/':'\$3'}";
     $fixStr1 = "{if \$isBdPreview && !file_exists(\"\$tpl_dir/img/";
     $dirs = array($this->_previewThemeDir, $this->_themeDir);
     foreach ($dirs as $dir) {
         foreach (FilesHelper::enumerateFiles($dir) as $file) {
             $info = pathinfo($file['name']);
             $name = $info['filename'];
             $fileExt = isset($info['extension']) && $info['extension'] ? $info['extension'] : '';
             if (!in_array($fileExt, array('tpl'))) {
                 continue;
             }
             $content = $file['content'];
             $content = str_replace('"' . $fixStr1, '"' . $fixStr . $fixStr1, $content, $count);
             $content = preg_replace('/({assign var=p value="{\\$img_dir}..\\/..\\/)(.*?)(\\/)/', '$1{\\$theme_name}$3', $content);
             if ($count > 0) {
                 FilesHelper::writeFile($file['path'], $content);
             }
         }
     }
     FilesHelper::emptyDirRecursive($this->_previewThemeDir . '/img', false);
 }