- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / content / history.php
1 <?php
2 //
3 // Created on: <22-Apr-2002 15:41:30 bf>
4 //
5 // ## BEGIN COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
6 // SOFTWARE NAME: eZ Publish
7 // SOFTWARE RELEASE: 4.1.x
8 // COPYRIGHT NOTICE: Copyright (C) 1999-2010 eZ Systems AS
9 // SOFTWARE LICENSE: GNU General Public License v2.0
10 // NOTICE: >
11 //   This program is free software; you can redistribute it and/or
12 //   modify it under the terms of version 2.0  of the GNU General
13 //   Public License as published by the Free Software Foundation.
14 //
15 //   This program is distributed in the hope that it will be useful,
16 //   but WITHOUT ANY WARRANTY; without even the implied warranty of
17 //   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
18 //   GNU General Public License for more details.
19 //
20 //   You should have received a copy of version 2.0 of the GNU General
21 //   Public License along with this program; if not, write to the Free
22 //   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
23 //   MA 02110-1301, USA.
24 //
25 //
26 // ## END COPYRIGHT, LICENSE AND WARRANTY NOTICE ##
27 //
28
29 require_once( 'kernel/common/template.php' );
30 $tpl = templateInit();
31 $http = eZHTTPTool::instance();
32
33 $ObjectID = $Params['ObjectID'];
34 $EditVersion = $Params['EditVersion'];
35
36 $Offset = $Params['Offset'];
37 $viewParameters = array( 'offset' => $Offset );
38
39 if ( $http->hasPostVariable( 'BackButton' )  )
40 {
41     $userRedirectURI = '';
42     if ( $http->hasPostVariable( 'RedirectURI' ) )
43     {
44         $redurectURI = $http->postVariable( 'RedirectURI' );
45         $http->removeSessionVariable( 'LastAccessesVersionURI' );
46         return $Module->redirectTo( $redurectURI );
47     }
48     if ( $http->hasSessionVariable( "LastAccessesURI" ) )
49         $userRedirectURI = $http->sessionVariable( "LastAccessesURI" );
50     return $Module->redirectTo( $userRedirectURI );
51 }
52
53 $object = eZContentObject::fetch( $ObjectID );
54
55 $editWarning = false;
56
57 $canEdit = false;
58 $canRemove = false;
59
60 if ( $object === null )
61     return $Module->handleError( eZError::KERNEL_NOT_AVAILABLE, 'kernel' );
62
63 if ( !$object->attribute( 'can_read' ) )
64     return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
65
66 if ( $object->attribute( 'can_edit' ) )
67     $canEdit = true;
68
69 $canRemove = true;
70
71 //content/diff functionality
72 //Set default values
73 $previousVersion = 1;
74 $newestVersion = 1;
75
76 //By default, set preselect the previous and most recent version for diffing
77 if ( count( $object->versions() ) > 1 )
78 {
79     $versionArray = $object->versions( false );
80     $selectableVersions = array();
81     foreach( $versionArray as $versionItem )
82     {
83         //Only return version numbers of archived or published items
84         if ( in_array( $versionItem['status'], array( 0, 1, 3 ) ) )
85         {
86             $selectableVersions[] = $versionItem['version'];
87         }
88     }
89     $newestVersion = array_pop( $selectableVersions );
90     $previousVersion = array_pop( $selectableVersions );
91 }
92
93 $tpl->setVariable( 'selectOldVersion', $previousVersion );
94 $tpl->setVariable( 'selectNewVersion', $newestVersion );
95 $tpl->setVariable( 'module', $Module );
96
97 $diff = array();
98
99 if ( $http->hasPostVariable('DiffButton') && $http->hasPostVariable( 'FromVersion' ) && $http->hasPostVariable( 'ToVersion' ) )
100 {
101     if ( !$object->attribute( 'can_diff' ) )
102         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
103
104     $lang = false;
105     if ( $http->hasPostVariable( 'Language' ) )
106     {
107         $lang = $http->postVariable( 'Language' );
108     }
109     $oldVersion = $http->postVariable( 'FromVersion' );
110     $newVersion = $http->postVariable( 'ToVersion' );
111
112     if ( is_numeric( $oldVersion ) && is_numeric( $newVersion ) )
113     {
114         $oldObject = $object->version( $oldVersion );
115         $newObject = $object->version( $newVersion );
116
117         if ( $lang )
118         {
119             $oldAttributes = $object->fetchDataMap( $oldVersion, $lang );
120             //Fallback, if desired language not available in version
121             if ( !$oldAttributes )
122             {
123                 $oldObjectLang = $oldObject->attribute( 'initial_language' );
124                 $oldAttributes = $object->fetchDataMap( $oldVersion, $oldObjectLang->attribute( 'locale' ) );
125             }
126             $newAttributes = $object->fetchDataMap( $newVersion, $lang );
127             //Fallback, if desired language not available in version
128             if ( !$newAttributes )
129             {
130                 $newObjectLang = $newObject->attribute( 'initial_language' );
131                 $newAttributes = $object->fetchDataMap( $newVersion, $newObjectLang->attribute( 'locale' ) );
132             }
133
134         }
135         else
136         {
137             $oldAttributes = $oldObject->dataMap();
138             $newAttributes = $newObject->dataMap();
139         }
140
141         //Extra options to open up for future extensions of the system.
142         $extraOptions = false;
143         if ( $http->hasPostVariable( 'ExtraOptions' ) )
144         {
145             $extraOptions = $http->postVariable( 'ExtraOptions' );
146         }
147
148         //Invoke diff method in the datatype
149         foreach ( $oldAttributes as $attribute )
150         {
151             $newAttr = $newAttributes[$attribute->attribute( 'contentclass_attribute_identifier' )];
152             $contentClassAttr = $newAttr->attribute( 'contentclass_attribute' );
153             $diff[$contentClassAttr->attribute( 'id' )] = $contentClassAttr->diff( $attribute, $newAttr, $extraOptions );
154         }
155
156         $tpl->setVariable( 'oldVersion', $oldVersion );
157         $tpl->setVariable( 'oldVersionObject', $object->version( $oldVersion ) );
158
159         $tpl->setVariable( 'newVersion', $newVersion );
160         $tpl->setVariable( 'newVersionObject', $object->version( $newVersion ) );
161         $tpl->setVariable( 'diff', $diff );
162     }
163 }
164 //content/diff end
165
166 //content/versions
167 if ( $http->hasSessionVariable( 'ExcessVersionHistoryLimit' ) )
168 {
169     $excessLimit = $http->sessionVariable( 'ExcessVersionHistoryLimit' );
170     if ( $excessLimit )
171         $editWarning = 3;
172     $http->removeSessionVariable( 'ExcessVersionHistoryLimit' );
173 }
174
175 if ( $http->hasPostVariable( 'RemoveButton' )  )
176 {
177     if ( !$canEdit )
178         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
179     if ( $http->hasPostVariable( 'DeleteIDArray' ) )
180     {
181         $db = eZDB::instance();
182         $db->begin();
183
184         $deleteIDArray = $http->postVariable( 'DeleteIDArray' );
185         $versionArray = array();
186         foreach ( $deleteIDArray as $deleteID )
187         {
188             $version = eZContentObjectVersion::fetch( $deleteID );
189             $versionArray[] = $version->attribute( 'version' );
190             if ( $version != null )
191             {
192                 if ( $version->attribute( 'can_remove' ) )
193                 {
194                     $version->removeThis();
195                 }
196             }
197         }
198         $db->commit();
199     }
200 }
201
202 $user = eZUser::currentUser();
203
204 if ( $Module->isCurrentAction( 'Edit' )  )
205 {
206     if ( !$canEdit )
207         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
208
209     $versionID = false;
210
211     if ( is_array( $Module->actionParameter( 'VersionKeyArray' ) ) )
212     {
213         $versionID = array_keys( $Module->actionParameter( 'VersionKeyArray' ) );
214         $versionID = $versionID[0];
215     }
216     else if ( $Module->hasActionParameter( 'VersionID' ) )
217         $versionID = $Module->actionParameter( 'VersionID' );
218
219     $version = $object->version( $versionID );
220     if ( !$version )
221         $versionID = false;
222
223     if ( $versionID !== false and
224          !in_array( $version->attribute( 'status' ), array( eZContentObjectVersion::STATUS_DRAFT, eZContentObjectVersion::STATUS_INTERNAL_DRAFT ) ) )
225     {
226         $editWarning = 1;
227         $EditVersion = $versionID;
228     }
229     else if ( $versionID !== false and
230               $version->attribute( 'creator_id' ) != $user->attribute( 'contentobject_id' ) )
231     {
232         $editWarning = 2;
233         $EditVersion = $versionID;
234     }
235     else
236     {
237         return $Module->redirectToView( 'edit', array( $ObjectID, $versionID, $version->initialLanguageCode() ) );
238     }
239 }
240
241 if ( $Module->isCurrentAction( 'CopyVersion' )  )
242 {
243     if ( !$canEdit )
244     {
245         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
246     }
247
248     if ( is_array( $Module->actionParameter( 'VersionKeyArray' ) ) )
249     {
250         $versionID = array_keys( $Module->actionParameter( 'VersionKeyArray' ) );
251         $versionID = $versionID[0];
252     }
253     else
254     {
255         $versionID = $Module->actionParameter( 'VersionID' );
256     }
257
258     $version = $object->version( $versionID );
259     if ( !$version )
260         $versionID = false;
261
262     // if we cannot fetch version with given versionID or if fetched version is
263     // an internal-draft then just skip copying and redirect back to the history view
264     if ( !$versionID or $version->attribute( 'status' ) == eZContentObjectVersion::STATUS_INTERNAL_DRAFT )
265     {
266         $currentVersion = $object->attribute( 'current_version' );
267         $Module->redirectToView( 'history', array( $ObjectID, $currentVersion ) );
268         return eZModule::HOOK_STATUS_CANCEL_RUN;
269     }
270
271     $languages = $Module->actionParameter( 'LanguageArray' );
272     if ( $languages && array_key_exists( $versionID, $languages ) )
273     {
274         $language = $languages[$versionID];
275     }
276     else
277     {
278         $language = $version->initialLanguageCode();
279     }
280
281     if ( !$object->checkAccess( 'edit', false, false, false, $language ) )
282     {
283         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
284     }
285
286     // Check the version limit for the object's class
287     $versionlimit = eZContentClass::versionHistoryLimit( $object->attribute( 'contentclass_id' ) );
288     $versionCount = $object->getVersionCount();
289     if ( $versionCount < $versionlimit )
290     {
291         $db = eZDB::instance();
292         $db->begin();
293         $newVersionID = $object->copyRevertTo( $versionID, $language );
294         $db->commit();
295
296         if ( !$http->hasPostVariable( 'DoNotEditAfterCopy' ) )
297         {
298             return $Module->redirectToView( 'edit', array( $ObjectID, $newVersionID, $language ) );
299         }
300     }
301     else
302     {
303         $params = array( 'conditions'=> array( 'status' => 3 ) );
304         $versions = $object->versions( true, $params );
305         if ( count( $versions ) > 0 )
306         {
307             $modified = $versions[0]->attribute( 'modified' );
308             $removeVersion = $versions[0];
309             foreach ( $versions as $version )
310             {
311                 $currentModified = $version->attribute( 'modified' );
312                 if ( $currentModified < $modified )
313                 {
314                     $modified = $currentModified;
315                     $removeVersion = $version;
316                 }
317             }
318
319             $db = eZDB::instance();
320             $db->begin();
321             $removeVersion->removeThis();
322             $newVersionID = $object->copyRevertTo( $versionID, $language );
323             $db->commit();
324
325             if ( !$http->hasPostVariable( 'DoNotEditAfterCopy' ) )
326             {
327                 return $Module->redirectToView( 'edit', array( $ObjectID, $newVersionID, $language ) );
328             }
329         }
330         else
331         {
332             $http->setSessionVariable( 'ExcessVersionHistoryLimit', true );
333             $currentVersion = $object->attribute( 'current_version' );
334             $Module->redirectToView( 'history', array( $ObjectID, $currentVersion ) );
335             return eZModule::HOOK_STATUS_CANCEL_RUN;
336         }
337     }
338 }
339
340 $res = eZTemplateDesignResource::instance();
341 $res->setKeys( array( array( 'object', $object->attribute( 'id' ) ), // Object ID
342                       array( 'remote_id', $object->attribute( 'remote_id' ) ),
343                       array( 'class', $object->attribute( 'contentclass_id' ) ), // Class ID
344                       array( 'class_identifier', $object->attribute( 'class_identifier' ) ), // Class identifier
345                       array( 'section_id', $object->attribute( 'section_id' ) ) // Section ID
346                       ) ); // Section ID, 0 so far
347
348 eZSection::setGlobalID( $object->attribute( 'section_id' ) );
349 $versionArray =( isset( $versionArray ) and is_array( $versionArray ) ) ? array_unique( $versionArray ) : array();
350 $LastAccessesVersionURI = $http->hasSessionVariable( 'LastAccessesVersionURI' ) ? $http->sessionVariable( 'LastAccessesVersionURI' ) : null;
351 $explodedURI = $LastAccessesVersionURI ? explode ( '/', $LastAccessesVersionURI ) : null;
352 if ( $LastAccessesVersionURI and is_array( $versionArray ) and !in_array( $explodedURI[3], $versionArray ) )
353   $tpl->setVariable( 'redirect_uri', $http->sessionVariable( 'LastAccessesVersionURI' ) );
354
355 //Fetch newer drafts and count of newer drafts.
356 $newerDraftVersionList = eZPersistentObject::fetchObjectList( eZContentObjectVersion::definition(),
357                                                               null,
358                                                               array( 'contentobject_id' => $object->attribute( 'id' ),
359                                                                      'status' => eZContentObjectVersion::STATUS_DRAFT,
360                                                                      'version' => array( '>', $object->attribute( 'current_version' ) ) ),
361                                                               array( 'modified' => 'asc',
362                                                                      'initial_language_id' => 'desc' ),
363                                                               null, true );
364 $newerDraftVersionListCount = is_array( $newerDraftVersionList ) ? count( $newerDraftVersionList ) : 0;
365
366 $versions = $object->versions();
367
368 $tpl->setVariable( 'newerDraftVersionList', $newerDraftVersionList );
369 $tpl->setVariable( 'newerDraftVersionListCount', $newerDraftVersionListCount );
370 $tpl->setVariable( 'view_parameters', $viewParameters );
371 $tpl->setVariable( 'object', $object );
372 $tpl->setVariable( 'edit_version', $EditVersion );
373 $tpl->setVariable( 'versions', $versions );
374 $tpl->setVariable( 'edit_warning', $editWarning );
375 $tpl->setVariable( 'can_edit', $canEdit );
376 //$tpl->setVariable( 'can_remove', $canRemove );
377 $tpl->setVariable( 'user_id', $user->attribute( 'contentobject_id' ) );
378
379 $Result = array();
380 $Result['content'] = $tpl->fetch( 'design:content/history.tpl' );
381 $Result['path'] = array( array( 'text' => ezpI18n::translate( 'kernel/content', 'History' ),
382                                 'url' => false ) );
383 $section = eZSection::fetch( $object->attribute( 'section_id' ) );
384 if ( $section )
385 {
386     $Result['navigation_part'] = $section->attribute( 'navigation_part_identifier' );
387     $Result['section_id'] = $section->attribute( 'id' );
388 }
389
390 ?>