getTemplate()) { $temp->name = $name; $temp->id = urlencode(base64_encode($path . $name)); return $temp; } } /** * Method to get a list of all the files to edit in a template. * * @return array A nested array of relevant files. * * @since 1.6 */ public function getFiles() { $result = array(); if ($template = $this->getTemplate()) { jimport('joomla.filesystem.folder'); $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); $lang = JFactory::getLanguage(); // Load the core and/or local language file(s). $lang->load('tpl_' . $template->element, $client->path, null, false, true) || $lang->load('tpl_' . $template->element, $client->path . '/templates/' . $template->element, null, false, true); $this->element = $path; if (!is_writable($path)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_DIRECTORY_NOT_WRITABLE'), 'error'); } if (is_dir($path)) { $result = $this->getDirectoryTree($path); } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_TEMPLATE_FOLDER_NOT_FOUND'), 'error'); return false; } } return $result; } /** * Get the directory tree. * * @param string $dir The path of the directory to scan * * @return array * * @since 3.2 */ public function getDirectoryTree($dir) { $result = array(); $dirFiles = scandir($dir); foreach ($dirFiles as $key => $value) { if (!in_array($value, array(".", ".."))) { if (is_dir($dir . $value)) { $relativePath = str_replace($this->element, '', $dir . $value); $result['/' . $relativePath] = $this->getDirectoryTree($dir . $value . '/'); } else { $ext = pathinfo($dir . $value, PATHINFO_EXTENSION); $params = JComponentHelper::getParams('com_templates'); $imageTypes = explode(',', $params->get('image_formats')); $sourceTypes = explode(',', $params->get('source_formats')); $fontTypes = explode(',', $params->get('font_formats')); $archiveTypes = explode(',', $params->get('compressed_formats')); $types = array_merge($imageTypes, $sourceTypes, $fontTypes, $archiveTypes); if (in_array($ext, $types)) { $relativePath = str_replace($this->element, '', $dir); $info = $this->getFile('/' . $relativePath, $value); $result[] = $info; } } } } return $result; } /** * Method to auto-populate the model state. * * Note. Calling getState in this method will result in recursion. * * @return void * * @since 1.6 */ protected function populateState() { jimport('joomla.filesystem.file'); $app = JFactory::getApplication('administrator'); // Load the User state. $pk = $app->input->getInt('id'); $this->setState('extension.id', $pk); // Load the parameters. $params = JComponentHelper::getParams('com_templates'); $this->setState('params', $params); } /** * Method to get the template information. * * @return mixed Object if successful, false if not and internal error is set. * * @since 1.6 */ public function &getTemplate() { if (empty($this->template)) { $pk = $this->getState('extension.id'); $db = $this->getDbo(); $app = JFactory::getApplication(); // Get the template information. $query = $db->getQuery(true) ->select('extension_id, client_id, element, name, manifest_cache') ->from('#__extensions') ->where($db->quoteName('extension_id') . ' = ' . (int) $pk) ->where($db->quoteName('type') . ' = ' . $db->quote('template')); $db->setQuery($query); try { $result = $db->loadObject(); } catch (RuntimeException $e) { $app->enqueueMessage($e->getMessage(), 'warning'); $this->template = false; return false; } if (empty($result)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_EXTENSION_RECORD_NOT_FOUND'), 'error'); $this->template = false; } else { $this->template = $result; } } return $this->template; } /** * Method to check if new template name already exists * * @return boolean true if name is not used, false otherwise * * @since 2.5 */ public function checkNewName() { $db = $this->getDbo(); $query = $db->getQuery(true) ->select('COUNT(*)') ->from('#__extensions') ->where('name = ' . $db->quote($this->getState('new_name'))); $db->setQuery($query); return ($db->loadResult() == 0); } /** * Method to check if new template name already exists * * @return string name of current template * * @since 2.5 */ public function getFromName() { return $this->getTemplate()->element; } /** * Method to check if new template name already exists * * @return boolean true if name is not used, false otherwise * * @since 2.5 */ public function copy() { $app = JFactory::getApplication(); if ($template = $this->getTemplate()) { jimport('joomla.filesystem.folder'); $client = JApplicationHelper::getClientInfo($template->client_id); $fromPath = JPath::clean($client->path . '/templates/' . $template->element . '/'); // Delete new folder if it exists $toPath = $this->getState('to_path'); if (JFolder::exists($toPath)) { if (!JFolder::delete($toPath)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_COULD_NOT_WRITE'), 'error'); return false; } } // Copy all files from $fromName template to $newName folder if (!JFolder::copy($fromPath, $toPath) || !$this->fixTemplateName()) { return false; } return true; } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_INVALID_FROM_NAME'), 'error'); return false; } } /** * Method to delete tmp folder * * @return boolean true if delete successful, false otherwise * * @since 2.5 */ public function cleanup() { // Clear installation messages $app = JFactory::getApplication(); $app->setUserState('com_installer.message', ''); $app->setUserState('com_installer.extension_message', ''); // Delete temporary directory return JFolder::delete($this->getState('to_path')); } /** * Method to rename the template in the XML files and rename the language files * * @return boolean true if successful, false otherwise * * @since 2.5 */ protected function fixTemplateName() { // Rename Language files // Get list of language files $result = true; $files = JFolder::files($this->getState('to_path'), '.ini', true, true); $newName = strtolower($this->getState('new_name')); $template = $this->getTemplate(); $oldName = $template->element; $manifest = json_decode($template->manifest_cache); jimport('joomla.filesystem.file'); foreach ($files as $file) { $newFile = str_replace($oldName, $newName, $file); $result = JFile::move($file, $newFile) && $result; } // Edit XML file $xmlFile = $this->getState('to_path') . '/templateDetails.xml'; if (JFile::exists($xmlFile)) { $contents = file_get_contents($xmlFile); $pattern[] = '#\s*' . $manifest->name . '\s*#i'; $replace[] = '' . $newName . ''; $pattern[] = '##'; $replace[] = ''; $contents = preg_replace($pattern, $replace, $contents); $result = JFile::write($xmlFile, $contents) && $result; } return $result; } /** * Method to get the record form. * * @param array $data Data for the form. * @param boolean $loadData True if the form is to load its own data (default case), false if not. * * @return JForm A JForm object on success, false on failure * * @since 1.6 */ public function getForm($data = array(), $loadData = true) { $app = JFactory::getApplication(); // Codemirror or Editor None should be enabled $db = JFactory::getDbo(); $query = $db->getQuery(true) ->select('COUNT(*)') ->from('#__extensions as a') ->where( '(a.name =' . $db->quote('plg_editors_codemirror') . ' AND a.enabled = 1) OR (a.name =' . $db->quote('plg_editors_none') . ' AND a.enabled = 1)' ); $db->setQuery($query); $state = $db->loadResult(); if ((int) $state < 1) { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_EDITOR_DISABLED'), 'warning'); } // Get the form. $form = $this->loadForm('com_templates.source', 'source', array('control' => 'jform', 'load_data' => $loadData)); if (empty($form)) { return false; } return $form; } /** * Method to get the data that should be injected in the form. * * @return mixed The data for the form. * * @since 1.6 */ protected function loadFormData() { $data = $this->getSource(); $this->preprocessData('com_templates.source', $data); return $data; } /** * Method to get a single record. * * @return mixed Object on success, false on failure. * * @since 1.6 */ public function &getSource() { $app = JFactory::getApplication(); $item = new stdClass; if (!$this->template) { $this->getTemplate(); } if ($this->template) { $input = JFactory::getApplication()->input; $fileName = base64_decode($input->get('file')); $client = JApplicationHelper::getClientInfo($this->template->client_id); $filePath = JPath::clean($client->path . '/templates/' . $this->template->element . '/' . $fileName); if (file_exists($filePath)) { $item->extension_id = $this->getState('extension.id'); $item->filename = $fileName; $item->source = file_get_contents($filePath); } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_FOUND'), 'error'); } } return $item; } /** * Method to store the source file contents. * * @param array $data The source data to save. * * @return boolean True on success, false otherwise and internal error set. * * @since 1.6 */ public function save($data) { jimport('joomla.filesystem.file'); // Get the template. $template = $this->getTemplate(); if (empty($template)) { return false; } $app = JFactory::getApplication(); $fileName = base64_decode($app->input->get('file')); $client = JApplicationHelper::getClientInfo($template->client_id); $filePath = JPath::clean($client->path . '/templates/' . $template->element . '/' . $fileName); // Include the extension plugins for the save events. JPluginHelper::importPlugin('extension'); $user = get_current_user(); chown($filePath, $user); JPath::setPermissions($filePath, '0644'); // Try to make the template file writable. if (!is_writable($filePath)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_SOURCE_FILE_NOT_WRITABLE'), 'warning'); $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_PERMISSIONS' . JPath::getPermissions($filePath)), 'warning'); if (!JPath::isOwner($filePath)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_CHECK_FILE_OWNERSHIP'), 'warning'); } return false; } $return = JFile::write($filePath, $data['source']); if (!$return) { $app->enqueueMessage(JText::sprintf('COM_TEMPLATES_ERROR_FAILED_TO_SAVE_FILENAME', $fileName), 'error'); return false; } $explodeArray = explode('.', $fileName); $ext = end($explodeArray); if ($ext == 'less') { $app->enqueueMessage(JText::sprintf('COM_TEMPLATES_COMPILE_LESS', $fileName)); } return true; } /** * Get overrides folder. * * @param string $name The name of override. * @param string $path Location of override. * * @return object containing override name and path. * * @since 3.2 */ public function getOverridesFolder($name,$path) { $folder = new stdClass; $folder->name = $name; $folder->path = base64_encode($path . $name); return $folder; } /** * Get a list of overrides. * * @return array containing overrides. * * @since 3.2 */ public function getOverridesList() { if ($template = $this->getTemplate()) { $client = JApplicationHelper::getClientInfo($template->client_id); $componentPath = JPath::clean($client->path . '/components/'); $modulePath = JPath::clean($client->path . '/modules/'); $layoutPath = JPath::clean(JPATH_ROOT . '/layouts/joomla/'); $components = JFolder::folders($componentPath); foreach ($components as $component) { $viewPath = JPath::clean($componentPath . '/' . $component . '/views/'); if (file_exists($viewPath)) { $views = JFolder::folders($viewPath); foreach ($views as $view) { $result['components'][$component][] = $this->getOverridesFolder($view, $viewPath); } } } $modules = JFolder::folders($modulePath); foreach ($modules as $module) { $result['modules'][] = $this->getOverridesFolder($module, $modulePath); } $layouts = JFolder::folders($layoutPath); foreach ($layouts as $layout) { $result['layouts'][] = $this->getOverridesFolder($layout, $layoutPath); } } if (!empty($result)) { return $result; } } /** * Create overrides. * * @param string $override The override location. * * @return boolean true if override creation is successful, false otherwise * * @since 3.2 */ public function createOverride($override) { jimport('joomla.filesystem.folder'); if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $explodeArray = explode(DIRECTORY_SEPARATOR, $override); $name = end($explodeArray); $client = JApplicationHelper::getClientInfo($template->client_id); if (stristr($name, 'mod_') != false) { $htmlPath = JPath::clean($client->path . '/templates/' . $template->element . '/html/' . $name); } elseif (stristr($override, 'com_') != false) { $folderExplode = explode(DIRECTORY_SEPARATOR, $override); $size = count($folderExplode); $url = JPath::clean($folderExplode[$size - 3] . '/' . $folderExplode[$size - 1]); $htmlPath = JPath::clean($client->path . '/templates/' . $template->element . '/html/' . $url); } else { $htmlPath = JPath::clean($client->path . '/templates/' . $template->element . '/html/layouts/joomla/' . $name); } // Check Html folder, create if not exist if (!JFolder::exists($htmlPath)) { if (!JFolder::create($htmlPath)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_ERROR'), 'error'); return false; } } if (stristr($name, 'mod_') != false) { $return = $this->createTemplateOverride(JPath::clean($override . '/tmpl'), $htmlPath); } elseif (stristr($override, 'com_') != false) { $return = $this->createTemplateOverride(JPath::clean($override . '/tmpl'), $htmlPath); } else { $return = $this->createTemplateOverride($override, $htmlPath); } if ($return) { $app->enqueueMessage(JText::_('COM_TEMPLATES_OVERRIDE_CREATED') . str_replace(JPATH_ROOT, '', $htmlPath)); return true; } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_OVERRIDE_FAILED'), 'error'); return false; } } } /** * Create override folder & file * * @param string $overridePath The override location * @param string $htmlPath The html location * * @return boolean True on success. False otherwise. */ public function createTemplateOverride($overridePath, $htmlPath) { $return = false; if (empty($htmlPath) || empty($htmlPath)) { return $return; } // Get list of template folders $folders = JFolder::folders($overridePath, null, true, true); if (!empty($folders)) { foreach ($folders as $folder) { $htmlFolder = $htmlPath . str_replace($overridePath, '', $folder); if (!JFolder::exists($htmlFolder)) { JFolder::create($htmlFolder); } } } // Get list of template files (Only get *.php file for template file) $files = JFolder::files($overridePath, '.php', true, true); if (empty($files)) { return true; } foreach ($files as $file) { $overrideFilePath = str_replace($overridePath, '', $file); $htmlFilePath = $htmlPath . $overrideFilePath; if (JFile::exists($htmlFilePath)) { // Generate new unique file name base on current time $today = JFactory::getDate(); $htmlFilePath = JFile::stripExt($htmlFilePath) . '-' . $today->format('Ymd-His') . '.' . JFile::getExt($htmlFilePath); } $return = JFile::copy($file, $htmlFilePath, '', true); } return $return; } /** * Compile less using the less compiler under /build. * * @param string $input The relative location of the less file. * * @return boolean true if compilation is successful, false otherwise * * @since 3.2 */ public function compileLess($input) { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); $inFile = urldecode(base64_decode($input)); $explodeArray = explode('/', $inFile); $fileName = end($explodeArray); $outFile = reset(explode('.', $fileName)); $less = new JLess; $less->setFormatter(new JLessFormatterJoomla); try { $less->compileFile($path . $inFile, $path . 'css/' . $outFile . '.css'); return true; } catch (Exception $e) { $app->enqueueMessage($e->getMessage(), 'error'); } } } /** * Delete a particular file. * * @param string $file The relative location of the file. * * @return boolean True if file deletion is successful, false otherwise * * @since 3.2 */ public function deleteFile($file) { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); $filePath = $path . urldecode(base64_decode($file)); $return = JFile::delete($filePath); if (!$return) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_DELETE_FAIL'), 'error'); return false; } return true; } } /** * Create new file. * * @param string $name The name of file. * @param string $type The extension of the file. * @param string $location Location for the new file. * * @return boolean true if file created successfully, false otherwise * * @since 3.2 */ public function createFile($name, $type, $location) { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); if (file_exists(JPath::clean($path . '/' . $location . '/' . $name . '.' . $type))) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_EXISTS'), 'error'); return false; } if (!fopen(JPath::clean($path . '/' . $location . '/' . $name . '.' . $type), 'x')) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_CREATE_ERROR'), 'error'); return false; } return true; } } /** * Upload new file. * * @param string $file The name of the file. * @param string $location Location for the new file. * * @return boolean True if file uploaded successfully, false otherwise * * @since 3.2 */ public function uploadFile($file, $location) { jimport('joomla.filesystem.folder'); if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); $fileName = JFile::makeSafe($file['name']); $err = null; JLoader::register('TemplateHelper', JPATH_COMPONENT_ADMINISTRATOR . '/helpers/template.php'); if (!TemplateHelper::canUpload($file, $err)) { // Can't upload the file return false; } if (file_exists(JPath::clean($path . '/' . $location . '/' . $file['name']))) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_EXISTS'), 'error'); return false; } if (!JFile::upload($file['tmp_name'], JPath::clean($path . '/' . $location . '/' . $fileName))) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_UPLOAD_ERROR'), 'error'); return false; } $url = JPath::clean($location . '/' . $fileName); return $url; } } /** * Create new folder. * * @param string $name The name of the new folder. * @param string $location Location for the new folder. * * @return boolean True if override folder is created successfully, false otherwise * * @since 3.2 */ public function createFolder($name, $location) { jimport('joomla.filesystem.folder'); if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); if (file_exists(JPath::clean($path . '/' . $location . '/' . $name . '/'))) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_EXISTS'), 'error'); return false; } if (!JFolder::create(JPath::clean($path . '/' . $location . '/' . $name))) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_CREATE_ERROR'), 'error'); return false; } return true; } } /** * Delete a folder. * * @param string $location The name and location of the folder. * * @return boolean True if override folder is deleted successfully, false otherwise * * @since 3.2 */ public function deleteFolder($location) { jimport('joomla.filesystem.folder'); if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $path = JPath::clean($client->path . '/templates/' . $template->element . '/' . $location); if (!file_exists($path)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FOLDER_NOT_EXISTS'), 'error'); return false; } $return = JFolder::delete($path); if (!$return) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_DELETE_ERROR'), 'error'); return false; } return true; } } /** * Rename a file. * * @param string $file The name and location of the old file * @param string $name The new name of the file. * * @return string Encoded string containing the new file location. * * @since 3.2 */ public function renameFile($file, $name) { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); $fileName = base64_decode($file); $explodeArray = explode('.', $fileName); $type = end($explodeArray); $explodeArray = explode('/', $fileName); $newName = str_replace(end($explodeArray), $name . '.' . $type, $fileName); if (file_exists($path . $newName)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_EXISTS'), 'error'); return false; } if (!rename($path . $fileName, $path . $newName)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_RENAME_ERROR'), 'error'); return false; } return base64_encode($newName); } } /** * Get an image address, height and width. * * @return array an associative array containing image address, height and width. * * @since 3.2 */ public function getImage() { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $fileName = base64_decode($app->input->get('file')); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); if (stristr($client->path, 'administrator') == false) { $folder = '/templates/'; } else { $folder = '/administrator/templates/'; } $uri = JUri::root(true) . $folder . $template->element; if (file_exists(JPath::clean($path . $fileName))) { $JImage = new JImage(JPath::clean($path . $fileName)); $image['address'] = $uri . $fileName; $image['path'] = $fileName; $image['height'] = $JImage->getHeight(); $image['width'] = $JImage->getWidth(); } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_IMAGE_FILE_NOT_FOUND'), 'error'); return false; } return $image; } } /** * Crop an image. * * @param string $file The name and location of the file * @param string $w width. * @param string $h height. * @param string $x x-coordinate. * @param string $y y-coordinate. * * @return boolean true if image cropped successfully, false otherwise. * * @since 3.2 */ public function cropImage($file, $w, $h, $x, $y) { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $relPath = base64_decode($file); $path = JPath::clean($client->path . '/templates/' . $template->element . '/' . $relPath); $JImage = new JImage($path); try { $image = $JImage->crop($w, $h, $x, $y, true); $image->toFile($path); return true; } catch (Exception $e) { $app->enqueueMessage($e->getMessage(), 'error'); } } } /** * Resize an image. * * @param string $file The name and location of the file * @param string $width The new width of the image. * @param string $height The new height of the image. * * @return boolean true if image resize successful, false otherwise. * * @since 3.2 */ public function resizeImage($file, $width, $height) { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $relPath = base64_decode($file); $path = JPath::clean($client->path . '/templates/' . $template->element . '/' . $relPath); $JImage = new JImage($path); try { $image = $JImage->resize($width, $height, true, 1); $image->toFile($path); return true; } catch (Exception $e) { $app->enqueueMessage($e->getMessage(), 'error'); } } } /** * Template preview. * * @return object object containing the id of the template. * * @since 3.2 */ public function getPreview() { $app = JFactory::getApplication(); $db = $this->getDbo(); $query = $db->getQuery(true); $query->select('id, client_id'); $query->from('#__template_styles'); $query->where($db->quoteName('template') . ' = ' . $db->quote($this->template->element)); $db->setQuery($query); try { $result = $db->loadObject(); } catch (RuntimeException $e) { $app->enqueueMessage($e->getMessage(), 'warning'); } if (empty($result)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_EXTENSION_RECORD_NOT_FOUND'), 'warning'); } else { return $result; } } /** * Rename a file. * * @return mixed array on success, false on failure * * @since 3.2 */ public function getFont() { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $relPath = base64_decode($app->input->get('file')); $explodeArray = explode('/', $relPath); $fileName = end($explodeArray); $path = JPath::clean($client->path . '/templates/' . $template->element . '/' . $relPath); if (stristr($client->path, 'administrator') == false) { $folder = '/templates/'; } else { $folder = '/administrator/templates/'; } $uri = JUri::root(true) . $folder . $template->element; if (file_exists(JPath::clean($path))) { $font['address'] = $uri . $relPath; $font['rel_path'] = $relPath; $font['name'] = $fileName; } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FONT_FILE_NOT_FOUND'), 'error'); return false; } return $font; } } /** * Copy a file. * * @param string $newName The name of the copied file * @param string $location The final location where the file is to be copied * @param string $file The name and location of the file * * @return boolean true if image resize successful, false otherwise. * * @since 3.2 */ public function copyFile($newName, $location, $file) { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $relPath = base64_decode($file); $explodeArray = explode('.', $relPath); $ext = end($explodeArray); $path = JPath::clean($client->path . '/templates/' . $template->element . '/'); $newPath = JPath::clean($path . '/' . $location . '/' . $newName . '.' . $ext); if (file_exists($newPath)) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_EXISTS'), 'error'); return false; } if (JFile::copy($path . $relPath, $newPath)) { $app->enqueueMessage(JText::sprintf('COM_TEMPLATES_FILE_COPY_SUCCESS', $newName . '.' . $ext)); return true; } else { return false; } } } /** * Get the compressed files. * * @return array if file exists, false otherwise * * @since 3.2 */ public function getArchive() { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $relPath = base64_decode($app->input->get('file')); $path = JPath::clean($client->path . '/templates/' . $template->element . '/' . $relPath); if (file_exists(JPath::clean($path))) { $files = array(); $zip = new ZipArchive; if ($zip->open($path) === true) { for ($i = 0; $i < $zip->numFiles; $i++) { $entry = $zip->getNameIndex($i); $files[] = $entry; } } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_OPEN_FAIL'), 'error'); return false; } } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_ERROR_FONT_FILE_NOT_FOUND'), 'error'); return false; } return $files; } } /** * Extract contents of a archive file. * * @param string $file The name and location of the file * * @return boolean true if image extraction is successful, false otherwise. * * @since 3.2 */ public function extractArchive($file) { if ($template = $this->getTemplate()) { $app = JFactory::getApplication(); $client = JApplicationHelper::getClientInfo($template->client_id); $relPath = base64_decode($file); $explodeArray = explode('/', $relPath); $fileName = end($explodeArray); $folderPath = stristr($relPath, $fileName, true); $path = JPath::clean($client->path . '/templates/' . $template->element . '/' . $folderPath . '/'); if (file_exists(JPath::clean($path . '/' . $fileName))) { $zip = new ZipArchive; if ($zip->open(JPath::clean($path . '/' . $fileName)) === true) { for ($i = 0; $i < $zip->numFiles; $i++) { $entry = $zip->getNameIndex($i); if (file_exists(JPath::clean($path . '/' . $entry))) { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_EXISTS'), 'error'); return false; } } $zip->extractTo($path); return true; } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_OPEN_FAIL'), 'error'); return false; } } else { $app->enqueueMessage(JText::_('COM_TEMPLATES_FILE_ARCHIVE_NOT_FOUND'), 'error'); return false; } } } }