|
eZ Publish
[4.0]
|
00001 <?php 00002 // 00003 // Definition of eZExtensionPackageHandler class 00004 // 00005 // Created on: <15-Dec-2005 11:15:42 ks> 00006 // 00007 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ## 00008 // SOFTWARE NAME: eZ Publish 00009 // SOFTWARE RELEASE: 4.0.x 00010 // COPYRIGHT NOTICE: Copyright (C) 1999-2008 eZ Systems AS 00011 // SOFTWARE LICENSE: GNU General Public License v2.0 00012 // NOTICE: > 00013 // This program is free software; you can redistribute it and/or 00014 // modify it under the terms of version 2.0 of the GNU General 00015 // Public License as published by the Free Software Foundation. 00016 // 00017 // This program is distributed in the hope that it will be useful, 00018 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00019 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00020 // GNU General Public License for more details. 00021 // 00022 // You should have received a copy of version 2.0 of the GNU General 00023 // Public License along with this program; if not, write to the Free 00024 // Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 00025 // MA 02110-1301, USA. 00026 // 00027 // 00028 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ## 00029 // 00030 00031 /*! \file ezextensionpackagehandler.php 00032 */ 00033 00034 /*! 00035 \class eZExtensionPackageHandler ezextensionpackagehandler.php 00036 \brief Handles extenstions in the package system 00037 00038 */ 00039 00040 //include_once( 'kernel/classes/ezcontentobject.php' ); 00041 //include_once( 'kernel/classes/ezpackagehandler.php' ); 00042 00043 class eZExtensionPackageHandler extends eZPackageHandler 00044 { 00045 const ERROR_EXISTS = 1; 00046 00047 const ACTION_REPLACE = 1; 00048 const ACTION_SKIP = 2; 00049 00050 /*! 00051 Constructor 00052 */ 00053 function eZExtensionPackageHandler() 00054 { 00055 $this->eZPackageHandler( 'ezextension', 00056 array( 'extract-install-content' => true ) ); 00057 } 00058 00059 /*! 00060 \reimp 00061 Returns an explanation for the extension install item. 00062 */ 00063 function explainInstallItem( $package, $installItem, $requestedInfo = array() ) 00064 { 00065 if ( $installItem['filename'] ) 00066 { 00067 $filename = $installItem['filename']; 00068 $subdirectory = $installItem['sub-directory']; 00069 if ( $subdirectory ) 00070 $filepath = $subdirectory . '/' . $filename . '.xml'; 00071 else 00072 $filepath = $filename . '.xml'; 00073 00074 $filepath = $package->path() . '/' . $filepath; 00075 00076 $dom =& $package->fetchDOMFromFile( $filepath ); 00077 if ( $dom ) 00078 { 00079 $root = $dom->documentElement; 00080 $extensionName = $root->getAttribute( 'name' ); 00081 return array( 'description' => ezi18n( 'kernel/package', 'Extension \'%extensionname\'', false, 00082 array( '%extensionname' => $extensionName ) ) ); 00083 } 00084 } 00085 } 00086 00087 /*! 00088 \reimp 00089 Uninstalls extensions. 00090 */ 00091 function uninstall( $package, $installType, $parameters, 00092 $name, $os, $filename, $subdirectory, 00093 $content, &$installParameters, 00094 &$installData ) 00095 { 00096 $extensionName = $content->getAttribute( 'name' ); 00097 00098 $siteINI = eZINI::instance(); 00099 $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' ) . '/' . $extensionName; 00100 00101 // TODO: don't delete modified files? 00102 00103 if ( file_exists( $extensionDir ) ) 00104 eZDir::recursiveDelete( $extensionDir ); 00105 00106 // Deactivate extension 00107 $siteINI = eZINI::instance( 'site.ini', 'settings/override', null, null, false, true ); 00108 $selectedExtensions = $siteINI->variable( 'ExtensionSettings', "ActiveExtensions" ); 00109 00110 if ( in_array( $extensionName, $selectedExtensions ) ) 00111 { 00112 $extensionsFlipped = array_flip( $selectedExtensions ); 00113 00114 $extKey = $extensionsFlipped[$extensionName]; 00115 unset( $selectedExtensions[$extKey] ); 00116 00117 $siteINI->setVariable( "ExtensionSettings", "ActiveExtensions", $selectedExtensions ); 00118 $siteINI->save( 'site.ini.append', '.php', false, false ); 00119 } 00120 00121 return true; 00122 } 00123 00124 /*! 00125 \reimp 00126 Copy extension from the package to extension repository. 00127 */ 00128 function install( $package, $installType, $parameters, 00129 $name, $os, $filename, $subdirectory, 00130 $content, &$installParameters, 00131 &$installData ) 00132 { 00133 //$this->Package =& $package; 00134 00135 $trans = eZCharTransform::instance(); 00136 $name = $content->getAttribute( 'name' ); 00137 $extensionName = $trans->transformByGroup( $name, 'urlalias' ); 00138 if ( strcmp( $name, $extensionName ) !== 0 ) 00139 { 00140 $description = ezi18n( 'kernel/package', 'Package contains an invalid extension name: %extensionname', false, array( '%extensionname' => $name ) ); 00141 $installParameters['error'] = array( 'error_code' => false, 00142 'element_id' => $name, 00143 'description' => $description ); 00144 return false; 00145 } 00146 00147 $siteINI = eZINI::instance(); 00148 $extensionRootDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' ); 00149 $extensionDir = $extensionRootDir . '/' . $extensionName; 00150 $packageExtensionDir = $package->path() . '/' . $parameters['sub-directory'] . '/' . $extensionName; 00151 00152 // Error: extension already exists. 00153 if ( file_exists( $extensionDir ) ) 00154 { 00155 $description = ezi18n( 'kernel/package', "Extension '%extensionname' already exists.", 00156 false, array( '%extensionname' => $extensionName ) ); 00157 $choosenAction = $this->errorChoosenAction( self::ERROR_EXISTS, 00158 $installParameters, $description, $this->HandlerType ); 00159 switch( $choosenAction ) 00160 { 00161 case self::ACTION_SKIP: 00162 return true; 00163 00164 case eZPackage::NON_INTERACTIVE: 00165 case self::ACTION_REPLACE: 00166 eZDir::recursiveDelete( $extensionDir ); 00167 break; 00168 00169 default: 00170 $installParameters['error'] = array( 'error_code' => self::ERROR_EXISTS, 00171 'element_id' => $extensionName, 00172 'description' => $description, 00173 'actions' => array( self::ACTION_REPLACE => ezi18n( 'kernel/package', "Replace extension" ), 00174 self::ACTION_SKIP => ezi18n( 'kernel/package', 'Skip' ) ) ); 00175 return false; 00176 } 00177 } 00178 00179 eZDir::mkdir( $extensionDir, false, true ); 00180 eZDir::copy( $packageExtensionDir, $extensionRootDir ); 00181 00182 // Activate extension 00183 $siteINI = eZINI::instance( 'site.ini', 'settings/override', null, null, false, true ); 00184 00185 if ( $siteINI->hasVariable( 'ExtensionSettings', "ActiveExtensions" ) ) 00186 { 00187 $selectedExtensions = $siteINI->variable( 'ExtensionSettings', "ActiveExtensions" ); 00188 } 00189 else 00190 { 00191 $selectedExtensions = array(); 00192 } 00193 00194 if ( !in_array( $extensionName, $selectedExtensions ) ) 00195 { 00196 $selectedExtensions[] = $extensionName; 00197 $siteINI->setVariable( "ExtensionSettings", "ActiveExtensions", $selectedExtensions ); 00198 $siteINI->save( 'site.ini.append', '.php', false, false ); 00199 } 00200 return true; 00201 } 00202 00203 /*! 00204 \reimp 00205 */ 00206 function add( $packageType, $package, $cli, $parameters ) 00207 { 00208 //include_once( 'lib/ezutils/classes/ezini.php' ); 00209 //include_once( 'lib/ezfile/classes/ezdir.php' ); 00210 00211 // code taken from eZExtensionPackageCreator 00212 $siteINI = eZINI::instance(); 00213 $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' ); 00214 00215 foreach ( $parameters as $extensionName ) 00216 { 00217 $cli->output( 'adding extension ' . $cli->style( 'dir' ) . $extensionName . $cli->style( 'dir-end' ) ); 00218 00219 $fileList = array(); 00220 $sourceDir = $extensionDir . '/' . $extensionName; 00221 $targetDir = $package->path() . '/ezextension'; 00222 00223 eZDir::mkdir( $targetDir, false, true ); 00224 eZDir::copy( $sourceDir, $targetDir ); 00225 00226 eZDir::recursiveList( $targetDir, '', $fileList ); 00227 00228 $doc = new DOMDocument; 00229 00230 $packageRoot = $doc->createElement( 'extension' ); 00231 $packageRoot->setAttribute( 'name', $extensionName ); 00232 00233 foreach( $fileList as $file ) 00234 { 00235 $fileNode = $doc->createElement( 'file' ); 00236 $fileNode->setAttribute( 'name', $file['name'] ); 00237 00238 if ( $file['path'] ) 00239 $fileNode->setAttribute( 'path', $file['path'] ); 00240 00241 $fullPath = $targetDir . $file['path'] . '/' . $file['name']; 00242 $fileNode->setAttribute( 'md5sum', $package->md5sum( $fullPath ) ); 00243 00244 if ( $file['type'] == 'dir' ) 00245 $fileNode->setAttribute( 'type', 'dir' ); 00246 00247 $packageRoot->appendChild( $fileNode ); 00248 unset( $fileNode ); 00249 } 00250 00251 $filename = 'extension-' . $extensionName; 00252 00253 $package->appendInstall( 'ezextension', false, false, true, 00254 $filename, 'ezextension', 00255 array( 'content' => $packageRoot ) ); 00256 $package->appendInstall( 'ezextension', false, false, false, 00257 $filename, 'ezextension', 00258 array( 'content' => false ) ); 00259 } 00260 } 00261 00262 /*! 00263 \reimp 00264 */ 00265 function handleAddParameters( $packageType, $package, $cli, $arguments ) 00266 { 00267 $arguments = array_unique( $arguments ); 00268 $extensionsToAdd = array(); 00269 00270 //include_once( 'lib/ezutils/classes/ezini.php' ); 00271 //include_once( 'lib/ezfile/classes/ezdir.php' ); 00272 $siteINI = eZINI::instance(); 00273 $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' ); 00274 $extensionList = eZDir::findSubItems( $extensionDir ); 00275 00276 foreach ( $arguments as $argument ) 00277 { 00278 if ( in_array( $argument, $extensionList ) ) 00279 { 00280 $extensionsToAdd[] = $argument; 00281 } 00282 else 00283 { 00284 $cli->error( 'Extension ' . $cli->style( 'dir' ) . $argument . $cli->style( 'dir-end' ) . ' not found.' ); 00285 return false; 00286 } 00287 } 00288 00289 return $extensionsToAdd; 00290 } 00291 00292 public $Package = null; 00293 } 00294 00295 ?>