コード例 #1
0
function add_version_folders(&$archive, $base_upload_dir, $user_template_dir, $preview_template_folder, $userThemeName, $includeThemler)
{
    $preview_files = array();
    foreach (get_support_versions() as $version) {
        $preview_files[$version] = FilesHelper::enumerateFiles($preview_template_folder . '/' . $version);
    }
    $preview_name = $userThemeName . _PREVIEW_SUFFIX_;
    $version_folders = get_support_versions_folder($user_template_dir);
    $cms_version = get_cms_version();
    $dirs = array('themes', 'modules');
    $modules = array('designerpreview', 'blocktopmenu_mod');
    if ($includeThemler) {
        $modules[] = 'designer';
    }
    foreach ($version_folders as $version => $folder) {
        $root = $base_upload_dir . (strpos($cms_version, $version) !== false ? '' : '/' . $version);
        foreach ($dirs as $name) {
            $dir = $root . '/' . $name;
            $arch_dirs[$name] = $dir;
            FilesHelper::createDir($dir);
        }
        FilesHelper::copyRecursive($user_template_dir, $arch_dirs['themes'] . '/' . $userThemeName);
        foreach ($modules as $module) {
            FilesHelper::copyRecursive(_PS_MODULE_DIR_ . $module, $arch_dirs['modules'] . '/' . $module);
        }
        // current version files in preview folder doesn't need to be copied
        if (strpos($cms_version, $version) !== false) {
            continue;
        }
        $files = $preview_files[$version];
        $pattern = '/(.*?\\/themes\\/' . $preview_name . '\\/' . $version . '\\/)(.*?)/si';
        foreach ($files as $file) {
            $path = $file['path'];
            $isThemler = strpos($path, 'designer/');
            if ($isThemler && !$includeThemler) {
                continue;
            }
            $isModule = $isThemler || strpos($path, 'designerpreview/') || strpos($path, 'blocktopmenu_mod/');
            $to_replace = ($isModule ? $arch_dirs['modules'] : $arch_dirs['themes'] . '/' . $userThemeName) . '/$2';
            $r_path = preg_replace($pattern, $to_replace, $path);
            $r_path = FilesHelper::normalizePath($r_path);
            FilesHelper::writeFile($r_path, $file['content']);
        }
        // add version folder as root folder to archive file
        addToArchive($archive, $root, $base_upload_dir);
        FilesHelper::removeDir($root, true);
    }
    if ($includeThemler) {
        $inner_preview_dir = $base_upload_dir . '/themes/' . $userThemeName . '/' . $userThemeName . _PREVIEW_SUFFIX_;
        FilesHelper::copyRecursive($preview_template_folder, $inner_preview_dir);
    }
    foreach ($dirs as $dir) {
        addToArchive($archive, $base_upload_dir . '/' . $dir, $base_upload_dir);
    }
    clearDirs($base_upload_dir, $dirs);
    return;
}
function copyOrRename($src, $dest, $rename)
{
    if (file_exists($src)) {
        if ($rename) {
            FilesHelper::renameFile($src, $dest);
        } else {
            FilesHelper::copyRecursive($src, $dest);
        }
    }
}
コード例 #3
0
 /**
  * @param $source
  * @param $destination
  */
 public static function copyRecursive($source, $destination, $change_file = null)
 {
     if (is_file($source)) {
         $ext = pathinfo($source, PATHINFO_EXTENSION);
         if ($change_file && in_array($ext, array('tpl'))) {
             self::writeFile($destination, call_user_func($change_file, $source));
         } else {
             self::copyFile($source, $destination);
         }
     } elseif (is_dir($source)) {
         self::createDir($destination);
         if ($dh = opendir($source)) {
             while (($file = readdir($dh)) !== false) {
                 if ('.' == $file || '..' == $file) {
                     continue;
                 }
                 FilesHelper::copyRecursive($source . '/' . $file, $destination . '/' . $file, $change_file);
             }
             closedir($dh);
         }
     }
 }
 /**
  * Updates Billion Themler theme
  */
 public function update()
 {
     ProviderLog::start('update');
     $helper = new PreviewHelper($this->_themeDir);
     $changedFiles = getPreviewChangedFiles($this->_themeDir);
     if (empty($changedFiles) || !file_exists($this->_previewThemeDir)) {
         // full copy
         FilesHelper::copyRecursive($this->_themeDir, $this->_previewThemeDir, array($helper, "restoreDataId"));
         $export = $this->_previewThemeDir . '/export';
         if (is_dir($export)) {
             FilesHelper::removeDir($export);
         }
     } else {
         // copy only changed files
         foreach ($changedFiles as $file) {
             if (file_exists($this->_themeDir . $file)) {
                 FilesHelper::copyRecursive($this->_themeDir . $file, $this->_previewThemeDir . $file, array($helper, "restoreDataId"));
             } else {
                 // Modules files do not save to base theme but they could exists in changed files.
                 // In some cases export might not be performed after update action
                 // that's why we have to copy them from cms folder and export action can override them after that.
                 // So we'll always have existing modules files in preview theme folder
                 if ((strpos($file, 'designer/') || strpos($file, 'designerpreview/') || strpos($file, 'blocktopmenu_mod/')) && file_exists($this->_modulesDir . $file)) {
                     FilesHelper::copyRecursive($this->_modulesDir . $file, $this->_previewThemeDir . $file);
                 } else {
                     FilesHelper::deleteFile($this->_previewThemeDir . $file);
                 }
             }
         }
         setPreviewChangedFiles($this->_themeDir, $this->_previewThemeDir, array());
     }
     ProviderLog::end('update');
     return array('result' => 'done', 'log' => ProviderLog::getLog());
 }