Пример #1
0
 /**
  * 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());
         }
     }
 }
Пример #2
0
 /**
  * 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;
 }
Пример #3
0
 /**
  * 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);
     }
 }
Пример #4
0
 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));
 }
Пример #5
0
 /**
  * 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));
 }
Пример #6
0
 /**
  * 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);
     }
 }