*/ /** * Klasa obsługująca tematy w aplikacji frontend * * @package stThemePlugin * @subpackage libs */ class stTheme { protected $context, $response, $theme = null, $baseTheme = null, $layoutName, $cssDir = null, $stylesheetPath = array(), $layoutConfig = array(); protected static $pluginModulePaths = null; protected static $instance = null; protected static $hideOldConfiguration = null; /** * Zwraca instancje obiektu * * @param sfContext $context * * @return stTheme object */ public static function getInstance(sfContext $context) { if (!isset(self::$instance)) { $class = __CLASS__; self::$instance = new $class(); self::$instance->initialize($context); } return self::$instance; } /** * Inicjalizuje podstawową konfigurację tematu * * @param string $context */ public function initialize(sfContext $context) { $this->layoutConfig = array(); $this->cssDir = sfConfig::get('sf_web_dir') . '/' . 'css'; $this->context = $context; $this->response = $context->getResponse(); if (SF_ENVIRONMENT == 'theme') { if ($this->context->getRequest()->hasParameter('theme')) { $this->context->getUser()->setAttribute('name', $this->context->getRequest()->getParameter('theme'), 'soteshop/stTheme'); } $theme_name = $this->context->getUser()->getAttribute('name', null, 'soteshop/stTheme'); if ($theme_name) { $this->setThemeName($theme_name); } } stEventDispatcher::getInstance()->notify(new sfEvent($this, 'stTheme.setDefaulTheme')); } public function getActionName() { return $this->context->getActionName(); } public function getModuleName() { return $this->context->getModuleName(); } public function getVersion() { return $this->getTheme()->getVersion(); } public function hasThemeContent($id) { return $this->getTheme()->hasThemeContent($id); } public function getThemeContent($id, $default = null) { return $this->getTheme()->getThemeContent($id, $default); } /** * Pobiera aktywny obiekt tematu * * @return Theme */ public function getTheme() { if (null === $this->theme) { $this->theme = self::getActiveTheme(); } return $this->theme; } public function setTheme(Theme $theme) { $this->theme = $theme; } /** * Pobiera aktywny obiekt tematu * * @return Theme */ public static function getActiveTheme() { $theme = null; $request = sfContext::getInstance()->getRequest(); if (MobileDetect::getInstance()->isMobile() || $request->getParameter('mobile') && defined('ST_FAST_CACHE_SAVE_MODE') && ST_FAST_CACHE_SAVE_MODE) { $id = stConfig::getInstance('stThemeBackend')->get('responsive'); if ($id) { $theme = ThemePeer::retrieveByPKCached($id); } } if (null === $theme) { $theme = ThemePeer::doSelectActive(); } return $theme; } /** * Zwraca aktualnie ustawiony tematu * * @return string */ public function getThemeName() { return $this->getTheme()->getTheme(); } /** * Ustawia temat * * @param string $name Nazwa tematu */ public function setThemeName($name) { $theme = ThemePeer::doSelectByName($name); if (null === $theme) { $theme = new Theme(); $theme->setName($name); } $this->setTheme($theme); } public function getBaseTheme() { if (null === $this->baseTheme) { $this->baseTheme = $this->getTheme()->getBaseTheme(); } return $this->baseTheme; } public function setBaseTheme(Theme $theme) { $this->baseTheme = $theme; } /** * Ustawia podstawy temat * * @param string $theme */ public function setDefaultThemeName($name) { $theme = ThemePeer::doSelectByName($name); if (null === $theme) { $theme = new Theme(); $theme->setName($name); } $this->setBaseTheme($theme); } public function getThemeColorScheme() { return $this->getTheme()->getColorScheme(); } /** * Zwraca nazwe podstawowego tematu * * @return string */ public function getDefaultThemeName() { return $this->getBaseTheme() ? $this->getBaseTheme()->getName() : null; } /** * Ustawia układ strony * * @param string $layout Nazwa układu strony (bez rozszerzenia .html) */ public function setLayoutName($layout) { $this->layoutName = $layout; } /** * Zwraca aktualnie ustawiony układ strony * * @return string */ public function getLayoutName() { return $this->layoutName; } public function getThemeDir() { return 'frontend/theme/' . $this->getThemeName(); } public function getThemeColorSchemeDir() { return $this->getThemeDir() . '/' . $this->getThemeColorScheme(); } public function getDefaultThemeDir() { return 'frontend/theme/' . $this->getDefaultThemeName(); } public function getTemplateDir($module = null) { return sfLoader::getTemplateDir($module ? $module : $this->context->getModuleName(), null) . '/' . 'theme'; } public function getStylesheetPaths($stylesheet) { if (!isset($this->stylesheetPath[$stylesheet])) { $stylesheet_path = $this->getStylesheetPath($stylesheet); if ($stylesheet_path) { $this->stylesheetPath[$stylesheet]['default'] = $stylesheet_path; $stylesheet_path = $this->getStylesheetPath('my_' . $stylesheet); if ($stylesheet_path) { $this->stylesheetPath[$stylesheet]['my'] = $stylesheet_path; } } else { $this->stylesheetPath[$stylesheet] = null; } } return $this->stylesheetPath[$stylesheet]; } public function addStylesheet($stylesheet, $position = '', $options = array()) { $stylesheet_path = $this->getStylesheetPaths($stylesheet); if ($stylesheet_path) { $this->response->addStylesheet($stylesheet_path['default'], $position, $options); if (isset($stylesheet_path['my'])) { $this->response->addStylesheet($stylesheet_path['my'], $position, $options); } } } public function addLess($less, $position = '') { $less_path = $this->getStylesheetPaths($less); if ($less_path) { $this->response->setParameter($less_path['default'], array(), 'helper/asset/auto/less' . ($position ? '/' . $position : '')); if (isset($less_path['my'])) { $this->response->setParameter($less_path['my'], array(), 'helper/asset/auto/less' . ($position ? '/' . $position : '')); } } } /** * Get stylesheet path * @param string $stylesheet * @return string stylesheet path */ protected function getStylesheetPath($stylesheet) { return $this->findStylesheetPath($this->getTheme(), $stylesheet); } protected function findStylesheetPath(Theme $theme, $stylesheet) { if ($theme->getVersion() < 2 && $theme->getColorScheme() && is_readable($this->cssDir . '/' . $theme->getThemeColorSchemeDir() . '/' . $stylesheet)) { return $theme->getThemeColorSchemeDir() . '/' . $stylesheet; } elseif (is_readable($this->cssDir . '/' . $theme->getThemeDir() . '/' . $stylesheet)) { return $theme->getThemeDir() . '/' . $stylesheet; } elseif ($theme->hasBaseTheme()) { return $this->findStylesheetPath($theme->getBaseTheme(), $stylesheet); } return false; } /** * Dodaje plik CSS ktory zostanie zalaczony podczas wyświetlania strony * * @param string $stylesheet Nazwa pliku css umieszczonego w katalogu 'frontend/theme/nazwa_tematu' */ public static function useStylesheet($stylesheet, $position = '', $options = array()) { $context = sfContext::getInstance(); $theme = stTheme::getInstance($context); $theme->addStylesheet($stylesheet, $position, $options); } public static function getImagePath($image, $current = null) { static $processed = array(); static $theme = null; if (!isset($processed[$image])) { if (null === $theme) { $context = sfContext::getInstance(); $theme = stTheme::getInstance($context); } $instance = $current ? $current : $theme->getTheme(); $processed[$image] = $theme->findImagePath($instance, $image, !$instance->hasImage($image)); } return $processed[$image]; } public function findImagePath(Theme $theme, $image, $default = false) { if ($theme->getVersion() < 2 && $theme->getColorScheme() && is_readable(sfConfig::get('sf_web_dir') . '/images/' . $theme->getThemeColorSchemeDir() . '/' . $image)) { return $theme->getThemeColorSchemeDir() . '/' . $image; } elseif (is_readable($theme->getImagePath($image, true, $default))) { return $theme->getImagePath($image, false, $default); } elseif ($theme->hasBaseTheme()) { return $this->findImagePath($theme->getBaseTheme(), $image, $default); } return null; } public static function clearCache($clear_fast_cache = true) { $fc = new stFunctionCache('stThemePlugin'); $fc->removeAll(); if ($clear_fast_cache) { stFastCacheManager::clearCache(); } } public static function clearAssetsCache() { stWebFileManager::getInstance()->remove(sfConfig::get('sf_web_dir').'/cache/css'); stWebFileManager::getInstance()->remove(sfConfig::get('sf_web_dir').'/cache/less'); } public static function clearEditorCache() { self::clearCache(false); stWebFileManager::getInstance()->remove(sfConfig::get('sf_web_dir').'/cache/css/_editor'); stWebFileManager::getInstance()->remove(sfConfig::get('sf_web_dir').'/cache/less/_editor'); } public static function clearSmartyCache($all = false) { if ($all) { $name = '*'; } else { $name = stTheme::getInstance(sfContext::getInstance())->getThemeName(); } foreach (glob(sfConfig::get('sf_root_dir').'/cache/smarty_c/'.$name.'/*') as $file) { unlink($file); } } /** * Ustawia domyślny temat w sklepie * * @param string $name Nazwa tematu * @param boolean $isResponsive Ustawia dodatkowo temat jako responsywny * @return Theme */ public static function setActiveTheme(string $name, bool $isResponsive = true): Theme { $theme = ThemePeer::doSelectByName($name); if (null === $theme) { throw new Exception("Theme '$name' does not exists."); } $theme->setIsResponsive($isResponsive); $theme->setActive(true); $theme->save(); ThemePeer::updateThemeImageConfiguration($theme); return $theme; } public static function is_responsive() { $themeVersion = stTheme::getInstance(sfContext::getInstance())->getTheme()->getVersion(); if($themeVersion >= 7){ return true; }else{ return false; } } public static function hideOldConfiguration() { if (null === self::$hideOldConfiguration) { $theme = ThemePeer::doSelectActive(); $mobile = null; $id = stConfig::getInstance('stThemeBackend')->get('responsive'); if ($id) { $mobile = ThemePeer::retrieveByPKCached($id); } self::$hideOldConfiguration = $theme->getVersion() >= 7 && (!$mobile || $mobile->getVersion() >= 7); } return self::$hideOldConfiguration; } public static function is_theme8() { $themeVersion = stTheme::getInstance(sfContext::getInstance())->getTheme()->getVersion(); if($themeVersion >= 8){ return true; }else{ return false; } } public static function activeThemeName() { $themeName = stTheme::getInstance(sfContext::getInstance())->getThemeName(); return $themeName; } }