public bool
parseFiles
(\SimpleXMLElement $element, mixed $cid = 0, mixed $oldFiles = null, mixed $oldMD5 = null)
/**
* Method to parse through a files element of the installation manifest and take appropriate
* action.
*
* @param \SimpleXMLElement $element The XML node to process
* @param integer $cid Application ID of application to install to
* @param array $oldFiles List of old files (SimpleXMLElement's)
* @param array $oldMD5 List of old MD5 sums (indexed by filename with value as MD5)
*
* @return boolean True on success
*
* @since 3.1
*/
public function parseFiles(\SimpleXMLElement $element, $cid = 0, $oldFiles = null, $oldMD5 = null)
{
// Get the array of file nodes to process; we checked whether this had children above.
if (!$element || !\count($element->children())) {
// Either the tag does not exist or has no children (hence no files to process) therefore we return zero files processed.
return 0;
}
$copyfiles = array();
// Get the client info
$client = ApplicationHelper::getClientInfo($cid);
/*
* Here we set the folder we are going to remove the files from.
*/
if ($client) {
$pathname = 'extension_' . $client->name;
$destination = $this->getPath($pathname);
} else {
$pathname = 'extension_root';
$destination = $this->getPath($pathname);
}
/*
* 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.
*/
$folder = (string) $element->attributes()->folder;
if ($folder && file_exists($this->getPath('source') . '/' . $folder)) {
$source = $this->getPath('source') . '/' . $folder;
} else {
$source = $this->getPath('source');
}
// Work out what files have been deleted
if ($oldFiles && $oldFiles instanceof \SimpleXMLElement) {
$oldEntries = $oldFiles->children();
if (\count($oldEntries)) {
$deletions = $this->findDeletedFiles($oldEntries, $element->children());
foreach ($deletions['folders'] as $deleted_folder) {
Folder::delete($destination . '/' . $deleted_folder);
}
foreach ($deletions['files'] as $deleted_file) {
File::delete($destination . '/' . $deleted_file);
}
}
}
$path = array();
// Copy the MD5SUMS file if it exists
if (file_exists($source . '/MD5SUMS')) {
$path['src'] = $source . '/MD5SUMS';
$path['dest'] = $destination . '/MD5SUMS';
$path['type'] = 'file';
$copyfiles[] = $path;
}
// Process each file in the $files array (children of $tagName).
foreach ($element->children() as $file) {
$path['src'] = $source . '/' . $file;
$path['dest'] = $destination . '/' . $file;
// Is this path a file or folder?
$path['type'] = $file->getName() === 'folder' ? 'folder' : 'file';
/*
* Before we can add a file to the copyfiles array we need to ensure
* that the folder we are copying our file to exists and if it doesn't,
* we need to create it.
*/
if (basename($path['dest']) !== $path['dest']) {
$newdir = \dirname($path['dest']);
if (!Folder::create($newdir)) {
Log::add(Text::sprintf('JLIB_INSTALLER_ABORT_CREATE_DIRECTORY', Text::_('JLIB_INSTALLER_INSTALL'), $newdir), Log::WARNING, 'jerror');
return false;
}
}
// Add the file to the copyfiles array
$copyfiles[] = $path;
}
return $this->copyFiles($copyfiles);
}