Files
2025-03-12 17:06:23 +01:00

773 lines
24 KiB
PHP

<?php
/**
* SOTESHOP/stThemePlugin
*
* Ten plik należy do aplikacji stThemePlugin opartej na licencji (Open License SOTE) Otwarta Licencja SOTE.
* Nie zmieniaj tego pliku, jeśli chcesz korzystać z automatycznych aktualizacji oprogramowania.
* Jeśli chcesz wprowadzać swoje modyfikacje do programu, zapoznaj się z dokumentacją, jak zmieniać
* oprogramowanie bez zmiany kodu bazowego http://www.sote.pl/modifications
*
* @package stThemePlugin
* @subpackage actions
* @copyright SOTE (www.sote.pl)
* @license http://www.sote.pl/license/open (Open License SOTE) Otwarta Licencja SOTE
* @version $Id: actions.class.php 256 2009-03-30 11:49:45Z marek $
*/
/**
* Klasa stThemeBackendActions
*
* @package stThemePlugin
* @subpackage actions
*/
class stThemeBackendActions extends autoStThemeBackendActions
{
protected $editorConfiguration = null;
public function executeGraphicSave()
{
$this->forward('stThemeBackend', 'graphicEdit');
}
public function executeLayoutSave()
{
$this->forward('stThemeBackend', 'layoutEdit');
}
public function executeConfig()
{
if ($this->getRequest()->getMethod() == sfRequest::POST)
{
if ($this->getRequestParameter("config[responsive]") && !stCommunication::getIsSeven())
{
return $this->redirect('@homepage');
}
stFastCacheManager::clearCache();
}
return parent::executeConfig();
}
public function validateEdit()
{
$ok = true;
if ($this->getRequest()->getMethod() == sfRequest::POST)
{
$name = $this->getRequestParameter('theme[theme]');
$ignore_themes = array('default', 'homeelectronics');
if (in_array($name, $ignore_themes))
{
$this->getRequest()->setError('theme{theme}', 'Temat nie jest kompatybilny z aktualna wersja oprogramowania');
$ok = false;
}
}
return $ok;
}
public function executeList()
{
parent::executeList();
$path = sfConfig::get('sf_root_dir').DIRECTORY_SEPARATOR.'apps'.DIRECTORY_SEPARATOR.'frontend'.DIRECTORY_SEPARATOR.'config'.DIRECTORY_SEPARATOR.'soteshop.yml';
$config = sfYaml::load($path);
$this->developerTheme = $config['all']['.view']['theme'];
}
public function executeSetDefault()
{
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), $this->getModuleName(), false);
$pk = $this->getRequestParameter('id');
$theme = ThemePeer::retrieveByPK($pk);
$theme->setActive(true);
$theme->save();
$redirect = urlencode($this->getRequest()->getReferer());
return $this->redirect('http://'.$this->getRequest()->getHost().'/frontend_theme.php/stThemeFrontend/editorMessage?redirect='.$redirect.'&default');
}
protected function applyChanges()
{
$this->theme_config = $this->getThemeConfigOrCreate();
$this->editor_config = $this->loadEditorConfiguration($this->theme_config);
$generator = new stThemeConfigGenerator($this->editor_config);
if ($this->theme_config->getTheme()->getVersion() < 7)
{
$generator->generateLess();
}
$generator->generateGraphic();
stTheme::clearCache(true);
stTheme::clearAssetsCache();
}
public function executeApplyChanges()
{
if ($this->hasRequestParameter('save'))
{
if ($this->getRequestParameter('save') == 'redirect')
{
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), $this->getModuleName(), false);
}
else
{
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), $this->getModuleName());
}
$this->applyChanges();
if ($this->getRequestParameter('save') == 'redirect')
{
$redirect = urlencode($this->getRequest()->getReferer());
return $this->redirect('http://'.$this->getRequest()->getHost().'/frontend_theme.php/stThemeFrontend/editorMessage?redirect='.$redirect.'&apply');
}
else
{
$this->setFlash('notice', $this->getContext()->getI18N()->__('Twoje zmiany zostały zastosowane do aktualnego tematu'));
return $this->redirect('stThemeBackend/applyChanges?id='.$this->theme_config->getId());
}
}
}
public function validateColorEdit()
{
$ok = true;
$this->theme_config = $this->getThemeConfigOrCreate();
$this->editor_config = $this->loadEditorConfiguration($this->theme_config);
return $ok;
}
public function validateGraphicEdit()
{
$ok = true;
$this->theme_config = $this->getThemeConfigOrCreate();
$this->editor_config = $this->loadEditorConfiguration($this->theme_config);
if ($this->getRequest()->getMethod() == sfRequest::POST)
{
$this->labels = array();
$validator = new stAssetFileValidator();
$validator->initialize($this->getContext(), array('mime_types' => '@web_images', 'required' => false));
$validator->setParameter('max_image_size', array(4096, 4096));
$files = $this->getRequest()->getFiles();
if (isset($files['theme_config']))
{
foreach ($files['theme_config']['name'] as $category => $fields)
{
foreach ($fields as $name => $value)
{
$value = $this->getRequest()->getFileValues('theme_config['.$category.']['.$name.']');
if ($value && !$validator->execute($value, $error))
{
$this->getRequest()->setError('theme_config{'.$category.'}{'.$name.'}', $error);
$ok = false;
$this->labels['theme_config{'.$category.'}{'.$name.'}'] = $this->editor_config->getGraphicCategoryLabel($category).' -> '.$this->editor_config->getGraphicFieldParameter($category, $name, 'label');
}
}
}
}
}
return $ok;
}
public function handleErrorGraphicEdit()
{
$this->updateThemeConfigFromRequest($this->theme_config, $this->editor_config);
$this->getBreadcrumbsBuilder()->getEditBreadcrumbs($this->theme_config->getTheme())->add($this->getContext()->getI18N()->__('Konfiguracja grafiki'));
return sfView::SUCCESS;
}
public function executeRestore()
{
$pk = $this->getRequestParameter('id');
$theme_config = ThemeConfigPeer::retrieveByPK($pk);
if ($this->getRequestParameter('type') == 'graphic')
{
$theme_config->restoreCss();
$theme_config->restoreImages();
}
else
{
$theme_config->restoreLess();
}
$theme_config->save();
$this->setFlash('notice', $this->getContext()->getI18N()->__('Domyślne ustawienia zostały przywrócone. Aby Twoje zmiany były widoczne po stronie sklepu kliknij "Zapisz i zastosuj"'));
stTheme::clearCache(false);
return $this->redirect($this->getRequest()->getReferer());
}
public function executeColorEdit()
{
$this->processEditForwardParameters();
if ($this->getRequest()->getMethod() == sfRequest::POST)
{
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), $this->getModuleName());
$this->updateThemeConfigFromRequest($this->theme_config, $this->editor_config);
$this->saveThemeConfig($this->theme_config, $this->editor_config);
$generator = new stThemeConfigGenerator($this->editor_config);
if (!$this->hasRequestParameter('save_and_apply'))
{
$generator->generateLess(true);
stTheme::clearCache(false);
}
else
{
$generator->generateLess();
$generator->generateGraphic();
stTheme::clearCache(true);
stTheme::clearAssetsCache();
}
if ($this->hasRequestParameter('preview_save'))
{
return $this->redirectToPreview($this->theme_config);
}
else
{
$i18n = $this->getContext()->getI18N();
if ($this->hasRequestParameter('save_and_apply'))
{
$msg = $i18n->__('Twoje zmiany zostały zapisane i zastosowane do tematu graficznego');
}
else
{
$msg = $i18n->__('Twoje zmiany zostały zapisane, aby były widoczne po stronie sklepu kliknij "Zapisz i zastosuj"');
}
$this->setFlash('notice', $msg);
return $this->redirect('stThemeBackend/colorEdit?id='.$this->theme_config->getId());
}
}
}
public function executeLayoutEdit()
{
$this->processEditForwardParameters();
$theme_config = $this->getThemeConfigOrCreate();
$i18n = $this->getContext()->getI18N();
$config = new stThemeConfig();
$config->load($theme_config);
if ($this->hasRequestParameter('restore'))
{
$theme_config->clearConfigParameter('layouts');
$theme_config->clearConfigParameter('layout_config.');
$theme_config->save();
$this->setFlash('notice', $this->getContext()->getI18N()->__('Domyślne ustawienia zostały przywrócone.'));
return $this->redirect('stThemeBackend/layoutEdit?id='.$theme_config->getId());
}
if ($this->getRequest()->getMethod() == sfRequest::POST)
{
$layout_config_request = $this->getRequestParameter('layout_config');
if (isset($layout_config_request['layout']))
{
$layouts = array();
$actions = array();
$layout_config = $config->get('layout_config');
foreach ($config->getCategories('layout_config') as $category)
{
if (isset($layout_config_request['layout'][$category]))
{
$layouts[$category] = $layout_config_request['layout'][$category];
foreach ($layout_config[$category]['actions'] as $action)
{
$actions[$action] = $layout_config_request['layout'][$category];
}
}
}
$theme_config->setConfigParameter('layouts', array(
'config' => $layouts,
'actions' => $actions,
));
}
if (isset($layout_config_request['custom']))
{
foreach ($layout_config_request['custom'] as $name => $value)
{
$theme_config->setConfigParameter('layout_config.'.$name, $value);
}
}
$theme_config->save();
ProductHasCategoryPeer::cleanCache();
stTheme::clearCache();
$msg = $i18n->__('Twoje zmiany zostały zapisane', array(), 'stAdminGeneratorPlugin');
$this->setFlash('notice', $msg);
return $this->redirect('stThemeBackend/layoutEdit?id='.$theme_config->getId());
}
$this->config = $config;
$this->theme_config = $theme_config;
$this->getBreadcrumbsBuilder()->getEditBreadcrumbs($this->theme_config->getTheme())->add($i18n->__('Konfiguracja układu'));
}
public function executeGraphicEdit()
{
$this->processEditForwardParameters();
$i18n = $this->getContext()->getI18N();
if ($this->getRequest()->getMethod() == sfRequest::POST)
{
stAuthUsersListener::checkModificationCredentials($this, $this->getRequest(), $this->getModuleName());
$this->updateThemeConfigFromRequest($this->theme_config, $this->editor_config);
$this->saveThemeConfig($this->theme_config, $this->editor_config);
$generator = new stThemeConfigGenerator($this->editor_config);
if (!$this->hasRequestParameter('save_and_apply'))
{
$generator->generateGraphic(true);
stTheme::clearCache(false);
}
else
{
if ($this->theme_config->getTheme()->getVersion() < 7)
{
$generator->generateLess();
}
$generator->generateGraphic();
stTheme::clearCache(true);
stTheme::clearAssetsCache();
}
if ($this->hasRequestParameter('preview_save'))
{
return $this->redirectToPreview($this->theme_config);
}
else
{
if ($this->hasRequestParameter('save_and_apply'))
{
$msg = $i18n->__('Twoje zmiany zostały zapisane i zastosowane do tematu graficznego');
}
else
{
$msg = $i18n->__('Twoje zmiany zostały zapisane, aby były widoczne po stronie sklepu kliknij "Zapisz i zastosuj"');
}
$this->setFlash('notice', $msg);
return $this->redirect('stThemeBackend/graphicEdit?id='.$this->theme_config->getId());
}
}
$this->getBreadcrumbsBuilder()->getEditBreadcrumbs($this->theme_config->getTheme())->add($i18n->__('Konfiguracja grafiki'));
}
protected function redirectToPreview(ThemeConfig $theme_config)
{
$culture = $this->getUser()->getCulture();
return $this->redirect('http://'.$this->getRequest()->getHost().'/frontend_theme.php?theme='.$theme_config->getTheme()->getName().'&theme_culture='.$culture);
}
protected function uploadImage(ThemeConfig $theme_config, $field_name, $prev_image)
{
$image = null;
if ($this->getRequest()->getFileError($field_name) == UPLOAD_ERR_OK)
{
$filename = $this->getRequest()->getFileName($field_name);
$fileinfo = pathinfo($filename);
$image = '_editor/preview/'.md5($filename.microtime(true)).'.'.$fileinfo['extension'];
if ($prev_image && is_file($theme_config->getTheme()->getImageDir(true).'/'.$prev_image))
{
unlink($theme_config->getTheme()->getImageDir(true).'/'.$prev_image);
}
$this->getRequest()->moveFile($field_name, $theme_config->getTheme()->getImageDir(true).'/'.$image, 0664, true, 0775);
}
return $image;
}
protected function saveThemeConfig(ThemeConfig $theme_config, stThemeEditorConfig $editor_config)
{
$files = $this->getRequest()->getFiles();
if (isset($files['theme_config']))
{
foreach ($files['theme_config']['name'] as $category => $fields)
{
foreach ($fields as $name => $value)
{
if ($editor_config->hasGraphicFieldType($category, $name, 'css') && $editor_config->hasGraphicFieldProperty($category, $name, 'background-image'))
{
$image = $this->uploadImage($theme_config, 'theme_config['.$category.']['.$name.']', $theme_config->getCss($category, $name));
if ($image)
{
$theme_config->setCss($category, $name, $image);
}
}
elseif ($editor_config->hasGraphicFieldType($category, $name, 'image'))
{
$image = $this->uploadImage($theme_config, 'theme_config['.$category.']['.$name.']', $theme_config->getImage($category, $name));
if ($image)
{
$theme_config->setImage($category, $name, $image);
}
}
}
}
}
$theme_config->save();
}
protected function loadEditorConfiguration(ThemeConfig $theme_config)
{
$editor_config = new stThemeEditorConfig();
$editor_config->load($theme_config);
return $editor_config;
}
protected function updateThemeConfigFromRequest(ThemeConfig $theme_config, stThemeEditorConfig $editor_config)
{
$request = $this->getRequestParameter('theme_config');
$theme = $theme_config->getTheme();
foreach ($request as $category => $fields)
{
foreach ($fields as $name => $value)
{
$default = $editor_config->getGraphicFieldParameter($category, $name, 'default');
if (strpos($default, 'rgb') !== false)
{
preg_match_all('/[0-9]+/', $default, $matches);
$rgb = $matches[0];
$default = ltrim(stThemeLess::rgbToHex(array(1 => $rgb[0], 2 => $rgb[1], 3 => $rgb[2])), '#');
}
if ($category == '_less')
{
if (is_array($value) && isset($value['default']))
{
$theme_config->removeLess($name);
}
else
{
$theme_config->setLess($name, $value);
}
}
elseif ($editor_config->hasGraphicFieldType($category, $name, 'css'))
{
if (is_array($value) && isset($value['restore']))
{
$theme_config->removeCssImage($category, $name);
}
elseif (is_array($value) && isset($value['default']))
{
$theme_config->removeCss($category, $name);
}
elseif ($theme->getVersion() < 7 || trim($value, '#') != $default)
{
$theme_config->setCss($category, $name, $value);
}
else
{
$theme_config->removeCss($category, $name);
}
}
elseif (is_array($value) && isset($value['restore']) && $editor_config->hasGraphicFieldType($category, $name, 'image'))
{
$theme_config->removeImage($category, $name);
}
}
}
}
protected function getThemeConfigOrCreate()
{
$theme_id = $this->getRequestParameter('id');
$theme_config = ThemeConfigPeer::retrieveByPk($theme_id);
if (null === $theme_config)
{
$theme_config = new ThemeConfig();
$theme_config->setId($theme_id);
}
return $theme_config;
}
public function saveTheme($current_theme)
{
$theme_name = preg_replace('/[^0-9a-z_\-]+/', '', strtolower($current_theme->getTheme()));
$current_theme->setTheme($theme_name);
$config = stConfig::getInstance('stThemeBackend');
if ($current_theme->getIsResponsive())
{
ThemePeer::doSimpleStoreUpdate()->save();
$config->save(true);
}
if ($this->getRequest()->getMethod() == sfRequest::POST && !$this->getRequestParameter('id') && $this->hasRequestParameter('theme[copy_theme]'))
{
$copy_theme = $this->getRequestParameter('theme[copy_theme]');
$source = ThemePeer::retrieveByPK($copy_theme);
$this->themeCopy($source, $current_theme);
}
$active_modified = $current_theme->isColumnModified(ThemePeer::ACTIVE);
parent::saveTheme($current_theme);
if ($active_modified && $current_theme->getActive())
{
ThemePeer::updateThemeImageConfiguration($current_theme);
SlideBannerPeer::clearCache();
}
}
public function handleErrorSave()
{
return $this->forward('stThemeBackend', 'edit');
}
public function executeDownloadTheme()
{
if ($this->getRequest()->hasParameter('id'))
{
$c = new Criteria();
$c->add(ThemePeer::ID, $this->getRequest()->getParameter('id'));
$theme = ThemePeer::doSelectOne($c);
if (is_object($theme))
{
$td = new stThemeDownloader($theme->getName());
$td->makePackage();
$this->setLayout(false);
$response = $this->getContext()->getResponse();
$response->setContentType('application/octet-stream');
$response->setHttpHeader('Content-Disposition', 'attachment; filename="'.$theme->getName().'.tgz"');
$this->handle = fopen($td->getPackagePath(), 'r');
}
}
}
public function executeSaveConfig()
{
if ($this->getRequest()->getMethod() == sfRequest::POST)
{
$this->config = stConfig::getInstance($this->getContext(), 'stThemeBackend');
$this->config->setFromRequest('themeBackend');
stFastCacheManager::clearCache();
$this->config->save();
$this->setFlash('notice', 'Twoje zmiany zostały zapisane');
$this->redirect('theme/configCustom');
}
}
public function executeEdit()
{
if ($this->hasFlash('copy_theme'))
{
return $this->forward('stThemeBackend', 'copyTheme');
}
return parent::executeEdit();
}
public function executeCopyTheme()
{
$this->theme = $this->getThemeOrCreate();
$this->copy_theme = $this->getFlash('copy_theme');
$this->theme_name = $this->getFlash('theme_name');
}
protected function addFiltersCriteria($c)
{
$c->add(ThemePeer::VERSION, 7, Criteria::GREATER_EQUAL);
$default2Config = stConfig::getInstance('stThemeDefault2');
if (!$default2Config->get('show')) $c->add(ThemePeer::THEME, 'default2', Criteria::NOT_EQUAL);
$c->add(ThemePeer::IS_HIDDEN, false);
}
protected function themeCopy(Theme $source, Theme $target)
{
$target->setVersion($source->getVersion());
$target->setBaseThemeId($source->getId());
$css_dir = $target->getCssDir(true);
if (!is_dir($css_dir))
{
mkdir($css_dir, 0755, true);
}
file_put_contents($css_dir.'/'.$target->getTheme().'.css', "/* Put your custom css styles here */");
foreach ($source->getThemeContents() as $current)
{
$themeContent = new ThemeContent();
$themeContent->fromArray($current->toArray());
$themeContent->setId(null);
foreach ($themeContent->getThemeContentI18ns() as $currentI18n)
{
$themeContentI18n = new ThemeContentI18n();
$themeContentI18n->fromArray($currentI18n->toArray());
$themeContent->addThemeContentI18n($themeContentI18n);
}
$themeContent->setTheme($target);
$themeContent->save();
}
$baseThemeConfig = ThemeConfigPeer::retrieveByPk($source->getId());
if(null !== $baseThemeConfig)
{
stWebFileManager::getInstance()->copy($source->getEditorImageDir(true), $target->getEditorImageDir(true));
$theme_config = $target->getThemeConfig();
$theme_config->setParameters($baseThemeConfig->getParameters());
$theme_config->save();
$editor_config = new stThemeEditorConfig();
$editor_config->load($theme_config);
$generator = new stThemeConfigGenerator($editor_config);
if ($theme_config->getTheme()->getVersion() < 7)
{
$generator->generateLess();
}
$generator->generateGraphic();
stTheme::clearCache(true);
stTheme::clearAssetsCache();
}
}
protected function getContentThemeContentOrCreate($id = 'id')
{
parent::getContentThemeContentOrCreate($id);
if ($this->theme_content->isNew())
{
$this->theme_content->setThemeId($this->forward_parameters['theme_id']);
}
if (SF_ENVIRONMENT == 'prod')
{
$this->getUser()->setParameter('hide', true, 'stThemeBackend/edit/fields/content_id');
$this->getUser()->setParameter('hide', true, 'stThemeBackend/edit/fields/name');
}
return $this->theme_content;
}
protected function addContentFiltersCriteria($c)
{
$c->add(ThemeContentPeer::THEME_ID, $this->forward_parameters['theme_id']);
return parent::addContentFiltersCriteria($c);
}
}