|
eZ Publish
[trunk]
|
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 ?>