PageRenderTime 25ms CodeModel.GetById 21ms RepoModel.GetById 0ms app.codeStats 0ms

/kernel/classes/packagehandlers/ezextension/ezextensionpackagehandler.php

https://github.com/Yannix/ezpublish
PHP | 262 lines | 182 code | 48 blank | 32 comment | 13 complexity | 0ee05c26dad445697d7c3f06cc76b6e1 MD5 | raw file
  1. <?php
  2. /**
  3. * File containing the eZExtensionPackageHandler class.
  4. *
  5. * @copyright Copyright (C) 1999-2012 eZ Systems AS. All rights reserved.
  6. * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
  7. * @version //autogentag//
  8. * @package kernel
  9. */
  10. /*!
  11. \class eZExtensionPackageHandler ezextensionpackagehandler.php
  12. \brief Handles extenstions in the package system
  13. */
  14. class eZExtensionPackageHandler extends eZPackageHandler
  15. {
  16. const ERROR_EXISTS = 1;
  17. const ACTION_REPLACE = 1;
  18. const ACTION_SKIP = 2;
  19. /*!
  20. Constructor
  21. */
  22. function eZExtensionPackageHandler()
  23. {
  24. $this->eZPackageHandler( 'ezextension',
  25. array( 'extract-install-content' => true ) );
  26. }
  27. /*!
  28. Returns an explanation for the extension install item.
  29. */
  30. function explainInstallItem( $package, $installItem, $requestedInfo = array() )
  31. {
  32. if ( $installItem['filename'] )
  33. {
  34. $filename = $installItem['filename'];
  35. $subdirectory = $installItem['sub-directory'];
  36. if ( $subdirectory )
  37. $filepath = $subdirectory . '/' . $filename . '.xml';
  38. else
  39. $filepath = $filename . '.xml';
  40. $filepath = $package->path() . '/' . $filepath;
  41. $dom = $package->fetchDOMFromFile( $filepath );
  42. if ( $dom )
  43. {
  44. $root = $dom->documentElement;
  45. $extensionName = $root->getAttribute( 'name' );
  46. return array( 'description' => ezpI18n::tr( 'kernel/package', 'Extension \'%extensionname\'', false,
  47. array( '%extensionname' => $extensionName ) ) );
  48. }
  49. }
  50. }
  51. /*!
  52. Uninstalls extensions.
  53. */
  54. function uninstall( $package, $installType, $parameters,
  55. $name, $os, $filename, $subdirectory,
  56. $content, &$installParameters,
  57. &$installData )
  58. {
  59. $extensionName = $content->getAttribute( 'name' );
  60. $siteINI = eZINI::instance();
  61. $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' ) . '/' . $extensionName;
  62. // TODO: don't delete modified files?
  63. if ( file_exists( $extensionDir ) )
  64. eZDir::recursiveDelete( $extensionDir );
  65. // Deactivate extension
  66. $siteINI = eZINI::instance( 'site.ini', 'settings/override', null, null, false, true );
  67. $selectedExtensions = $siteINI->variable( 'ExtensionSettings', "ActiveExtensions" );
  68. if ( in_array( $extensionName, $selectedExtensions ) )
  69. {
  70. $extensionsFlipped = array_flip( $selectedExtensions );
  71. $extKey = $extensionsFlipped[$extensionName];
  72. unset( $selectedExtensions[$extKey] );
  73. $siteINI->setVariable( "ExtensionSettings", "ActiveExtensions", $selectedExtensions );
  74. $siteINI->save( 'site.ini.append', '.php', false, false );
  75. }
  76. // Regenerate the autoloads to remove of no longer existing classes
  77. ezpAutoloader::updateExtensionAutoloadArray();
  78. return true;
  79. }
  80. /*!
  81. Copy extension from the package to extension repository.
  82. */
  83. function install( $package, $installType, $parameters,
  84. $name, $os, $filename, $subdirectory,
  85. $content, &$installParameters,
  86. &$installData )
  87. {
  88. //$this->Package =& $package;
  89. $trans = eZCharTransform::instance();
  90. $name = $content->getAttribute( 'name' );
  91. $extensionName = $trans->transformByGroup( $name, 'urlalias' );
  92. if ( strcmp( $name, $extensionName ) !== 0 )
  93. {
  94. $description = ezpI18n::tr( 'kernel/package', 'Package contains an invalid extension name: %extensionname', false, array( '%extensionname' => $name ) );
  95. $installParameters['error'] = array( 'error_code' => false,
  96. 'element_id' => $name,
  97. 'description' => $description );
  98. return false;
  99. }
  100. $siteINI = eZINI::instance();
  101. $extensionRootDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' );
  102. $extensionDir = $extensionRootDir . '/' . $extensionName;
  103. $packageExtensionDir = $package->path() . '/' . $parameters['sub-directory'] . '/' . $extensionName;
  104. // Error: extension already exists.
  105. if ( file_exists( $extensionDir ) )
  106. {
  107. $description = ezpI18n::tr( 'kernel/package', "Extension '%extensionname' already exists.",
  108. false, array( '%extensionname' => $extensionName ) );
  109. $choosenAction = $this->errorChoosenAction( self::ERROR_EXISTS,
  110. $installParameters, $description, $this->HandlerType );
  111. switch( $choosenAction )
  112. {
  113. case self::ACTION_SKIP:
  114. return true;
  115. case eZPackage::NON_INTERACTIVE:
  116. case self::ACTION_REPLACE:
  117. eZDir::recursiveDelete( $extensionDir );
  118. break;
  119. default:
  120. $installParameters['error'] = array( 'error_code' => self::ERROR_EXISTS,
  121. 'element_id' => $extensionName,
  122. 'description' => $description,
  123. 'actions' => array( self::ACTION_REPLACE => ezpI18n::tr( 'kernel/package', "Replace extension" ),
  124. self::ACTION_SKIP => ezpI18n::tr( 'kernel/package', 'Skip' ) ) );
  125. return false;
  126. }
  127. }
  128. eZDir::mkdir( $extensionDir, false, true );
  129. eZDir::copy( $packageExtensionDir, $extensionRootDir );
  130. // Regenerate autoloads for extensions to pick up the newly created extension
  131. ezpAutoloader::updateExtensionAutoloadArray();
  132. // Activate extension
  133. $siteINI = eZINI::instance( 'site.ini', 'settings/override', null, null, false, true );
  134. if ( $siteINI->hasVariable( 'ExtensionSettings', "ActiveExtensions" ) )
  135. {
  136. $selectedExtensions = $siteINI->variable( 'ExtensionSettings', "ActiveExtensions" );
  137. }
  138. else
  139. {
  140. $selectedExtensions = array();
  141. }
  142. if ( !in_array( $extensionName, $selectedExtensions ) )
  143. {
  144. $selectedExtensions[] = $extensionName;
  145. $siteINI->setVariable( "ExtensionSettings", "ActiveExtensions", $selectedExtensions );
  146. $siteINI->save( 'site.ini.append', '.php', false, false );
  147. }
  148. return true;
  149. }
  150. function add( $packageType, $package, $cli, $parameters )
  151. {
  152. foreach ( $parameters as $extensionName )
  153. {
  154. $cli->output( 'adding extension ' . $cli->stylize( 'dir', $extensionName ) );
  155. $this->addExtension( $package, $extensionName );
  156. }
  157. }
  158. static function addExtension( $package, $extensionName )
  159. {
  160. $siteINI = eZINI::instance();
  161. $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' );
  162. $fileList = array();
  163. $sourceDir = $extensionDir . '/' . $extensionName;
  164. $targetDir = $package->path() . '/ezextension';
  165. eZDir::mkdir( $targetDir, false, true );
  166. eZDir::copy( $sourceDir, $targetDir );
  167. eZDir::recursiveList( $targetDir, '', $fileList );
  168. $doc = new DOMDocument;
  169. $packageRoot = $doc->createElement( 'extension' );
  170. $packageRoot->setAttribute( 'name', $extensionName );
  171. foreach( $fileList as $file )
  172. {
  173. $fileNode = $doc->createElement( 'file' );
  174. $fileNode->setAttribute( 'name', $file['name'] );
  175. if ( $file['path'] )
  176. $fileNode->setAttribute( 'path', $file['path'] );
  177. $fullPath = $targetDir . $file['path'] . '/' . $file['name'];
  178. $fileNode->setAttribute( 'md5sum', $package->md5sum( $fullPath ) );
  179. if ( $file['type'] == 'dir' )
  180. $fileNode->setAttribute( 'type', 'dir' );
  181. $packageRoot->appendChild( $fileNode );
  182. unset( $fileNode );
  183. }
  184. $filename = 'extension-' . $extensionName;
  185. $package->appendInstall( 'ezextension', false, false, true,
  186. $filename, 'ezextension',
  187. array( 'content' => $packageRoot ) );
  188. $package->appendInstall( 'ezextension', false, false, false,
  189. $filename, 'ezextension',
  190. array( 'content' => false ) );
  191. }
  192. function handleAddParameters( $packageType, $package, $cli, $arguments )
  193. {
  194. $arguments = array_unique( $arguments );
  195. $extensionsToAdd = array();
  196. $extensionList = eZDir::findSubItems( eZExtension::baseDirectory(), 'dl' );
  197. foreach ( $arguments as $argument )
  198. {
  199. if ( in_array( $argument, $extensionList ) )
  200. {
  201. $extensionsToAdd[] = $argument;
  202. }
  203. else
  204. {
  205. $cli->error( 'Extension ' . $cli->style( 'dir' ) . $argument . $cli->style( 'dir-end' ) . ' not found.' );
  206. return false;
  207. }
  208. }
  209. return $extensionsToAdd;
  210. }
  211. public $Package = null;
  212. }
  213. ?>