/** * Update theme info in the [OW_DB_PREFIX]_base_theme table according to the theme.xml file and force theme rebuilding if necessary * @param $name * @param bool $processTheme */ public function updateThemeInfo($name, $processTheme = false) { $path = OW_DIR_THEME . $name; $xmlFiles = UTIL_File::findFiles($path, array('xml'), 1); $themeXml = $xmlFiles[0]; if (basename($themeXml) === self::MANIFEST_FILE) { $xml = simplexml_load_file($themeXml); $title = (string) $xml->name; $build = (int) $xml->build; $developerKey = (string) $xml->developerKey; $sidebarPosition = (string) $xml->sidebarPosition; if (!in_array(trim($sidebarPosition), array('left', 'right', 'none'))) { $sidebarPosition = 'none'; } $xmlArray = (array) $xml; unset($xmlArray['masterPages']); $description = json_encode($xmlArray); if (!trim($title)) { $title = $name; } $theme = $this->findThemeByName($name); if (empty($theme)) { return; } $theme->setName($name); $theme->setTitle($title); $theme->setDescription($description); $theme->setSidebarPosition($sidebarPosition); $theme->setDeveloperKey($developerKey); $this->themeDao->save($theme); if ($processTheme) { $this->processTheme($theme->getId()); } } }
/** * Returns all plugins XML info. */ public function getPluginsXmlInfo() { $resultArray = array(); $xmlFiles = UTIL_File::findFiles(OW_DIR_PLUGIN, array('xml'), 1); foreach ($xmlFiles as $pluginXml) { if (basename($pluginXml) === 'plugin.xml') { $pluginInfo = $this->readPluginXmlInfo($pluginXml); if ($pluginInfo !== null) { $resultArray[$pluginInfo['key']] = $pluginInfo; } } } return $resultArray; }
/** * Updates/adds whole theme content, generating static files and inserting theme content in DB. * * @param int $id */ public function processTheme($id) { $theme = $this->getThemeById($id); if (empty($theme)) { throw new InvalidArgumentException("Can't process theme with id `" . $id . "`, not found!"); } $themeName = $theme->getKey(); if (!file_exists($this->getRootDir($themeName))) { throw new LogicException("Can't find theme dir for `" . $themeName . "`!"); } $themeStaticDir = $this->getStaticDir($themeName); $themeRootDir = $this->getRootDir($themeName); $mobileRootDir = $this->getRootDir($themeName, true); // deleting DB entries and files $this->unlinkTheme($theme->getId()); mkdir($themeStaticDir); // copy all static files UTIL_File::copyDir($themeRootDir, $this->getStaticDir($themeName), function ($itemPath) { if (substr($itemPath, 0, 1) == ".") { return false; } if (is_dir($itemPath)) { return true; } $fileExtension = strtolower(UTIL_File::getExtension(basename($itemPath))); if (in_array($fileExtension, array("psd", "html"))) { return false; } return true; }); $themeControls = array(); // copy main css file if (file_exists($themeRootDir . self::CSS_FILE_NAME)) { $controlsContent = file_get_contents($themeRootDir . self::CSS_FILE_NAME); $themeControls = $this->getThemeControls($controlsContent); $mobileControls = array(); if (file_exists($mobileRootDir . self::CSS_FILE_NAME)) { $controlsContent .= PHP_EOL . file_get_contents($mobileRootDir . self::CSS_FILE_NAME); $mobileControls = $this->getThemeControls(file_get_contents($mobileRootDir . self::CSS_FILE_NAME)); foreach ($mobileControls as $key => $val) { $mobileControls[$key]["mobile"] = true; } } $themeControls = array_merge($mobileControls, $themeControls); // adding theme controls in DB if (!empty($themeControls)) { foreach ($themeControls as $value) { $themeControl = new BOL_ThemeControl(); $themeControl->setAttribute($value["attrName"]); $themeControl->setKey($value["key"]); $themeControl->setSection($value["section"]); $themeControl->setSelector($value["selector"]); $themeControl->setThemeId($theme->getId()); $themeControl->setDefaultValue($value["defaultValue"]); $themeControl->setType($value["type"]); $themeControl->setLabel($value["label"]); if (isset($value["description"])) { $themeControl->setDescription(trim($value["description"])); } $themeControl->setMobile(!empty($value["mobile"])); $this->themeControlDao->save($themeControl); } } } // decorators if (file_exists($this->getDecoratorsDir($themeName))) { $files = UTIL_File::findFiles($this->getDecoratorsDir($themeName), array("html"), 0); foreach ($files as $value) { $decoratorEntry = new BOL_ThemeContent(); $decoratorEntry->setThemeId($theme->getId()); $decoratorEntry->setType(BOL_ThemeContentDao::VALUE_TYPE_ENUM_DECORATOR); $decoratorEntry->setValue(UTIL_File::stripExtension(basename($value))); $this->themeContentDao->save($decoratorEntry); } } // master pages if (file_exists($this->getMasterPagesDir($themeName))) { $files = UTIL_File::findFiles($this->getMasterPagesDir($themeName), array("html"), 0); foreach ($files as $value) { $masterPageEntry = new BOL_ThemeContent(); $masterPageEntry->setThemeId($theme->getId()); $masterPageEntry->setType(BOL_ThemeContentDao::VALUE_TYPE_ENUM_MASTER_PAGE); $masterPageEntry->setValue(UTIL_File::stripExtension(basename($value))); $this->themeContentDao->save($masterPageEntry); } } if (file_exists($this->getMasterPagesDir($themeName, true))) { $files = UTIL_File::findFiles($this->getMasterPagesDir($themeName, true), array("html"), 0); foreach ($files as $value) { $masterPageEntry = new BOL_ThemeContent(); $masterPageEntry->setThemeId($theme->getId()); $masterPageEntry->setType(BOL_ThemeContentDao::VALUE_TYPE_ENUM_MOBILE_MASTER_PAGE); $masterPageEntry->setValue(UTIL_File::stripExtension(basename($value))); $this->themeContentDao->save($masterPageEntry); } } // xml master page assignes $xml = simplexml_load_file($this->getRootDir($themeName) . self::THEME_XML); $masterPages = (array) $xml->masterPages; foreach ($masterPages as $key => $value) { $masterPageLinkEntry = new BOL_ThemeMasterPage(); $masterPageLinkEntry->setThemeId($theme->getId()); $masterPageLinkEntry->setDocumentKey(trim($key)); $masterPageLinkEntry->setMasterPage(trim($value)); $this->themeMasterPageDao->save($masterPageLinkEntry); } }
public function update(array $params) { $themeDto = $this->getThemeDtoByKeyInParamsArray($params); $language = OW::getLanguage(); $router = OW::getRouter(); if (!empty($_GET["mode"])) { switch (trim($_GET["mode"])) { case "theme_up_to_date": $this->feedback->warning($language->text("admin", "manage_themes_up_to_date_message")); break; case "theme_update_success": $this->feedback->info($language->text("admin", "manage_themes_update_success_message")); break; default: $this->feedback->error($language->text("admin", "manage_themes_update_process_error")); break; } $this->redirect($router->urlForRoute("admin_themes_choose")); } $remoteThemeInfo = (array) $this->storageService->getItemInfoForUpdate($themeDto->getKey(), $themeDto->getDeveloperKey(), $themeDto->getBuild()); if (empty($remoteThemeInfo) || !empty($remoteThemeInfo["error"])) { $this->feedback->error($language->text("admin", "manage_themes_update_process_error")); $this->redirect($router->urlForRoute("admin_themes_choose")); } if (!(bool) $remoteThemeInfo["freeware"] && ($themeDto->getLicenseKey() == null || !$this->storageService->checkLicenseKey($themeDto->getKey(), $themeDto->getDeveloperKey(), $themeDto->getLicenseKey()))) { $this->feedback->error($language->text("admin", "manage_plugins_update_invalid_key_error")); $this->redirect($router->urlForRoute("admin_themes_choose")); } $ftp = $this->getFtpConnection(); try { $archivePath = $this->storageService->downloadItem($themeDto->getKey(), $themeDto->getDeveloperKey(), $themeDto->getLicenseKey()); } catch (Exception $e) { $this->feedback->error($e->getMessage()); $this->redirect($router->urlForRoute("admin_themes_choose")); } if (!file_exists($archivePath)) { $this->feedback->error($language->text("admin", "theme_update_download_error")); $this->redirect($router->urlForRoute("admin_themes_choose")); } $zip = new ZipArchive(); $pluginfilesDir = OW::getPluginManager()->getPlugin("base")->getPluginFilesDir(); $tempDirPath = $pluginfilesDir . UTIL_HtmlTag::generateAutoId("theme_update") . DS; if ($zip->open($archivePath) === true) { $zip->extractTo($tempDirPath); $zip->close(); } else { $this->feedback->error($language->text("admin", "theme_update_download_error")); $this->redirect($router->urlForRoute("admin_themes_choose")); } $result = UTIL_File::findFiles($tempDirPath, array("xml")); $localThemeRootPath = null; foreach ($result as $item) { if (basename($item) == BOL_ThemeService::THEME_XML) { $localThemeRootPath = dirname($item) . DS; } } if ($localThemeRootPath == null) { $this->feedback->error($language->text("admin", "manage_theme_update_extract_error")); $this->redirect($router->urlForRoute("admin_themes_choose")); } $remoteDir = OW_DIR_THEME . $themeDto->getKey(); if (!file_exists($remoteDir)) { $this->feedback->error($language->text("admin", "manage_theme_update_theme_not_found")); $this->redirect($router->urlForRoute("admin_themes_choose")); } $ftp->uploadDir($localThemeRootPath, $remoteDir); UTIL_File::removeDir($localThemeRootPath); $params = array("theme" => $themeDto->getKey(), "back-uri" => urlencode(OW::getRequest()->getRequestUri())); $this->redirect(OW::getRequest()->buildUrlQueryString($this->storageService->getUpdaterUrl(), $params)); }
/** * Executes plugin update * * @param array $params */ public function update(array $params) { $pluginDto = $this->getPluginDtoByKeyInParamsArray($params); $language = OW::getLanguage(); $feedback = OW::getFeedback(); $redirectUrl = OW::getRouter()->urlForRoute("admin_plugins_installed"); //TODO remove hardcoded constants // process data returned by update script if (!empty($_GET["mode"])) { switch (trim($_GET["mode"])) { case "plugin_up_to_date": $feedback->warning($language->text("admin", "manage_plugins_up_to_date_message")); break; case "plugin_update_success": OW::getEventManager()->trigger(new OW_Event(OW_EventManager::ON_AFTER_PLUGIN_UPDATE, array('pluginKey' => $pluginDto->getKey()))); $feedback->info($language->text("admin", "manage_plugins_update_success_message")); break; default: $feedback->error($language->text("admin", "manage_plugins_update_process_error")); break; } $this->redirect($redirectUrl); } $remotePluginInfo = (array) $this->storageService->getItemInfoForUpdate($pluginDto->getKey(), $pluginDto->getDeveloperKey(), $pluginDto->getBuild()); if (empty($remotePluginInfo) || !empty($remotePluginInfo["error"])) { $feedback->error($language->text("admin", "manage_plugins_update_process_error")); $this->redirect($redirectUrl); } if (!(bool) $remotePluginInfo["freeware"] && ($pluginDto->getLicenseKey() == null || !$this->storageService->checkLicenseKey($pluginDto->getKey(), $pluginDto->getDeveloperKey(), $pluginDto->getLicenseKey()))) { $feedback->error($language->text("admin", "manage_plugins_update_invalid_key_error")); $this->redirect($redirectUrl); } $ftp = $this->getFtpConnection(); try { $archivePath = $this->storageService->downloadItem($pluginDto->getKey(), $pluginDto->getDeveloperKey(), $pluginDto->getLicenseKey()); } catch (Exception $e) { $feedback->error($e->getMessage()); $this->redirect($redirectUrl); } if (!file_exists($archivePath)) { $feedback->error(OW::getLanguage()->text("admin", "plugin_update_download_error")); $this->redirect($redirectUrl); } $zip = new ZipArchive(); $tempDirPath = OW::getPluginManager()->getPlugin("base")->getPluginFilesDir() . "plugin_update" . UTIL_String::getRandomString(5, UTIL_String::RND_STR_ALPHA_NUMERIC) . DS; mkdir($tempDirPath); if ($zip->open($archivePath) === true) { $zip->extractTo($tempDirPath); $zip->close(); } else { $feedback->error(OW::getLanguage()->text("admin", "plugin_update_download_error")); $this->redirect($redirectUrl); } // locate plugin.xml file to find plugin source root dir $result = UTIL_File::findFiles($tempDirPath, array("xml")); $localPluginRootPath = null; foreach ($result as $item) { if (basename($item) == BOL_PluginService::PLUGIN_INFO_XML) { $localPluginRootPath = dirname($item) . DS; } } if ($localPluginRootPath == null) { $feedback->error($language->text("admin", "manage_plugin_add_extract_error")); $this->redirect($redirectUrl); } try { $plugin = OW::getPluginManager()->getPlugin($pluginDto->getKey()); } catch (InvalidArgumentException $ex) { $feedback->error($language->text("admin", "manage_plugin_update_plugin_not_active_error")); $this->redirect($redirectUrl); } $remoteDirPath = $plugin->getRootDir(); $ftp->uploadDir($localPluginRootPath, $remoteDirPath); UTIL_File::removeDir($localPluginRootPath); $this->pluginService->addPluginDirs($pluginDto); $params = array("plugin" => $pluginDto->getKey(), "back-uri" => urlencode(OW::getRequest()->getRequestUri())); $this->redirect(OW::getRequest()->buildUrlQueryString($this->storageService->getUpdaterUrl(), $params)); }
/** * Installs plugins. * Installs all available system plugins */ public function installSystemPlugins() { $files = UTIL_File::findFiles(OW_DIR_SYSTEM_PLUGIN, array("xml"), 1); $pluginData = array(); $tempPluginData = array(); // first element should be BASE plugin foreach ($files as $file) { $tempArr = $this->readPluginXmlInfo($file); $pathArr = explode(DS, dirname($file)); $tempArr["dir_name"] = array_pop($pathArr); if ($tempArr["key"] == "base") { $pluginData[$tempArr["key"]] = $tempArr; } else { $tempPluginData[$tempArr["key"]] = $tempArr; } } foreach ($tempPluginData as $key => $val) { $pluginData[$key] = $val; } if (!array_key_exists("base", $pluginData)) { throw new LogicException("Base plugin is not found in `{$basePluginRootDir}`!"); } // install plugins list foreach ($pluginData as $pluginInfo) { $pluginDto = new BOL_Plugin(); $pluginDto->setTitle(!empty($pluginInfo["title"]) ? trim($pluginInfo["title"]) : "No Title"); $pluginDto->setDescription(!empty($pluginInfo["description"]) ? trim($pluginInfo["description"]) : "No Description"); $pluginDto->setKey(trim($pluginInfo["key"])); $pluginDto->setModule($pluginInfo["dir_name"]); $pluginDto->setIsActive(true); $pluginDto->setIsSystem(true); $pluginDto->setBuild((int) $pluginInfo["build"]); if (!empty($pluginInfo["developerKey"])) { $pluginDto->setDeveloperKey(trim($pluginInfo["developerKey"])); } $this->pluginListCache[$pluginDto->getKey()] = $pluginDto; $plugin = new OW_Plugin($pluginDto); $this->includeScript($plugin->getRootDir() . BOL_PluginService::SCRIPT_INSTALL); $this->pluginDao->save($pluginDto); $this->updatePluginListCache(); $this->addPluginDirs($pluginDto); } }