src/Installer/Installer.php
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 || !$element->children()->count())
		{
			// 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();

		/*
		 * Here we set the folder we are going to remove the files from.
		 */
		$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 ($oldEntries->count())
			{
				$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).
		/**
		 * @ignore
		 * @var SimpleXMLElement $file
		 */
		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 exits and if it doesn't,
			 * we need to create it.
			 */

			if (basename($path['dest']) != $path['dest'])
			{
				$newdir = dirname($path['dest']);

				if (!Folder::create($newdir))
				{
					$this->log(LogLevel::WARNING, Text::sprintf('JLIB_INSTALLER_ERROR_CREATE_DIRECTORY', $newdir));
					return false;
				}
			}

			// Add the file to the copyfiles array
			$copyfiles[] = $path;
		}

		return $this->copyFiles($copyfiles);
	}
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 || !$element->children()->count())
		{
			// 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();

		/*
		 * Here we set the folder we are going to remove the files from.
		 */
		$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 ($oldEntries->count())
			{
				$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).
		/**
		 * @ignore
		 * @var SimpleXMLElement $file
		 */
		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 exits and if it doesn't,
			 * we need to create it.
			 */

			if (basename($path['dest']) != $path['dest'])
			{
				$newdir = dirname($path['dest']);

				if (!Folder::create($newdir))
				{
					$this->log(LogLevel::WARNING, Text::sprintf('JLIB_INSTALLER_ERROR_CREATE_DIRECTORY', $newdir));
					return false;
				}
			}

			// Add the file to the copyfiles array
			$copyfiles[] = $path;
		}

		return $this->copyFiles($copyfiles);
	}
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 || ! $ element -> children ( ) -> count ( ) ) { // 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 ( ) ; /*
		 * Here we set the folder we are going to remove the files from.
		 */ $ 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 ( $ oldEntries -> count ( ) ) { $ 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). /**
		 * @ignore
		 * @var SimpleXMLElement $file
		 */ 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 exits and if it doesn't,
			 * we need to create it.
			 */ if ( basename ( $ path [ 'dest' ] ) != $ path [ 'dest' ] ) { $ newdir = dirname ( $ path [ 'dest' ] ) ; if ( ! Folder :: create ( $ newdir ) ) { $ this -> log ( LogLevel :: WARNING , Text :: sprintf ( 'JLIB_INSTALLER_ERROR_CREATE_DIRECTORY' , $ newdir ) ) ; return false ; } } // Add the file to the copyfiles array $ copyfiles [ ] = $ path ; } return $ this -> copyFiles ( $ copyfiles ) ; }
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
Method to parse through a files element of the installation manifest and take appropriate action .