/** * Remove template * @param Application_Model_Models_Template $template * @return mixed */ public function delete(Application_Model_Models_Template $template) { return $this->getDbTable()->delete(array('name = ?' => $template->getName())); }
private function _applyTemplates($themeName, $remove = false) { $themePath = $this->_websiteHelper->getPath() . $this->_themesConfig['path'] . $themeName . DIRECTORY_SEPARATOR; $themeFiles = glob($themePath . '{,mobile/}*.html', GLOB_BRACE); if ($themeFiles !== false) { $themeFiles = array_map(function ($file) use($themePath) { return str_replace($themePath, '', $file); }, $themeFiles); } $themeConfig = false; $errors = array(); //check we are not missing any required template foreach ($this->_protectedTemplates as $template) { if (!in_array($template . '.html', $themeFiles)) { array_push($errors, $this->_translator->translate('Theme missing template: ') . $template); } } if (!empty($errors)) { $this->_error(join('<br />', $errors), self::REST_STATUS_BAD_REQUEST); } //trying to get theme.ini file with templates presets try { $themeConfig = parse_ini_string(Tools_Filesystem_Tools::getFile($themePath . '/' . Tools_Template_Tools::THEME_CONFIGURATION_FILE)); } catch (Exception $e) { $themeConfig = false; } $mapper = Application_Model_Mappers_TemplateMapper::getInstance(); $mapper->clearTemplates(); // this will remove all templates except system required. @see $_protectedTemplates $templateTypeTable = new Application_Model_DbTable_TemplateType(); foreach ($themeFiles as $templateFile) { $templateName = preg_replace(array('~' . DIRECTORY_SEPARATOR . '~', '~\\.html$~'), array('_', ''), $templateFile); $template = $mapper->find($templateName); if (!$template instanceof Application_Model_Models_Template) { $template = new Application_Model_Models_Template(); $template->setName($templateName); } // checking if we have template type in theme.ini or page meet mobile template naming convention if (is_array($themeConfig) && !empty($themeConfig) && array_key_exists($templateName, $themeConfig)) { $templateType = $themeConfig[$templateName]; } elseif (preg_match('~^mobile' . DIRECTORY_SEPARATOR . '~', $templateFile)) { $templateType = Application_Model_Models_Template::TYPE_MOBILE; } if (isset($templateType)) { // checking if we have this type in db or adding it $checkTypeExists = $templateTypeTable->find($templateType); if (!$checkTypeExists->count()) { $checkTypeExists = $templateTypeTable->createRow(array('id' => $templateType, 'title' => ucfirst(preg_replace('/^type/ui', '', $templateType)) . ' Template')); $checkTypeExists->save(); } unset($checkTypeExists); $template->setType($templateType); } // getting template content try { $template->setContent(Tools_Filesystem_Tools::getFile($themePath . DIRECTORY_SEPARATOR . $templateFile)); } catch (Exceptions_SeotoasterException $e) { array_push($errors, 'Can\'t read template file: ' . $templateName); } // saving template to db $mapper->save($template); unset($template, $templateName); } unset($templateTypeTable); //updating config table Application_Model_Mappers_ConfigMapper::getInstance()->save(array('currentTheme' => $themeName)); if (!empty($errors)) { $this->_error(join('<br />', $errors), self::REST_STATUS_BAD_REQUEST); } return true; }
/** * Method returns template editing screen * and saves edited template */ public function templateAction() { $templateForm = new Application_Form_Template(); $templateName = $this->getRequest()->getParam('id'); $mapper = Application_Model_Mappers_TemplateMapper::getInstance(); $currentTheme = $this->_helper->config->getConfig('currentTheme'); if (!$this->getRequest()->isPost()) { $templateForm->getElement('pageId')->setValue($this->getRequest()->getParam('pid')); if ($templateName) { $template = $mapper->find($templateName); if ($template instanceof Application_Model_Models_Template) { $templateForm->getElement('content')->setValue($template->getContent()); $templateForm->getElement('name')->setValue($template->getName()); $templateForm->getElement('id')->setValue($template->getName()); $templateForm->getElement('templateType')->setValue($template->getType()); $this->view->pagesUsingTemplate = Tools_Page_Tools::getPagesCountByTemplate($templateName); } //get template preview image try { $templatePreviewDir = $this->_websiteConfig['path'] . $this->_themeConfig['path'] . $currentTheme . DIRECTORY_SEPARATOR . $this->_themeConfig['templatePreview']; $images = Tools_Filesystem_Tools::findFilesByExtension($templatePreviewDir, '(jpg|gif|png)', false, true, false); if (isset($images[$template->getName()])) { $this->view->templatePreview = $this->_themeConfig['path'] . $currentTheme . '/' . $this->_themeConfig['templatePreview'] . $images[$template->getName()]; } } catch (Exceptions_SeotoasterException $se) { $this->view->templatePreview = 'system/images/no_preview.png'; } } } else { if ($templateForm->isValid($this->getRequest()->getPost())) { $templateData = $templateForm->getValues(); $originalName = $templateData['id']; if ($templateData['templateType'] === Application_Model_Models_Template::TYPE_MOBILE || preg_match('~^mobile_~', $templateData['name'])) { $isMobileTemplate = true; $templateData['name'] = 'mobile_' . preg_replace('~^mobile_~', '', $templateData['name']); $templateData['templateType'] = Application_Model_Models_Template::TYPE_MOBILE; } else { $isMobileTemplate = false; } //check if we received 'id' in request and try to find existing template with this id /** * @var $template Application_Model_Models_Template */ if (!empty($originalName) && null !== ($template = $mapper->find($originalName))) { $status = 'update'; // avoid renaming of system protected templates if (!in_array($template->getName(), $this->_protectedTemplates)) { $template->setOldName($originalName); $template->setName($templateData['name']); } else { // TODO throw error if trying to rename protected template } $template->setContent($templateData['content']); } else { $status = 'new'; //if ID missing and name is not exists and name is not system protected - creating new template if (in_array($templateData['name'], $this->_protectedTemplates) || null !== $mapper->find($templateData['name'])) { $this->_helper->response->response($this->_translator->translate('Template with such name already exists'), true); } $template = new Application_Model_Models_Template($templateData); } $template->setType($templateData['templateType']); // saving/updating template in db $result = $mapper->save($template); if ($result) { $this->_helper->cache->clean(false, false, array(preg_replace('/[^\\w\\d_]/', '', $template->getName()))); } // saving to file in theme folder $currentThemePath = realpath($this->_websiteConfig['path'] . $this->_themeConfig['path'] . $currentTheme); $filepath = $currentThemePath . DIRECTORY_SEPARATOR; if ($isMobileTemplate) { if (!is_dir($filepath . 'mobile')) { Tools_Filesystem_Tools::mkDir($filepath . 'mobile'); } $filepath .= preg_replace('~^mobile_~', 'mobile' . DIRECTORY_SEPARATOR, $template->getName()); } else { $filepath .= $templateData['name']; } $filepath .= '.html'; try { if ($filepath) { Tools_Filesystem_Tools::saveFile($filepath, $templateData['content']); } if ($status === 'update' && $template->getOldName() !== $template->getName()) { $oldFilename = $currentThemePath . DIRECTORY_SEPARATOR; if ($isMobileTemplate) { $oldFilename .= preg_replace('~^mobile_~', 'mobile' . DIRECTORY_SEPARATOR, $template->getOldName()); } else { $oldFilename .= $template->getOldName(); } $oldFilename .= '.html'; if (is_file($oldFilename)) { if (false === Tools_Filesystem_Tools::deleteFile($oldFilename)) { } } unset($oldFilename); } } catch (Exceptions_SeotoasterException $e) { Tools_System_Tools::debugMode() && error_log($e->getMessage()); } $this->_helper->cache->clean(Helpers_Action_Cache::KEY_PLUGINTABS, Helpers_Action_Cache::PREFIX_PLUGINTABS); $this->_helper->response->response($status, false); } else { $errorMessages = array(); $validationErrors = $templateForm->getErrors(); $messages = array('name' => array('isEmpty' => 'Template name field can\'t be empty.', 'notAlnum' => 'Template name contains characters which are non alphabetic and no digits', 'stringLengthTooLong' => 'Template name field is too long.', 'stringLengthTooShort' => 'Template name field is too short.'), 'content' => array('isEmpty' => 'Content can\'t be empty.')); foreach ($validationErrors as $element => $errors) { if (empty($errors)) { continue; } foreach ($messages[$element] as $n => $message) { if (in_array($n, $errors)) { array_push($errorMessages, $message); } } } $this->_helper->response->response($errorMessages, true); } } $this->view->helpSection = 'addtemplate'; $this->view->templateForm = $templateForm; }