API16

JInstaller/parseFiles

From Joomla! Documentation

< API16:JInstaller

The "API16" namespace is an archived namespace. This page contains information for a Joomla! version which is no longer supported. It exists only as a historical reference, it will not be improved and its content may be incomplete and/or contain broken links.

Description[edit]

Method to parse through a files element of the installation manifest and take appropriate action.


<! removed transcluded page call, red link never existed >

Syntax[edit]

parseFiles($element, $cid=0, $oldFiles=null, $oldMD5=null)
Parameter Name Default Value Description
$element $element The xml node to process
$cid 0 $cid Application ID of application to install to
$oldFiles null List of old files (JXMLElement's)
$oldMD5 null List of old MD5 sums (indexed by filename with value as MD5)

Returns[edit]

boolean True on success

Defined in[edit]

libraries/joomla/installer/installer.php

Importing[edit]

jimport( 'joomla.installer.installer' );

Source Body[edit]

public function parseFiles($element, $cid=0, $oldFiles=null, $oldMD5=null)
{
        // Get the array of file nodes to process; we checked this had children above
        if ( ! is_a($element, 'JXMLElement') || ! 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;
        }

        // Initialise variables.
        $copyfiles = array ();

        // Get the client info
        jimport('joomla.application.helper');
        $client = &JApplicationHelper::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').DS.$folder))
        {
                $source = $this->getPath('source').DS.$folder;
        }
        else {
                $source = $this->getPath('source');
        }

        // Work out what files have been deleted
        if ($oldFiles && is_a($oldFiles, 'JXMLElement'))
        {
                $oldEntries = $oldFiles->children();
                if (count($oldEntries))
                {
                        $deletions = $this->findDeletedFiles($oldEntries, $element);
                        foreach ($deletions['folders'] as $deleted_folder) {
                                JFolder::delete($destination.DS.$deleted_folder);
                        }
                        foreach ($deletions['files'] as $deleted_file) {
                                JFile::delete($destination.DS.$deleted_file);
                        }
                }
        }

        // Copy the MD5SUMS file if it exists
        if (file_exists($source.DS.'MD5SUMS'))
        {
                $path['src'] = $source.DS.'MD5SUMS';
                $path['dest'] = $destination.DS.'MD5SUMS';
                $path['type'] = 'file';
                $copyfiles[] = $path;
        }

        // Process each file in the $files array (children of $tagName).
        foreach ($element->children() as $file)
        {
                $path['src']    = $source.DS.$file;
                $path['dest']   = $destination.DS.$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 (!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);
}


<! removed transcluded page call, red link never existed >

Examples[edit]

Code Examples[edit]