- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / classes / packagehandlers / ezextension / ezextensionpackagehandler.php
1 <?php
2 //
3 // Definition of eZExtensionPackageHandler class
4 //
5 // Created on: <15-Dec-2005 11:15:42 ks>
6 //
7 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
8 // SOFTWARE NAME: eZ Publish
9 // SOFTWARE RELEASE: 4.1.x
10 // COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
11 // SOFTWARE LICENSE: GNU General Public License v2.0
12 // NOTICE: >
13 //   This program is free software; you can redistribute it and/or
14 //   modify it under the terms of version 2.0  of the GNU General
15 //   Public License as published by the Free Software Foundation.
16 //
17 //   This program is distributed in the hope that it will be useful,
18 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
19 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
20 //   GNU General Public License for more details.
21 //
22 //   You should have received a copy of version 2.0 of the GNU General
23 //   Public License along with this program; if not, write to the Free
24 //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
25 //   MA 02110-1301, USA.
26 //
27 //
28 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
29 //
30
31 /*! \file
32 */
33
34 /*!
35   \class eZExtensionPackageHandler ezextensionpackagehandler.php
36   \brief Handles extenstions in the package system
37
38 */
39
40 class eZExtensionPackageHandler extends eZPackageHandler
41 {
42     const ERROR_EXISTS = 1;
43
44     const ACTION_REPLACE = 1;
45     const ACTION_SKIP = 2;
46
47     /*!
48      Constructor
49     */
50     function eZExtensionPackageHandler()
51     {
52         $this->eZPackageHandler( 'ezextension',
53                                  array( 'extract-install-content' => true ) );
54     }
55
56     /*!
57      Returns an explanation for the extension install item.
58     */
59     function explainInstallItem( $package, $installItem, $requestedInfo = array() )
60     {
61         if ( $installItem['filename'] )
62         {
63             $filename = $installItem['filename'];
64             $subdirectory = $installItem['sub-directory'];
65             if ( $subdirectory )
66                 $filepath = $subdirectory . '/' . $filename . '.xml';
67             else
68                 $filepath = $filename . '.xml';
69
70             $filepath = $package->path() . '/' . $filepath;
71
72             $dom = $package->fetchDOMFromFile( $filepath );
73             if ( $dom )
74             {
75                 $root = $dom->documentElement;
76                 $extensionName = $root->getAttribute( 'name' );
77                 return array( 'description' => ezpI18n::translate( 'kernel/package', 'Extension \'%extensionname\'', false,
78                                                        array( '%extensionname' => $extensionName ) ) );
79             }
80         }
81     }
82
83     /*!
84      Uninstalls extensions.
85     */
86     function uninstall( $package, $installType, $parameters,
87                       $name, $os, $filename, $subdirectory,
88                       $content, &$installParameters,
89                       &$installData )
90     {
91         $extensionName = $content->getAttribute( 'name' );
92
93         $siteINI = eZINI::instance();
94         $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' ) . '/' . $extensionName;
95
96         // TODO: don't delete modified files?
97
98         if ( file_exists( $extensionDir ) )
99             eZDir::recursiveDelete( $extensionDir );
100
101         // Deactivate extension
102         $siteINI = eZINI::instance( 'site.ini', 'settings/override', null, null, false, true );
103         $selectedExtensions = $siteINI->variable( 'ExtensionSettings', "ActiveExtensions" );
104
105         if ( in_array( $extensionName, $selectedExtensions ) )
106         {
107             $extensionsFlipped = array_flip( $selectedExtensions );
108
109             $extKey = $extensionsFlipped[$extensionName];
110             unset( $selectedExtensions[$extKey] );
111
112             $siteINI->setVariable( "ExtensionSettings", "ActiveExtensions", $selectedExtensions );
113             $siteINI->save( 'site.ini.append', '.php', false, false );
114         }
115
116         // Regenerate the autoloads to remove of no longer existing classes
117         ezpAutoloader::updateExtensionAutoloadArray();
118
119         return true;
120     }
121
122     /*!
123      Copy extension from the package to extension repository.
124     */
125     function install( $package, $installType, $parameters,
126                       $name, $os, $filename, $subdirectory,
127                       $content, &$installParameters,
128                       &$installData )
129     {
130         //$this->Package =& $package;
131
132         $trans = eZCharTransform::instance();
133         $name = $content->getAttribute( 'name' );
134         $extensionName = $trans->transformByGroup( $name, 'urlalias' );
135         if ( strcmp( $name, $extensionName ) !== 0 )
136         {
137             $description = ezpI18n::translate( 'kernel/package', 'Package contains an invalid extension name: %extensionname', false, array( '%extensionname' => $name ) );
138             $installParameters['error'] = array( 'error_code' => false,
139                                                  'element_id' => $name,
140                                                  'description' => $description );
141             return false;
142         }
143
144         $siteINI = eZINI::instance();
145         $extensionRootDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' );
146         $extensionDir = $extensionRootDir . '/' . $extensionName;
147         $packageExtensionDir = $package->path() . '/' . $parameters['sub-directory'] . '/' . $extensionName;
148
149         // Error: extension already exists.
150         if ( file_exists( $extensionDir ) )
151         {
152             $description = ezpI18n::translate( 'kernel/package', "Extension '%extensionname' already exists.",
153                                    false, array( '%extensionname' => $extensionName ) );
154             $choosenAction = $this->errorChoosenAction( self::ERROR_EXISTS,
155                                                         $installParameters, $description, $this->HandlerType );
156             switch( $choosenAction )
157             {
158             case self::ACTION_SKIP:
159                 return true;
160
161             case eZPackage::NON_INTERACTIVE:
162             case self::ACTION_REPLACE:
163                 eZDir::recursiveDelete( $extensionDir );
164                 break;
165
166             default:
167                 $installParameters['error'] = array( 'error_code' => self::ERROR_EXISTS,
168                                                      'element_id' => $extensionName,
169                                                      'description' => $description,
170                                                      'actions' => array( self::ACTION_REPLACE => ezpI18n::translate( 'kernel/package', "Replace extension" ),
171                                                                          self::ACTION_SKIP => ezpI18n::translate( 'kernel/package', 'Skip' ) ) );
172                 return false;
173             }
174         }
175
176         eZDir::mkdir( $extensionDir, false, true );
177         eZDir::copy( $packageExtensionDir, $extensionRootDir );
178
179         // Regenerate autoloads for extensions to pick up the newly created extension
180         ezpAutoloader::updateExtensionAutoloadArray();
181
182         // Activate extension
183         $siteINI = eZINI::instance( 'site.ini', 'settings/override', null, null, false, true );
184
185         if ( $siteINI->hasVariable( 'ExtensionSettings', "ActiveExtensions" ) )
186         {
187             $selectedExtensions = $siteINI->variable( 'ExtensionSettings', "ActiveExtensions" );
188         }
189         else
190         {
191             $selectedExtensions = array();
192         }
193
194         if ( !in_array( $extensionName, $selectedExtensions ) )
195         {
196             $selectedExtensions[] = $extensionName;
197             $siteINI->setVariable( "ExtensionSettings", "ActiveExtensions", $selectedExtensions );
198             $siteINI->save( 'site.ini.append', '.php', false, false );
199         }
200         return true;
201     }
202
203     function add( $packageType, $package, $cli, $parameters )
204     {
205         foreach ( $parameters as $extensionName )
206         {
207             $cli->output( 'adding extension ' . $cli->stylize( 'dir', $extensionName ) );
208             $this->addExtension( $package, $extensionName );
209         }
210     }
211
212     static function addExtension( $package, $extensionName )
213     {
214         $siteINI = eZINI::instance();
215         $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' );
216
217         $fileList = array();
218         $sourceDir = $extensionDir . '/' . $extensionName;
219         $targetDir = $package->path() . '/ezextension';
220
221         eZDir::mkdir( $targetDir, false, true );
222         eZDir::copy( $sourceDir, $targetDir );
223
224         eZDir::recursiveList( $targetDir, '', $fileList );
225
226         $doc = new DOMDocument;
227
228         $packageRoot = $doc->createElement( 'extension' );
229         $packageRoot->setAttribute( 'name', $extensionName );
230
231         foreach( $fileList as $file )
232         {
233             $fileNode = $doc->createElement( 'file' );
234             $fileNode->setAttribute( 'name', $file['name'] );
235
236             if ( $file['path'] )
237                 $fileNode->setAttribute( 'path', $file['path'] );
238
239             $fullPath = $targetDir . $file['path'] . '/' . $file['name'];
240             $fileNode->setAttribute( 'md5sum', $package->md5sum( $fullPath ) );
241
242             if ( $file['type'] == 'dir' )
243                  $fileNode->setAttribute( 'type', 'dir' );
244
245             $packageRoot->appendChild( $fileNode );
246             unset( $fileNode );
247         }
248
249         $filename = 'extension-' . $extensionName;
250
251         $package->appendInstall( 'ezextension', false, false, true,
252                                  $filename, 'ezextension',
253                                  array( 'content' => $packageRoot ) );
254         $package->appendInstall( 'ezextension', false, false, false,
255                                  $filename, 'ezextension',
256                                  array( 'content' => false ) );
257     }
258
259     function handleAddParameters( $packageType, $package, $cli, $arguments )
260     {
261         $arguments = array_unique( $arguments );
262         $extensionsToAdd = array();
263
264         $siteINI = eZINI::instance();
265         $extensionDir = $siteINI->variable( 'ExtensionSettings', 'ExtensionDirectory' );
266         $extensionList = eZDir::findSubItems( $extensionDir );
267
268         foreach ( $arguments as $argument )
269         {
270             if ( in_array( $argument, $extensionList ) )
271             {
272                 $extensionsToAdd[] = $argument;
273             }
274             else
275             {
276                 $cli->error( 'Extension ' . $cli->style( 'dir' ) . $argument .  $cli->style( 'dir-end' ) . ' not found.' );
277                 return false;
278             }
279         }
280
281         return $extensionsToAdd;
282     }
283
284     public $Package = null;
285 }
286
287 ?>