Back to Installer class

Method parseFiles

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.
Parameters
  • \SimpleXMLElement $element The XML node to process
  • int $cid Application ID of application to install to
  • array $oldFiles List of old files (SimpleXMLElement's)
  • array $oldMD5 List of old MD5 sums (indexed by filename with value as MD5)
Returns
  • bool True on success
Since
  • 3.1
Class: Installer
Project: Joomla

Method parseFiles - Source code

/**
 * 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);
}