*/ class Mage_XmlConnect_Helper_Theme extends Mage_Adminhtml_Helper_Data { /** * Color Themes Cache * * @param array|null */ protected $_themeArray = null; /** * Return for Color Themes Fields array. * * @return array */ public function getThemeAjaxParameters() { $themesArray = array ( 'conf_native_navigationBar_tintColor' => 'conf[native][navigationBar][tintColor]', 'conf_native_body_primaryColor' => 'conf[native][body][primaryColor]', 'conf_native_body_secondaryColor' => 'conf[native][body][secondaryColor]', 'conf_native_categoryItem_backgroundColor' => 'conf[native][categoryItem][backgroundColor]', 'conf_native_categoryItem_tintColor' => 'conf[native][categoryItem][tintColor]', 'conf_extra_fontColors_header' => 'conf[extra][fontColors][header]', 'conf_extra_fontColors_primary' => 'conf[extra][fontColors][primary]', 'conf_extra_fontColors_secondary' => 'conf[extra][fontColors][secondary]', 'conf_extra_fontColors_price' => 'conf[extra][fontColors][price]', 'conf_native_body_backgroundColor' => 'conf[native][body][backgroundColor]', 'conf_native_body_scrollBackgroundColor' => 'conf[native][body][scrollBackgroundColor]', 'conf_native_itemActions_relatedProductBackgroundColor' => 'conf[native][itemActions][relatedProductBackgroundColor]' ); return $themesArray; } /** * Returns JSON ready Themes array * * @param bool $flushCache load defaults * @return array */ public function getAllThemesArray($flushCache = false) { $result = array(); $themes = $this->getAllThemes($flushCache); foreach ($themes as $theme) { $result[$theme->getName()] = $theme->getFormData(); } return $result; } /** * Get dropdown select image for theme * * @param string $themeId * @return string Image url */ public function getThemeImageUrl($themeId) { $themeImage = array_key_exists($themeId, $this->getDefaultThemes()) ? $themeId : 'user_custom'; return Mage::helper('xmlconnect/image')->getSkinImagesUrl('swatch_' . $themeImage . '.gif'); } /** * Get themes dropdown selector html * * @param string $themeId * @return string */ public function getThemesSelector($themeId = '') { if (Mage::registry('current_app') !== null) { $themeId = Mage::registry('current_app')->getData('conf/extra/theme'); } if (!$themeId) { $themeId = $this->getDefaultThemeName(); } $currentTheme = $this->getThemeByName($themeId); if ($currentTheme === null) { $themeId = $this->getDefaultThemeName(); $currentTheme = $this->getThemeByName($themeId); } if (!($currentTheme instanceof Mage_XmlConnect_Model_Theme)) { Mage::throwException( Mage::helper('xmlconnect')->__('Can\'t load selected theme. Please check your media folder permissions.') ); } $themeList = ''; foreach ($this->getAllThemes(true) as $theme) { $themeList .= '
  • '; $themeList .= '' . $theme->getLabel(); $themeList .= ''; $themeList .= ''; $themeList .= '
  • '; } $themesDdl = <<
  • {$currentTheme->getLabel()}
  • EOT; return $themesDdl; } /** * Reads directory media/xmlconnect/themes/* * * @param bool $flushCache Reads default color Themes * @return array contains Mage_XmlConnect_Model_Theme */ public function getAllThemes($flushCache = false) { if (!$this->_themeArray || $flushCache) { try { $saveLibxmlErrors = libxml_use_internal_errors(true); $this->_themeArray = array(); $themeDir = $this->getMediaThemePath(); $ioFile = new Varien_Io_File(); $ioFile->checkAndCreateFolder($themeDir); $ioFile->open(array('path' => $themeDir)); $fileList = $ioFile->ls(Varien_Io_File::GREP_FILES); if (!count($fileList) || !$this->_checkDefaultThemes($fileList)) { $this->resetTheme(); $this->getAllThemes(true); } foreach ($fileList as $file) { $src = $themeDir . DS . $file['text']; if (is_readable($src)) { $theme = Mage::getModel('xmlconnect/theme', $src); $this->_themeArray[$theme->getName()] = $theme; } } asort($this->_themeArray); libxml_use_internal_errors($saveLibxmlErrors); } catch (Exception $e) { Mage::logException($e); } } return $this->_themeArray; } /** * Check are default themes files present in media folder or not * * @param array $fileList * @return bool */ protected function _checkDefaultThemes($fileList) { $cacheKey = 'MAGENTO_MOBILE_DEFAULT_THEMES_CACHE_KEY'; $cache = Mage::app()->loadCache($cacheKey); if (Mage::app()->useCache('config') && $cache) { $defaultFiles = unserialize($cache); } else { $ioFile = new Varien_Io_File(); $ioFile->open(array('path' => $this->_getDefaultThemePath())); $fileDefaultList = $ioFile->ls(Varien_Io_File::GREP_FILES); $defaultFiles = array(); foreach ($fileDefaultList as $defaultFileData) { if ('xml' != $defaultFileData['filetype']) { continue; } $defaultFiles[] = $defaultFileData['text']; } if (Mage::app()->useCache('config')) { Mage::app()->saveCache(serialize($defaultFiles), $cacheKey, array('config')); } } if (empty($defaultFiles)) { Mage::throwException($this->__('Default themes are missed.')); } $matches = 0; foreach ($fileList as $fileData) { if (in_array($fileData['text'], $defaultFiles)) { ++$matches; } } return $matches == count($defaultFiles); } /** * Reads default theme directory * * @throws Mage_Core_Exception * @return array contains Mage_XmlConnect_Model_Theme */ public function getDefaultThemes() { $saveLibxmlErrors = libxml_use_internal_errors(true); $defaultThemeArray = array(); $themeDir = $this->_getDefaultThemePath(); $ioFile = new Varien_Io_File(); $ioFile->open(array('path' => $themeDir)); try { $fileList = $ioFile->ls(Varien_Io_File::GREP_FILES); foreach ($fileList as $file) { $src = $themeDir . DS . $file['text']; if (is_readable($src)) { $theme = Mage::getModel('xmlconnect/theme', $src); $defaultThemeArray[$theme->getName()] = $theme; } } libxml_use_internal_errors($saveLibxmlErrors); } catch (Exception $e) { Mage::logException($e); } if (!count($defaultThemeArray)) { Mage::throwException(Mage::helper('xmlconnect')->__('Can\'t load default themes.')); } return $defaultThemeArray; } /** * Create new custom theme * * @param $themeName string * @param $data array * @return Mage_XmlConnect_Model_Theme */ public function createNewTheme($themeName, $data) { /** @var $defaultTheme Mage_XmlConnect_Model_Theme */ $defaultTheme = $this->getThemeByName($this->getDefaultThemeName()); return $defaultTheme->createNewTheme($themeName, $data); } /** * Get default theme path: /xmlconnect/etc/themes/* * * @return string */ protected function _getDefaultThemePath() { return Mage::getModuleDir('etc', 'Mage_XmlConnect') . DS . 'themes'; } /** * Get media theme path: media/xmlconnect/themes/* * * @return string */ public function getMediaThemePath() { return Mage::getBaseDir('media') . DS . 'xmlconnect' . DS . 'themes'; } /** * Reset themes color changes * Copy /xmlconnect/etc/themes/* to media/xmlconnect/themes/* * * @throws Mage_Core_Exception * @param null $theme * @return null */ public function resetTheme($theme = null) { $themeDir = $this->getMediaThemePath(); $defaultThemeDir = $this->_getDefaultThemePath(); $ioFile = new Varien_Io_File(); $ioFile->open(array('path' => $defaultThemeDir)); $fileList = $ioFile->ls(Varien_Io_File::GREP_FILES); foreach ($fileList as $file) { $f = $file['text']; $src = $defaultThemeDir . DS . $f; $dst = $themeDir . DS .$f; if ($theme && ($theme . '.xml') != $f) { continue; } if (!$ioFile->cp($src, $dst)) { Mage::throwException(Mage::helper('xmlconnect')->__('Can\'t copy file "%s" to "%s".', $src, $dst)); } else { $ioFile->chmod($dst, 0755); } } } /** * Get theme object by name * * @param string $name * @return Mage_XmlConnect_Model_Theme|null */ public function getThemeByName($name) { $themes = $this->getAllThemes(); $theme = isset($themes[$name]) ? $themes[$name] : null; return $theme; } /** * Return predefined custom theme name * * @return string */ public function getCustomThemeName() { return 'custom'; } /** * Return predefined default theme name * * @return string */ public function getDefaultThemeName() { return 'default'; } /** * Get current theme name * * @return string */ public function getThemeId() { $themeId = Mage::helper('xmlconnect')->getApplication()->getData('conf/extra/theme'); if ($this->getThemeByName($themeId) === null) { $themeId = null; } if (empty($themeId)) { $themeId = $this->getDefaultThemeName(); } return $themeId; } /** * Get theme label by theme name * * @param array $themes * @param bool $themeId * @return string */ public function getThemeLabel(array $themes, $themeId = false) { $themeLabel = ''; $themeId = $themeId ? $themeId : $this->getThemeId(); foreach ($themes as $theme) { if ($theme->getName() == $themeId) { $themeLabel = $theme->getLabel(); break; } } return $themeLabel; } /** * Delete theme by id * * @param $themeId * @return bool */ public function deleteTheme($themeId) { $result = false; $ioFile = new Varien_Io_File(); $ioFile->cd($this->getMediaThemePath()); $themeFile = basename($themeId . '.xml'); if ($ioFile->fileExists($themeFile)) { $result = $ioFile->rm($themeFile); } return $result; } }