📄 installer.php
字号:
$folder = ($element->attributes('destination')) ? DS.$element->attributes('destination') : null;
$destination = JPath::clean(JPATH_ROOT.DS.'media'.$folder);
/*
* Here we set the folder we are going to copy the files from.
*
* Does the element have a folder attribute?
*
* If so this indicates that the files are in a subdirectory of the source
* folder and we should append the folder attribute to the source path when
* copying files.
*/
if ($folder = $element->attributes('folder')) {
$source = $this->getPath('source').DS.$folder;
} else {
$source = $this->getPath('source');
}
// Process each file in the $files array (children of $tagName).
foreach ($files as $file)
{
$path['src'] = $source.DS.$file->data();
$path['dest'] = $destination.DS.$file->data();
/*
* Before we can add a file to the copyfiles array we need to ensure
* that the folder we are copying our file to exits and if it doesn't,
* we need to create it.
*/
if (basename($path['dest']) != $path['dest']) {
$newdir = dirname($path['dest']);
if (!JFolder::create($newdir)) {
JError::raiseWarning(1, 'JInstaller::install: '.JText::_('Failed to create directory').' "'.$newdir.'"');
return false;
}
}
// Add the file to the copyfiles array
$copyfiles[] = $path;
}
return $this->copyFiles($copyfiles);
}
/**
* Method to parse the parameters of an extension, build the INI
* string for it's default parameters, and return the INI string.
*
* @access public
* @return string INI string of parameter values
* @since 1.5
*/
function getParams()
{
// Get the manifest document root element
$root = & $this->_manifest->document;
// Get the element of the tag names
$element =& $root->getElementByPath('params');
if (!is_a($element, 'JSimpleXMLElement') || !count($element->children())) {
// Either the tag does not exist or has no children therefore we return zero files processed.
return null;
}
// Get the array of parameter nodes to process
$params = $element->children();
if (count($params) == 0) {
// No params to process
return null;
}
// Process each parameter in the $params array.
$ini = null;
foreach ($params as $param) {
if (!$name = $param->attributes('name')) {
continue;
}
if (!$value = $param->attributes('default')) {
continue;
}
$ini .= $name."=".$value."\n";
}
return $ini;
}
/**
* Copy files from source directory to the target directory
*
* @access public
* @param array $files array with filenames
* @param boolean $overwrite True if existing files can be replaced
* @return boolean True on success
* @since 1.5
*/
function copyFiles($files, $overwrite=null)
{
/*
* To allow for manual override on the overwriting flag, we check to see if
* the $overwrite flag was set and is a boolean value. If not, use the object
* allowOverwrite flag.
*/
if (is_null($overwrite) || !is_bool($overwrite)) {
$overwrite = $this->_overwrite;
}
/*
* $files must be an array of filenames. Verify that it is an array with
* at least one file to copy.
*/
if (is_array($files) && count($files) > 0)
{
foreach ($files as $file)
{
// Get the source and destination paths
$filesource = JPath::clean($file['src']);
$filedest = JPath::clean($file['dest']);
$filetype = array_key_exists('type', $file) ? $file['type'] : 'file';
if (!file_exists($filesource)) {
/*
* The source file does not exist. Nothing to copy so set an error
* and return false.
*/
JError::raiseWarning(1, 'JInstaller::install: '.JText::sprintf('File does not exist', $filesource));
return false;
} elseif (file_exists($filedest) && !$overwrite) {
/*
* It's okay if the manifest already exists
*/
if ($this->getPath( 'manifest' ) == $filesource) {
continue;
}
/*
* The destination file already exists and the overwrite flag is false.
* Set an error and return false.
*/
JError::raiseWarning(1, 'JInstaller::install: '.JText::sprintf('WARNSAME', $filedest));
return false;
} else {
// Copy the folder or file to the new location.
if ( $filetype == 'folder') {
if (!(JFolder::copy($filesource, $filedest, null, $overwrite))) {
JError::raiseWarning(1, 'JInstaller::install: '.JText::sprintf('Failed to copy folder to', $filesource, $filedest));
return false;
}
$step = array ('type' => 'folder', 'path' => $filedest);
} else {
if (!(JFile::copy($filesource, $filedest))) {
JError::raiseWarning(1, 'JInstaller::install: '.JText::sprintf('Failed to copy file to', $filesource, $filedest));
return false;
}
$step = array ('type' => 'file', 'path' => $filedest);
}
/*
* Since we copied a file/folder, we want to add it to the installation step stack so that
* in case we have to roll back the installation we can remove the files copied.
*/
$this->_stepStack[] = $step;
}
}
} else {
/*
* The $files variable was either not an array or an empty array
*/
return false;
}
return count($files);
}
/**
* Method to parse through a files element of the installation manifest and remove
* the files that were installed
*
* @access public
* @param object $element The xml node to process
* @param int $cid Application ID of application to remove from
* @return boolean True on success
* @since 1.5
*/
function removeFiles($element, $cid=0)
{
// Initialize variables
$removefiles = array ();
$retval = true;
// Get the client info
jimport('joomla.application.helper');
$client =& JApplicationHelper::getClientInfo($cid);
if (!is_a($element, 'JSimpleXMLElement') || !count($element->children())) {
// Either the tag does not exist or has no children therefore we return zero files processed.
return true;
}
// Get the array of file nodes to process
$files = $element->children();
if (count($files) == 0) {
// No files to process
return true;
}
/*
* Here we set the folder we are going to remove the files from. There are a few
* special cases that need to be considered for certain reserved tags.
*/
switch ($element->name())
{
case 'media':
if ($element->attributes('destination')) {
$folder = $element->attributes('destination');
} else {
$folder = '';
}
$source = $client->path.DS.'media'.DS.$folder;
break;
case 'languages':
$source = $client->path.DS.'language';
break;
default:
if ($client) {
$pathname = 'extension_'.$client->name;
$source = $this->getPath($pathname);
} else {
$pathname = 'extension_root';
$source = $this->getPath($pathname);
}
break;
}
// Process each file in the $files array (children of $tagName).
foreach ($files as $file)
{
/*
* If the file is a language, we must handle it differently. Language files
* go in a subdirectory based on the language code, ie.
*
* <language tag="en_US">en_US.mycomponent.ini</language>
*
* would go in the en_US subdirectory of the languages directory.
*/
if ($file->name() == 'language' && $file->attributes('tag') != '') {
$path = $source.DS.$file->attributes('tag').DS.basename($file->data());
// If the language folder is not present, then the core pack hasn't been installed... ignore
if (!JFolder::exists(dirname($path))) {
continue;
}
} else {
$path = $source.DS.$file->data();
}
/*
* Actually delete the files/folders
*/
if (is_dir($path)) {
$val = JFolder::delete($path);
} else {
$val = JFile::delete($path);
}
if ($val === false) {
$retval = false;
}
}
return $retval;
}
/**
* Copies the installation manifest file to the extension folder in the given client
*
* @access public
* @param int $cid Where to copy the installfile [optional: defaults to 1 (admin)]
* @return boolean True on success, False on error
* @since 1.5
*/
function copyManifest($cid=1)
{
// Get the client info
jimport('joomla.application.helper');
$client =& JApplicationHelper::getClientInfo($cid);
$path['src'] = $this->getPath('manifest');
if ($client) {
$pathname = 'extension_'.$client->name;
$path['dest'] = $this->getPath($pathname).DS.basename($this->getPath('manifest'));
} else {
$pathname = 'extension_root';
$path['dest'] = $this->getPath($pathname).DS.basename($this->getPath('manifest'));
}
return $this->copyFiles(array ($path), true);
}
/**
* Tries to find the package manifest file
*
* @access private
* @return boolean True on success, False on error
* @since 1.0
*/
function _findManifest()
{
// Get an array of all the xml files from teh installation directory
$xmlfiles = JFolder::files($this->getPath('source'), '.xml$', 1, true);
// If at least one xml file exists
if (!empty($xmlfiles)) {
foreach ($xmlfiles as $file)
{
// Is it a valid joomla installation manifest file?
$manifest = $this->_isManifest($file);
if (!is_null($manifest)) {
// If the root method attribute is set to upgrade, allow file overwrite
$root =& $manifest->document;
if ($root->attributes('method') == 'upgrade') {
$this->_overwrite = true;
}
// Set the manifest object and path
$this->_manifest =& $manifest;
$this->setPath('manifest', $file);
// Set the installation source path to that of the manifest file
$this->setPath('source', dirname($file));
return true;
}
}
// None of the xml files found were valid install files
JError::raiseWarning(1, 'JInstaller::install: '.JText::_('ERRORNOTFINDJOOMLAXMLSETUPFILE'));
return false;
} else {
// No xml files were found in the install folder
JError::raiseWarning(1, 'JInstaller::install: '.JText::_('ERRORXMLSETUP'));
return false;
}
}
/**
* Is the xml file a valid Joomla installation manifest file
*
* @access private
* @param string $file An xmlfile path to check
* @return mixed A JSimpleXML document, or null if the file failed to parse
* @since 1.5
*/
function &_isManifest($file)
{
// Initialize variables
$null = null;
$xml =& JFactory::getXMLParser('Simple');
// If we cannot load the xml file return null
if (!$xml->loadFile($file)) {
// Free up xml parser memory and return null
unset ($xml);
return $null;
}
/*
* Check for a valid XML root tag.
* @todo: Remove backwards compatability in a future version
* Should be 'install', but for backward compatability we will accept 'mosinstall'.
*/
$root =& $xml->document;
if (!is_object($root) || ($root->name() != 'install' && $root->name() != 'mosinstall')) {
// Free up xml parser memory and return null
unset ($xml);
return $null;
}
// Valid manifest file return the object
return $xml;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -