/** * Returns the extension of the original file name. * * @return string */ public function getFileExtension() { if (($position = StringUtil::lastIndexOf($this->getFilename(), '.')) !== false) { return StringUtil::toLowerCase(StringUtil::substring($this->getFilename(), $position + 1)); } return ''; }
/** * Imports a style. * * @param string $filename * @param integer $packageID * @param StyleEditor $style * @return StyleEditor */ public static function import($filename, $packageID = PACKAGE_ID, StyleEditor $style = null) { // open file $tar = new Tar($filename); // get style data $data = self::readStyleData($tar); $styleData = array( 'styleName' => $data['name'], 'variables' => $data['variables'], 'styleVersion' => $data['version'], 'styleDate' => $data['date'], 'copyright' => $data['copyright'], 'license' => $data['license'], 'authorName' => $data['authorName'], 'authorURL' => $data['authorURL'] ); // create template group $templateGroupID = 0; if (!empty($data['templates'])) { $templateGroupName = $originalTemplateGroupName = $data['name']; $templateGroupFolderName = preg_replace('/[^a-z0-9_-]/i', '', $templateGroupName); if (empty($templateGroupFolderName)) $templateGroupFolderName = 'generic'.StringUtil::substring(StringUtil::getRandomID(), 0, 8); $originalTemplateGroupFolderName = $templateGroupFolderName; // get unique template pack name $i = 1; while (true) { $sql = "SELECT COUNT(*) AS count FROM wcf".WCF_N."_template_group WHERE templateGroupName = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($templateGroupName)); $row = $statement->fetchArray(); if (!$row['count']) break; $templateGroupName = $originalTemplateGroupName . '_' . $i; $i++; } // get unique folder name $i = 1; while (true) { $sql = "SELECT COUNT(*) AS count FROM wcf".WCF_N."_template_group WHERE templateGroupFolderName = ? AND parentTemplatePackID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array( FileUtil::addTrailingSlash($templateGroupFolderName), 0 )); $row = $statement->fetchArray(); if (!$row['count']) break; $templateGroupFolderName = $originalTemplateGroupFolderName . '_' . $i; $i++; } $templateGroup = TemplateGroupEditor::create(array( 'templateGroupName' => $templateGroupName, 'templateGroupFolderName' => FileUtil::addTrailingSlash($templateGroupFolderName) )); $styleData['templateGroupID'] = $templateGroup->templateGroupID; } // import preview image if (!empty($data['image'])) { $fileExtension = StringUtil::substring($data['image'], StringUtil::lastIndexOf($data['image'], '.')); $index = $tar->getIndexByFilename($data['image']); if ($index !== false) { $filename = WCF_DIR.'images/stylePreview-'.$style->styleID.'.'.$fileExtension; $tar->extract($index, $filename); @chmod($filename, 0777); if (file_exists($filename)) { $styleData['image'] = $filename; } } } // import images if (!empty($data['images']) && $data['imagesPath'] != 'images/') { // create images folder if necessary $imagesLocation = self::getFileLocation($data['imagesPath']); $styleData['imagePath'] = FileUtil::getRelativePath(WCF_DIR, $imagesLocation); $index = $tar->getIndexByFilename($data['images']); if ($index !== false) { // extract images tar $destination = FileUtil::getTemporaryFilename('images_'); $tar->extract($index, $destination); // open images tar $imagesTar = new Tar($destination); $contentList = $imagesTar->getContentList(); foreach ($contentList as $key => $val) { if ($val['type'] == 'file') { $imagesTar->extract($key, $imagesLocation.basename($val['filename'])); @chmod($imagesLocation.basename($val['filename']), 0666); } } // delete tmp file $imagesTar->close(); @unlink($destination); } } // import templates if (!empty($data['templates'])) { $index = $tar->getIndexByFilename($data['templates']); if ($index !== false) { // extract templates tar $destination = FileUtil::getTemporaryFilename('templates_'); $tar->extract($index, $destination); // open templates tar and group templates by package $templatesTar = new Tar($destination); $contentList = $templatesTar->getContentList(); $packageToTemplates = array(); foreach ($contentList as $val) { if ($val['type'] == 'file') { $folders = explode('/', $val['filename']); $packageName = array_shift($folders); if (!isset($packageToTemplates[$packageName])) { $packageToTemplates[$packageName] = array(); } $packageToTemplates[$packageName][] = array('index' => $val['index'], 'filename' => implode('/', $folders)); } } // copy templates foreach ($packageToTemplates as $package => $templates) { // try to find package $sql = "SELECT * FROM wcf".WCF_N."_package WHERE package = ? AND isApplication = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array( $package, 1 )); while ($row = $statement->fetchArray()) { // get template path $templatesDir = FileUtil::addTrailingSlash(FileUtil::getRealPath(WCF_DIR.$row['packageDir']).'templates/'.$templateGroupFolderName); // create template path if (!file_exists($templatesDir)) { @mkdir($templatesDir, 0777); @chmod($templatesDir, 0777); } // copy templates foreach ($templates as $template) { $templatesTar->extract($template['index'], $templatesDir.$template['filename']); TemplateEditor::create(array( 'packageID' => $row['packageID'], 'templateName' => StringUtil::replace('.tpl', '', $template['filename']), 'templateGroupID' => $templateGroupID )); } } } // delete tmp file $templatesTar->close(); @unlink($destination); } } $tar->close(); // save style if ($style !== null) { $style->update($styleData); } else { $styleData['packageID'] = $packageID; $style = new StyleEditor(self::create($styleData)); } // handle descriptions if (!empty($data['description'])) { self::saveLocalizedDescriptions($style, $data['description']); } if ($data['default']) { $style->setAsDefault(); } return $style; }
/** * Copies a style. * * @return array<string> */ public function copy() { // get unique style name $sql = "SELECT styleName FROM wcf".WCF_N."_style WHERE styleName LIKE ? AND styleID <> ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array( $this->styleEditor->styleName.'%', $this->styleEditor->styleID )); $numbers = array(); $regEx = new Regex('\((\d+)\)$'); while ($row = $statement->fetchArray()) { $styleName = $row['styleName']; if ($regEx->match($styleName)) { $matches = $regEx->getMatches(); // check if name matches the pattern 'styleName (x)' if ($styleName == $this->styleEditor->styleName . ' ('.$matches[1].')') { $numbers[] = $matches[1]; } } } $number = (count($numbers)) ? max($numbers) + 1 : 2; $styleName = $this->styleEditor->styleName . ' ('.$number.')'; // create the new style $newStyle = StyleEditor::create(array( 'packageID' => PACKAGE_ID, 'styleName' => $styleName, 'templateGroupID' => $this->styleEditor->templateGroupID, 'isDisabled' => 1, // newly created styles are disabled by default 'styleDescription' => $this->styleEditor->styleDescription, 'styleVersion' => $this->styleEditor->styleVersion, 'styleDate' => $this->styleEditor->styleDate, 'copyright' => $this->styleEditor->copyright, 'license' => $this->styleEditor->license, 'authorName' => $this->styleEditor->authorName, 'authorURL' => $this->styleEditor->authorURL, 'imagePath' => $this->styleEditor->imagePath )); // copy style variables $sql = "INSERT INTO wcf".WCF_N."_style_variable_value (styleID, variableID, variableValue) SELECT ".$newStyle->styleID." AS styleID, value.variableID, value.variableValue FROM wcf".WCF_N."_style_variable_value value WHERE value.styleID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array($this->styleEditor->styleID)); // copy preview image if ($this->styleEditor->image) { // get extension $fileExtension = StringUtil::substring($this->styleEditor->image, StringUtil::lastIndexOf($this->styleEditor->image, '.')); // copy existing preview image if (@copy(WCF_DIR.'images/'.$this->styleEditor->image, WCF_DIR.'images/stylePreview-'.$newStyle->styleID.$fileExtension)) { // bypass StyleEditor::update() to avoid scaling of already fitting image $sql = "UPDATE wcf".WCF_N."_style SET image = ? WHERE styleID = ?"; $statement = WCF::getDB()->prepareStatement($sql); $statement->execute(array( 'stylePreview-'.$newStyle->styleID.$fileExtension, $newStyle->styleID )); } } return array( 'redirectURL' => LinkHandler::getInstance()->getLink('StyleEdit', array('id' => $newStyle->styleID)) ); }