eZ Publish  [4.0]
ezextensionpackagehandler.php
Go to the documentation of this file.
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 ?>