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); } } }
/** * @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()); }