eZ Publish  [trunk]
ezextensionpackagehandler.php
Go to the documentation of this file.
00001 <?php
00002 /**
00003  * File containing the eZExtensionPackageHandler class.
00004  *
00005  * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved.
00006  * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
00007  * @version //autogentag//
00008  * @package kernel
00009  */
00010 
00011 /*!
00012   \class eZExtensionPackageHandler ezextensionpackagehandler.php
00013   \brief Handles extenstions in the package system
00014 
00015 */
00016 
00017 class eZExtensionPackageHandler extends eZPackageHandler
00018 {
00019     const ERROR_EXISTS = 1;
00020 
00021     const ACTION_REPLACE = 1;
00022     const ACTION_SKIP = 2;
00023 
00024     /*!
00025      Constructor
00026     */
00027     function eZExtensionPackageHandler()
00028     {
00029         $this->eZPackageHandler( 'ezextension',
00030                                  array( 'extract-install-content' => true ) );
00031     }
00032 
00033     /*!
00034      Returns an explanation for the extension install item.
00035     */
00036     function explainInstallItem( $package, $installItem, $requestedInfo = array() )
00037     {
00038         if ( $installItem['filename'] )
00039         {
00040             $filename = $installItem['filename'];
00041             $subdirectory = $installItem['sub-directory'];
00042             if ( $subdirectory )
00043                 $filepath = $subdirectory . '/' . $filename . '.xml';
00044             else
00045                 $filepath = $filename . '.xml';
00046 
00047             $filepath = $package->path() . '/' . $filepath;
00048 
00049             $dom = $package->fetchDOMFromFile( $filepath );
00050             if ( $dom )
00051             {
00052                 $root = $dom->documentElement;
00053                 $extensionName = $root->getAttribute( 'name' );
00054                 return array( 'description' => ezpI18n::tr( 'kernel/package', 'Extension \'%extensionname\'', false,
00055                                                        array( '%extensionname' => $extensionName ) ) );
00056             }
00057         }
00058     }
00059 
00060     /*!
00061      Uninstalls extensions.
00062     */
00063     function uninstall( $package, $installType, $parameters,
00064                       $name, $os, $filename, $subdirectory,
00065                       $content, &$installParameters,
00066                       &$installData )
00067     {
00068         $extensionName = $content->getAttribute( 'name' );
00069 
00070         $siteINI = eZINI::instance();
00071         $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' ) . '/' . $extensionName;
00072 
00073         // TODO: don't delete modified files?
00074 
00075         if ( file_exists( $extensionDir ) )
00076             eZDir::recursiveDelete( $extensionDir );
00077 
00078         // Deactivate extension
00079         $siteINI = eZINI::instance( 'site.ini', 'settings/override', null, null, false, true );
00080         $selectedExtensions = $siteINI->variable( 'ExtensionSettings', "ActiveExtensions" );
00081 
00082         if ( in_array( $extensionName, $selectedExtensions ) )
00083         {
00084             $extensionsFlipped = array_flip( $selectedExtensions );
00085 
00086             $extKey = $extensionsFlipped[$extensionName];
00087             unset( $selectedExtensions[$extKey] );
00088 
00089             $siteINI->setVariable( "ExtensionSettings", "ActiveExtensions", $selectedExtensions );
00090             $siteINI->save( 'site.ini.append', '.php', false, false );
00091         }
00092 
00093         // Regenerate the autoloads to remove of no longer existing classes
00094         ezpAutoloader::updateExtensionAutoloadArray();
00095 
00096         return true;
00097     }
00098 
00099     /*!
00100      Copy extension from the package to extension repository.
00101     */
00102     function install( $package, $installType, $parameters,
00103                       $name, $os, $filename, $subdirectory,
00104                       $content, &$installParameters,
00105                       &$installData )
00106     {
00107         //$this->Package =& $package;
00108 
00109         $trans = eZCharTransform::instance();
00110         $name = $content->getAttribute( 'name' );
00111         $extensionName = $trans->transformByGroup( $name, 'urlalias' );
00112         if ( strcmp( $name, $extensionName ) !== 0 )
00113         {
00114             $description = ezpI18n::tr( 'kernel/package', 'Package contains an invalid extension name: %extensionname', false, array( '%extensionname' => $name ) );
00115             $installParameters['error'] = array( 'error_code' => false,
00116                                                  'element_id' => $name,
00117                                                  'description' => $description );
00118             return false;
00119         }
00120 
00121         $siteINI = eZINI::instance();
00122         $extensionRootDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' );
00123         $extensionDir = $extensionRootDir . '/' . $extensionName;
00124         $packageExtensionDir = $package->path() . '/' . $parameters['sub-directory'] . '/' . $extensionName;
00125 
00126         // Error: extension already exists.
00127         if ( file_exists( $extensionDir ) )
00128         {
00129             $description = ezpI18n::tr( 'kernel/package', "Extension '%extensionname' already exists.",
00130                                    false, array( '%extensionname' => $extensionName ) );
00131             $choosenAction = $this->errorChoosenAction( self::ERROR_EXISTS,
00132                                                         $installParameters, $description, $this->HandlerType );
00133             switch( $choosenAction )
00134             {
00135             case self::ACTION_SKIP:
00136                 return true;
00137 
00138             case eZPackage::NON_INTERACTIVE:
00139             case self::ACTION_REPLACE:
00140                 eZDir::recursiveDelete( $extensionDir );
00141                 break;
00142 
00143             default:
00144                 $installParameters['error'] = array( 'error_code' => self::ERROR_EXISTS,
00145                                                      'element_id' => $extensionName,
00146                                                      'description' => $description,
00147                                                      'actions' => array( self::ACTION_REPLACE => ezpI18n::tr( 'kernel/package', "Replace extension" ),
00148                                                                          self::ACTION_SKIP => ezpI18n::tr( 'kernel/package', 'Skip' ) ) );
00149                 return false;
00150             }
00151         }
00152 
00153         eZDir::mkdir( $extensionDir, false, true );
00154         eZDir::copy( $packageExtensionDir, $extensionRootDir );
00155 
00156         // Regenerate autoloads for extensions to pick up the newly created extension
00157         ezpAutoloader::updateExtensionAutoloadArray();
00158 
00159         // Activate extension
00160         $siteINI = eZINI::instance( 'site.ini', 'settings/override', null, null, false, true );
00161 
00162         if ( $siteINI->hasVariable( 'ExtensionSettings', "ActiveExtensions" ) )
00163         {
00164             $selectedExtensions = $siteINI->variable( 'ExtensionSettings', "ActiveExtensions" );
00165         }
00166         else
00167         {
00168             $selectedExtensions = array();
00169         }
00170 
00171         if ( !in_array( $extensionName, $selectedExtensions ) )
00172         {
00173             $selectedExtensions[] = $extensionName;
00174             $siteINI->setVariable( "ExtensionSettings", "ActiveExtensions", $selectedExtensions );
00175             $siteINI->save( 'site.ini.append', '.php', false, false );
00176         }
00177         return true;
00178     }
00179 
00180     function add( $packageType, $package, $cli, $parameters )
00181     {
00182         foreach ( $parameters as $extensionName )
00183         {
00184             $cli->output( 'adding extension ' . $cli->stylize( 'dir', $extensionName ) );
00185             $this->addExtension( $package, $extensionName );
00186         }
00187     }
00188 
00189     static function addExtension( $package, $extensionName )
00190     {
00191         $siteINI = eZINI::instance();
00192         $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' );
00193 
00194         $fileList = array();
00195         $sourceDir = $extensionDir . '/' . $extensionName;
00196         $targetDir = $package->path() . '/ezextension';
00197 
00198         eZDir::mkdir( $targetDir, false, true );
00199         eZDir::copy( $sourceDir, $targetDir );
00200 
00201         eZDir::recursiveList( $targetDir, '', $fileList );
00202 
00203         $doc = new DOMDocument;
00204 
00205         $packageRoot = $doc->createElement( 'extension' );
00206         $packageRoot->setAttribute( 'name', $extensionName );
00207 
00208         foreach( $fileList as $file )
00209         {
00210             $fileNode = $doc->createElement( 'file' );
00211             $fileNode->setAttribute( 'name', $file['name'] );
00212 
00213             if ( $file['path'] )
00214                 $fileNode->setAttribute( 'path', $file['path'] );
00215 
00216             $fullPath = $targetDir . $file['path'] . '/' . $file['name'];
00217             $fileNode->setAttribute( 'md5sum', $package->md5sum( $fullPath ) );
00218 
00219             if ( $file['type'] == 'dir' )
00220                  $fileNode->setAttribute( 'type', 'dir' );
00221 
00222             $packageRoot->appendChild( $fileNode );
00223             unset( $fileNode );
00224         }
00225 
00226         $filename = 'extension-' . $extensionName;
00227 
00228         $package->appendInstall( 'ezextension', false, false, true,
00229                                  $filename, 'ezextension',
00230                                  array( 'content' => $packageRoot ) );
00231         $package->appendInstall( 'ezextension', false, false, false,
00232                                  $filename, 'ezextension',
00233                                  array( 'content' => false ) );
00234     }
00235 
00236     function handleAddParameters( $packageType, $package, $cli, $arguments )
00237     {
00238         $arguments = array_unique( $arguments );
00239         $extensionsToAdd = array();
00240 
00241         $extensionList = eZDir::findSubItems( eZExtension::baseDirectory(), 'dl' );
00242 
00243         foreach ( $arguments as $argument )
00244         {
00245             if ( in_array( $argument, $extensionList ) )
00246             {
00247                 $extensionsToAdd[] = $argument;
00248             }
00249             else
00250             {
00251                 $cli->error( 'Extension ' . $cli->style( 'dir' ) . $argument .  $cli->style( 'dir-end' ) . ' not found.' );
00252                 return false;
00253             }
00254         }
00255 
00256         return $extensionsToAdd;
00257     }
00258 
00259     public $Package = null;
00260 }
00261 
00262 ?>