joomla_test/administrator/components/com_templates/models/template.php

287 lines
7.3 KiB
PHP
Raw Normal View History

2020-01-02 22:20:31 +07:00
<?php
/**
* @package Joomla.Administrator
* @subpackage com_templates
*
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
/**
* @package Joomla.Administrator
* @subpackage com_templates
* @since 1.6
*/
class TemplatesModelTemplate extends JModelLegacy
{
protected $template = null;
/**
* Internal method to get file properties.
*
* @param string The base path.
* @param string The file name.
* @return object
* @since 1.6
*/
protected function getFile($path, $name)
{
$temp = new stdClass;
if ($template = $this->getTemplate())
{
$temp->name = $name;
$temp->exists = file_exists($path.$name);
$temp->id = urlencode(base64_encode($template->extension_id.':'.$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');
$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, false)
|| $lang->load('tpl_'.$template->element, $client->path.'/templates/'.$template->element, null, false, false)
|| $lang->load('tpl_'.$template->element, $client->path, $lang->getDefault(), false, false)
|| $lang->load('tpl_'.$template->element, $client->path.'/templates/'.$template->element, $lang->getDefault(), false, false);
// Check if the template path exists.
if (is_dir($path))
{
$result['main'] = array();
$result['css'] = array();
$result['clo'] = array();
$result['mlo'] = array();
$result['html'] = array();
// Handle the main PHP files.
$result['main']['index'] = $this->getFile($path, 'index.php');
$result['main']['error'] = $this->getFile($path, 'error.php');
$result['main']['print'] = $this->getFile($path, 'component.php');
$result['main']['offline'] = $this->getFile($path, 'offline.php');
// Handle the CSS files.
$files = JFolder::files($path.'/css', '\.css$', false, false);
foreach ($files as $file)
{
$result['css'][] = $this->getFile($path.'/css/', 'css/'.$file);
}
} else {
$this->setError(JText::_('COM_TEMPLATES_ERROR_TEMPLATE_FOLDER_NOT_FOUND'));
return false;
}
}
return $result;
}
/**
* Method to auto-populate the model state.
*
* Note. Calling getState in this method will result in recursion.
*
* @since 1.6
*/
protected function populateState()
{
$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();
// Get the template information.
$query = $db->getQuery(true)
->select('extension_id, client_id, element')
->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)
{
$this->setError($e->getMessage());
$this->template = false;
return false;
}
if (empty($result))
{
$this->setError(JText::_('COM_TEMPLATES_ERROR_EXTENSION_RECORD_NOT_FOUND'));
$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()
{
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))
{
JError::raiseWarning(403, JText::_('COM_TEMPLATES_ERROR_COULD_NOT_WRITE'));
return false;
}
}
// Copy all files from $fromName template to $newName folder
if (!JFolder::copy($fromPath, $toPath) || !$this->fixTemplateName())
{
return false;
}
return true;
}
else
{
JError::raiseWarning(403, JText::_('COM_TEMPLATES_ERROR_INVALID_FROM_NAME'));
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'));
$oldName = $this->getTemplate()->element;
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[] = '#<name>\s*' . $oldName . '\s*</name>#i';
$replace[] = '<name>'. $newName . '</name>';
$pattern[] = '#<language(.*)' . $oldName . '(.*)</language>#';
$replace[] = '<language${1}' . $newName . '${2}</language>';
$contents = preg_replace($pattern, $replace, $contents);
$result = JFile::write($xmlFile, $contents) && $result;
}
return $result;
}
}