- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / content / edit.php
1 <?php
2 //
3 // Created on: <17-Apr-2002 10:34:48 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 $Module = $Params['Module'];
30 require 'kernel/content/node_edit.php';
31 initializeNodeEdit( $Module );
32 require 'kernel/content/relation_edit.php';
33 initializeRelationEdit( $Module );
34 require 'kernel/content/section_edit.php';
35 initializeSectionEdit( $Module );
36 require 'kernel/content/state_edit.php';
37 initializeStateEdit( $Module );
38 $obj = eZContentObject::fetch( $ObjectID );
39
40 if ( !$obj )
41     return $Module->handleError( eZError::KERNEL_NOT_AVAILABLE, 'kernel' );
42
43 // If the object has status Archived (trash) we redirect to content/restore
44 // which can handle this status properly.
45 if ( $obj->attribute( 'status' ) == eZContentObject::STATUS_ARCHIVED )
46 {
47     return $Module->redirectToView( 'restore', array( $ObjectID ) );
48 }
49
50 // Check if we should switch access mode (http/https) for this object.
51 eZSSLZone::checkObject( 'content', 'edit', $obj );
52
53 // This controls if the final access check is done.
54 // Some code will turn it off since they do the checking themselves.
55 $isAccessChecked = false;
56 $classID = $obj->attribute( 'contentclass_id' );
57 $class = eZContentClass::fetch( $classID );
58 $http = eZHTTPTool::instance();
59
60 // Action for the edit_draft.tpl/edit_languages.tpl page.
61 // CancelDraftButton is set for the Cancel button.
62 // Note: This code is safe to place before permission checking.
63 if( $http->hasPostVariable( 'CancelDraftButton' ) )
64 {
65     $nodes = $obj->assignedNodes();
66     $chosenNode = null;
67     foreach ( $nodes as $node )
68     {
69         if ( $node->attribute( 'is_main' ) )
70         {
71             $chosenNode = $node;
72         }
73         else if ( $chosenNode === null )
74         {
75             $chosenNode = $node;
76         }
77     }
78     if ( $chosenNode )
79     {
80         return $Module->redirectToView( 'view', array( 'full', $chosenNode->attribute( 'node_id' ) ) );
81     }
82     else
83     {
84         $contentINI = eZINI::instance( 'content.ini' );
85         $rootNodeID = $contentINI->variable( 'NodeSettings', 'RootNode' );
86         return $Module->redirectToView( 'view', array( 'full', $rootNodeID ) );
87     }
88 }
89
90 // Remember redirection URI in session for later use.
91 // Note: This code is safe to place before permission checking.
92 if ( $http->hasPostVariable( 'RedirectURIAfterPublish' ) )
93 {
94     $http->setSessionVariable( 'RedirectURIAfterPublish', $http->postVariable( 'RedirectURIAfterPublish' ) );
95 }
96 if ( $http->hasPostVariable( 'RedirectIfDiscarded' ) )
97 {
98     $http->setSessionVariable( 'RedirectIfDiscarded', $http->postVariable( 'RedirectIfDiscarded' ) );
99 }
100
101 // Action for edit_draft.tpl page,
102 // EditButton is the button for editing the selected version.
103 // Note: This code is safe to place before permission checking.
104 if ( $http->hasPostVariable( 'EditButton' ) )
105 {
106     if ( $http->hasPostVariable( 'SelectedVersion' ) )
107     {
108         $selectedVersion = $http->postVariable( 'SelectedVersion' );
109         // Kept for backwards compatibility, EditLanguage may also be set in URL
110         if ( $http->hasPostVariable( 'ContentObjectLanguageCode' ) )
111         {
112             $EditLanguage = $http->postVariable( 'ContentObjectLanguageCode' );
113         }
114
115         return $Module->redirectToView( "edit", array( $ObjectID, $selectedVersion, $EditLanguage ) );
116     }
117 }
118
119 //Check if there is corresponding locale for the supplied language code.
120 if ( $EditLanguage != null )
121 {
122    $localeObject = eZLocale::instance( $EditLanguage );
123        if ( !$localeObject || !$localeObject->isValid() )
124        {
125            eZDebug::writeError( "No such locale $EditLanguage!", 'Can not find language.' );
126            return $Module->handleError( eZError::KERNEL_LANGUAGE_NOT_FOUND, 'kernel',
127                      array( 'AccessList' => $obj->accessList( 'edit' ) ) );
128        }
129 }
130
131 // Action for edit_draft.tpl page,
132 // This will create a new draft of the object which the user can edit.
133 if ( $http->hasPostVariable( 'NewDraftButton' ) )
134 {
135     // Check permission for object in specified language
136     if ( !$obj->canEdit( false, false, false, $EditLanguage ) )
137     {
138         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
139                                      array( 'AccessList' => $obj->accessList( 'edit' ) ) );
140     }
141     $isAccessChecked = true;
142
143     // Kept for backwards compatibility
144     if ( $http->hasPostVariable( 'ContentObjectLanguageCode' ) )
145     {
146         $EditLanguage = $http->postVariable( 'ContentObjectLanguageCode' );
147     }
148
149     // Check the new version against history limit for class $classID
150     $versionlimit = eZContentClass::versionHistoryLimit( $classID );
151     $versionCount = $obj->getVersionCount();
152     if ( $versionCount < $versionlimit )
153     {
154         $version = $obj->createNewVersionIn( $EditLanguage, $FromLanguage, false, true, eZContentObjectVersion::STATUS_INTERNAL_DRAFT );
155         if ( !$http->hasPostVariable( 'DoNotEditAfterNewDraft' ) )
156         {
157             return $Module->redirectToView( 'edit', array( $ObjectID, $version->attribute( 'version' ), $EditLanguage ) );
158         }
159         else
160         {
161             return $Module->redirectToView( 'edit', array( $ObjectID, 'f', $EditLanguage ) );
162         }
163     }
164     else
165     {
166         $params = array( 'conditions'=> array( 'status' => 3 ) );
167         $versions = $obj->versions( true, $params );
168         if ( count( $versions ) > 0 )
169         {
170             $modified = $versions[0]->attribute( 'modified' );
171             $removeVersion = $versions[0];
172             foreach ( $versions as $version )
173             {
174                 $currentModified = $version->attribute( 'modified' );
175                 if ( $currentModified < $modified )
176                 {
177                     $modified = $currentModified;
178                     $removeVersion = $version;
179                 }
180             }
181
182             $db = eZDB::instance();
183             $db->begin();
184             $removeVersion->removeThis();
185             $version = $obj->createNewVersionIn( $EditLanguage, false, false, true, eZContentObjectVersion::STATUS_INTERNAL_DRAFT );
186             $db->commit();
187
188             if( !$http->hasPostVariable( 'DoNotEditAfterNewDraft' ) )
189             {
190                 return $Module->redirectToView( 'edit', array( $ObjectID, $version->attribute( 'version' ), $EditLanguage ) );
191             }
192             else
193             {
194                 return $Module->redirectToView( 'edit', array( $ObjectID, 'f', $EditLanguage ) );
195             }
196
197             return eZModule::HOOK_STATUS_CANCEL_RUN;
198         }
199         else
200         {
201             $http->setSessionVariable( 'ExcessVersionHistoryLimit', true );
202             $currentVersion = $obj->attribute( 'current_version' );
203             $Module->redirectToView( 'history', array( $ObjectID, $currentVersion, $EditLanguage ) );
204             return eZModule::HOOK_STATUS_CANCEL_RUN;
205         }
206     }
207 }
208
209 // Action for the edit_language.tpl page.
210 // LanguageSelection is used to choose a language to edit the object in.
211 if ( $http->hasPostVariable( 'LanguageSelection' ) )
212 {
213     $selectedEditLanguage = $http->postVariable( 'EditLanguage' );
214     $selectedFromLanguage = $http->postVariable( 'FromLanguage' );
215     if ( in_array( $selectedEditLanguage, $obj->availableLanguages() ) )
216     {
217         $selectedFromLanguage = false;
218     }
219
220     $user = eZUser::currentUser();
221     $parameters = array( 'conditions' =>
222                          array( 'status' => array( array( eZContentObjectVersion::STATUS_DRAFT,
223                                                           eZContentObjectVersion::STATUS_INTERNAL_DRAFT ) ),
224                                 'creator_id' => $user->attribute( 'contentobject_id' ) ) );
225     $chosenVersion = null;
226     foreach ( $obj->versions( true, $parameters ) as $possibleVersion )
227     {
228         if ( $possibleVersion->initialLanguageCode() == $selectedEditLanguage )
229         {
230             if ( !$chosenVersion ||
231                  $chosenVersion->attribute( 'modified' ) < $possibleVersion->attribute( 'modified' ) )
232             {
233                 $chosenVersion = $possibleVersion;
234             }
235         }
236     }
237     // We already found a draft by the current user,
238     // immediately redirect to edit page for that version.
239     if ( $chosenVersion )
240     {
241         // Check permission for object edit in specified language
242         if ( !$obj->canEdit( false, false, false, $selectedEditLanguage ) )
243         {
244             return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
245                                          array( 'AccessList' => $obj->accessList( 'edit' ) ) );
246         }
247         $isAccessChecked = true;
248         return $Module->redirectToView( 'edit', array( $ObjectID, 'f', $selectedEditLanguage, $selectedFromLanguage ) );
249     }
250     // Check permission for object creation in specified language
251     if ( !$obj->canEdit( false, false, false, $selectedEditLanguage ) )
252     {
253         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
254                                      array( 'AccessList' => $obj->accessList( 'edit' ) ) );
255     }
256     $isAccessChecked = true;
257
258     $version = $obj->createNewVersionIn( $selectedEditLanguage, $selectedFromLanguage, false, true, eZContentObjectVersion::STATUS_INTERNAL_DRAFT );
259
260     return $Module->redirectToView( 'edit', array( $ObjectID, $version->attribute( 'version' ), $selectedEditLanguage, $selectedFromLanguage ) );
261 }
262
263 // If we have a version number we check if it exists.
264 if ( is_numeric( $EditVersion ) )
265 {
266     $version = $obj->version( $EditVersion );
267     if ( !$version )
268     {
269         return $Module->handleError( eZError::KERNEL_NOT_AVAILABLE, 'kernel' );
270     }
271 }
272
273 // No language was specified in the URL, we need to figure out
274 // the language to use.
275 if ( $EditLanguage == false )
276 {
277     // Check permission for object
278     if ( !$obj->canEdit() )
279     {
280         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
281                                      array( 'AccessList' => $obj->accessList( 'edit' ) ) );
282     }
283     $isAccessChecked = true;
284 //  $isSelfEdit = !$obj->checkAccess( 'edit' );
285
286     // We check the $version variable which might be set above
287     if ( isset( $version ) && $version )
288     {
289         // We have a version so we then know the language directly.
290         $translationList = $version->translationList( false, false );
291         if ( $translationList )
292         {
293             $EditLanguage = $translationList[0];
294             // Check permission for version in specified language.
295             if ( !$version->checkAccess( 'edit', false, false, false, $EditLanguage ) )
296             {
297                 return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
298             }
299         }
300         else
301         {
302             return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
303         }
304         $obj->cleanupInternalDrafts();
305     }
306     else
307     {
308         // No version so we investigate further.
309         $obj->cleanupInternalDrafts();
310
311         // Check number of languages
312         $languages = eZContentLanguage::fetchList();
313         // If there is only one language we choose it for the user and goes to version choice screen.
314         if ( count( $languages ) == 1 )
315         {
316             $firstLanguage = array_shift( $languages );
317             return $Module->redirectToView( 'edit', array( $ObjectID, 'f', $firstLanguage->attribute( 'locale' ) ) );
318         }
319
320         $canCreateLanguageList = $obj->attribute( 'can_create_languages' );
321         $canEditLanguageList = $obj->attribute( 'can_edit_languages' );
322         if ( count( $canCreateLanguageList ) == 0 && count( $canEditLanguageList ) == 1 )
323         {
324             $firstLanguage = array_shift( $canEditLanguageList );
325             return $Module->redirectToView( 'edit', array( $ObjectID, 'f', $firstLanguage->attribute( 'locale' ) ) );
326         }
327
328         // No version found, ask the user.
329         require_once( 'kernel/common/template.php' );
330
331         $tpl = templateInit();
332
333         $res = eZTemplateDesignResource::instance();
334         $res->setKeys( array( array( 'object', $obj->attribute( 'id' ) ),
335                               array( 'remote_id', $obj->attribute( 'remote_id' ) )
336          ) );
337
338         $tpl->setVariable( 'object', $obj );
339         $tpl->setVariable( 'show_existing_languages', ( $EditVersion == 'a' )? false: true );
340
341         $Result = array();
342         $Result['content'] = $tpl->fetch( 'design:content/edit_languages.tpl' );
343         $Result['path'] = array( array( 'text' => ezpI18n::translate( 'kernel/content', 'Content' ),
344                                  'url' => false ),
345                           array( 'text' => ezpI18n::translate( 'kernel/content', 'Edit' ),
346                                  'url' => false ) );
347         $section = eZSection::fetch( $obj->attribute( 'section_id' ) );
348         if ( $section )
349         {
350             $Result['navigation_part'] = $section->attribute( 'navigation_part_identifier' );
351             $Result['section_id'] = $section->attribute( 'id' );
352         }
353         return $Result;
354     }
355 }
356
357 $ini = eZINI::instance();
358
359 // There version is not set but we do have a language.
360 // This means we need to create a new draft for the user, or reuse
361 // an existing one.
362 if ( !is_numeric( $EditVersion ) )
363 {
364     if ( $ini->variable( 'ContentSettings', 'EditDirtyObjectAction' ) == 'usecurrent' )
365     {
366         // Check permission for object in specified language
367         if ( !$obj->canEdit( false, false, false, $EditLanguage ) )
368         {
369             return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
370                                          array( 'AccessList' => $obj->accessList( 'edit' ) ) );
371         }
372         $isAccessChecked = true;
373
374         $obj->cleanupInternalDrafts();
375         $version = $obj->createNewVersionIn( $EditLanguage, false, false, true, eZContentObjectVersion::STATUS_INTERNAL_DRAFT );
376         return $Module->redirectToView( "edit", array( $ObjectID, $version->attribute( "version" ), $EditLanguage ) );
377     }
378     else
379     {
380         $obj->cleanupInternalDrafts();
381         $draftVersions = $obj->versions( true, array( 'conditions' => array( 'status' => array( array( eZContentObjectVersion::STATUS_DRAFT, eZContentObjectVersion::STATUS_INTERNAL_DRAFT ) ),
382                                                                               'language_code' => $EditLanguage ) ) );
383         if ( count( $draftVersions ) > 1 )
384         {
385             // No permission checking required since it will ask the user what to do.
386
387             // There are already drafts for the specified language so we need to ask the user what to do.
388             $mostRecentDraft = $draftVersions[0];
389             foreach( $draftVersions as $currentDraft )
390             {
391                 if( $currentDraft->attribute( 'modified' ) > $mostRecentDraft->attribute( 'modified' ) )
392                 {
393                     $mostRecentDraft = $currentDraft;
394                 }
395             }
396
397             require_once( 'kernel/common/template.php' );
398             $tpl = templateInit();
399
400             $res = eZTemplateDesignResource::instance();
401             $res->setKeys( array( array( 'object', $obj->attribute( 'id' ) ),
402                                 array( 'remote_id', $obj->attribute( 'remote_id' ) ),
403                                 array( 'class', $class->attribute( 'id' ) ),
404                                 array( 'class_identifier', $class->attribute( 'identifier' ) ),
405                                 array( 'class_group', $class->attribute( 'match_ingroup_id_list' ) ) ) );
406
407             $tpl->setVariable( 'edit_language', $EditLanguage );
408             $tpl->setVariable( 'from_language', $FromLanguage );
409             $tpl->setVariable( 'object', $obj );
410             $tpl->setVariable( 'class', $class );
411             $tpl->setVariable( 'draft_versions', $draftVersions );
412             $tpl->setVariable( 'most_recent_draft', $mostRecentDraft );
413
414             $Result = array();
415             $Result['content'] = $tpl->fetch( 'design:content/edit_draft.tpl' );
416             $section = eZSection::fetch( $obj->attribute( 'section_id' ) );
417             if ( $section )
418             {
419                 $Result['navigation_part'] = $section->attribute( 'navigation_part_identifier' );
420                 $Result['section_id'] = $section->attribute( 'id' );
421             }
422             return $Result;
423         }
424         elseif ( count( $draftVersions ) == 1 )
425         {
426             // Check permission for version in specified language
427             if ( !$obj->canEdit( false, false, false, $EditLanguage ) )
428             {
429                 return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
430                                              array( 'AccessList' => $obj->accessList( 'edit' ) ) );
431             }
432             // There are already drafts for the specified language so we need to ask the user what to do.
433             $mostRecentDraft = $draftVersions[0];
434             foreach( $draftVersions as $currentDraft )
435             {
436                 if( $currentDraft->attribute( 'modified' ) > $mostRecentDraft->attribute( 'modified' ) )
437                 {
438                     $mostRecentDraft = $currentDraft;
439                 }
440             }
441             require_once( 'kernel/common/template.php' );
442             $tpl = templateInit();
443
444                 $res = eZTemplateDesignResource::instance();
445             $res->setKeys( array( array( 'object', $obj->attribute( 'id' ) ),
446                                 array( 'remote_id', $obj->attribute( 'remote_id' ) ),
447                                 array( 'class', $class->attribute( 'id' ) ),
448                                 array( 'class_identifier', $class->attribute( 'identifier' ) ),
449                                 array( 'class_group', $class->attribute( 'match_ingroup_id_list' ) ) ) );
450
451             $tpl->setVariable( 'edit_language', $EditLanguage );
452             $tpl->setVariable( 'from_language', $FromLanguage );
453             $tpl->setVariable( 'object', $obj );
454             $tpl->setVariable( 'class', $class );
455             $tpl->setVariable( 'draft_versions', $draftVersions );
456             $tpl->setVariable( 'most_recent_draft', $mostRecentDraft );
457
458             $Result = array();
459             $Result['content'] = $tpl->fetch( 'design:content/edit_draft.tpl' );
460             $section = eZSection::fetch( $obj->attribute( 'section_id' ) );
461             if ( $section )
462             {
463                 $Result['navigation_part'] = $section->attribute( 'navigation_part_identifier' );
464                 $Result['section_id'] = $section->attribute( 'id' );
465             }
466             return $Result;
467         }
468         else
469         {
470             // Check permission for object in specified language
471             if ( !$obj->canEdit( false, false, false, $EditLanguage ) )
472             {
473                 return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
474                                              array( 'AccessList' => $obj->accessList( 'edit' ) ) );
475             }
476             $isAccessChecked = true;
477
478             $version = $obj->createNewVersionIn( $EditLanguage, false, false, true, eZContentObjectVersion::STATUS_INTERNAL_DRAFT );
479             return $Module->redirectToView( "edit", array( $ObjectID, $version->attribute( "version" ), $EditLanguage ) );
480         }
481     }
482 }
483 elseif ( is_numeric( $EditVersion ) )
484 {
485     // Fetch version
486     $version = eZContentObjectVersion::fetchVersion( $EditVersion, $obj->attribute( 'id' ) );
487     if ( !is_object( $version ) )
488     {
489         return $Module->handleError( eZError::KERNEL_NOT_AVAILABLE, 'kernel' );
490     }
491     $user = eZUser::currentUser();
492     // Check if $user can edit the current version.
493     // We should not allow to edit content without creating a new version.
494     if ( ( $version->attribute( 'status' ) != eZContentObjectVersion::STATUS_INTERNAL_DRAFT and
495            $version->attribute( 'status' ) != eZContentObjectVersion::STATUS_DRAFT and
496            $version->attribute( 'status' ) != eZContentObjectVersion::STATUS_REPEAT )
497           or $version->attribute( 'creator_id' ) != $user->id() )
498     {
499         return $Module->redirectToView( 'history', array( $ObjectID, $version->attribute( "version" ), $EditLanguage ) );
500     }
501 }
502
503 // If $isAccessChecked is still false we need to check access ourselves.
504 if ( !$isAccessChecked )
505 {
506     // Check permission for object and version in specified language.
507     if ( !$obj->canEdit( false, false, false, $EditLanguage ) )
508     {
509         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel',
510                                      array( 'AccessList' => $obj->accessList( 'edit' ) ) );
511     }
512 }
513
514 if ( !function_exists( 'checkContentActions' ) )
515 {
516     function checkContentActions( $module, $class, $object, $version, $contentObjectAttributes, $EditVersion, $EditLanguage, $FromLanguage, &$Result )
517     {
518         if ( $module->isCurrentAction( 'Preview' ) )
519         {
520             $module->redirectToView( 'versionview', array( $object->attribute('id'), $EditVersion, $EditLanguage, $FromLanguage ) );
521             return eZModule::HOOK_STATUS_CANCEL_RUN;
522         }
523
524         if ( $module->isCurrentAction( 'Translate' ) )
525         {
526             $module->redirectToView( 'translate', array( $object->attribute( 'id' ), $EditVersion, $EditLanguage, $FromLanguage ) );
527             return eZModule::HOOK_STATUS_CANCEL_RUN;
528         }
529
530         if ( $module->isCurrentAction( 'VersionEdit' ) )
531         {
532             if ( isset( $GLOBALS['eZRequestedURI'] ) and is_object( $GLOBALS['eZRequestedURI'] ) )
533             {
534                 $uri = $GLOBALS['eZRequestedURI'];
535                 $uri = $uri->originalURIString();
536                 $http = eZHTTPTool::instance();
537                 $http->setSessionVariable( 'LastAccessesVersionURI', $uri );
538             }
539             $module->redirectToView( 'history', array( $object->attribute( 'id' ), $EditVersion, $EditLanguage ) );
540             return eZModule::HOOK_STATUS_CANCEL_RUN;
541         }
542
543         if ( $module->isCurrentAction( 'EditLanguage' ) )
544         {
545             if ( $module->hasActionParameter( 'SelectedLanguage' ) )
546             {
547                 $EditLanguage = $module->actionParameter( 'SelectedLanguage' );
548                 // We reset the from language to disable the translation look
549                 $FromLanguage = false;
550                 $module->redirectToView( 'edit', array( $object->attribute('id'), $EditVersion, $EditLanguage, $FromLanguage ) );
551                 return eZModule::HOOK_STATUS_CANCEL_RUN;
552             }
553         }
554
555         if ( $module->isCurrentAction( 'TranslateLanguage' ) )
556         {
557             if ( $module->hasActionParameter( 'SelectedLanguage' ) )
558             {
559                 $FromLanguage = $EditLanguage;
560                 $EditLanguage = $module->actionParameter( 'SelectedLanguage' );
561                 $module->redirectToView( 'edit', array( $object->attribute('id'), $EditVersion, $EditLanguage, $FromLanguage ) );
562                 return eZModule::HOOK_STATUS_CANCEL_RUN;
563             }
564         }
565
566         if ( $module->isCurrentAction( 'FromLanguage' ) )
567         {
568             $FromLanguage = $module->actionParameter( 'FromLanguage' );
569             $module->redirectToView( 'edit', array( $object->attribute('id'), $EditVersion, $EditLanguage, $FromLanguage ) );
570             return eZModule::HOOK_STATUS_CANCEL_RUN;
571         }
572
573         if ( $module->isCurrentAction( 'Discard' ) )
574         {
575             $http = eZHTTPTool::instance();
576             $objectID = $object->attribute( 'id' );
577             $discardConfirm = true;
578             if ( $http->hasPostVariable( 'DiscardConfirm' ) )
579                 $discardConfirm = $http->postVariable( 'DiscardConfirm' );
580             $http->setSessionVariable( 'DiscardObjectID', $objectID );
581             $http->setSessionVariable( 'DiscardObjectVersion', $EditVersion );
582             $http->setSessionVariable( 'DiscardObjectLanguage', $EditLanguage );
583             $http->setSessionVariable( 'DiscardConfirm', $discardConfirm );
584             $module->redirectTo( $module->functionURI( 'removeeditversion' ) . '/' );
585             return eZModule::HOOK_STATUS_CANCEL_RUN;
586         }
587
588         // helper function which computes the redirect after
589         // publishing and final store of a draft.
590         function computeRedirect( $module, $object, $version, $EditLanguage = false )
591         {
592             $http = eZHTTPTool::instance();
593
594             $node = $object->mainNode();
595
596             if ( $http->hasSessionVariable( 'RedirectIfDiscarded' ) )
597             {
598                 $http->removeSessionVariable( 'RedirectIfDiscarded' );
599             }
600
601             $hasRedirected = false;
602             if ( $http->hasSessionVariable( 'ParentObject' ) && $http->sessionVariable( 'NewObjectID' ) == $object->attribute( 'id' ) )
603             {
604                 $parentArray = $http->sessionVariable( 'ParentObject' );
605                 $parentURL = $module->redirectionURI( 'content', 'edit', $parentArray );
606                 $parentObject = eZContentObject::fetch( $parentArray[0] );
607                 $db = eZDB::instance();
608                 $db->begin();
609                 $parentObject->addContentObjectRelation( $object->attribute( 'id' ), $parentArray[1] );
610                 $db->commit();
611                 $http->removeSessionVariable( 'ParentObject' );
612                 $http->removeSessionVariable( 'NewObjectID' );
613                 $module->redirectTo( $parentURL );
614                 $hasRedirected = true;
615             }
616             if ( $http->hasSessionVariable( 'RedirectURIAfterPublish' ) && !$hasRedirected )
617             {
618                 $uri = $http->sessionVariable( 'RedirectURIAfterPublish' );
619                 $http->removeSessionVariable( 'RedirectURIAfterPublish' );
620                 $module->redirectTo( $uri );
621                 $hasRedirected = true;
622             }
623             if ( $http->hasPostVariable( 'RedirectURIAfterPublish' )  && !$hasRedirected )
624             {
625                 $uri = $http->postVariable( 'RedirectURIAfterPublish' );
626                 $module->redirectTo( $uri );
627                 $hasRedirected = true;
628             }
629             if ( $http->hasPostVariable( "BackToEdit" ) && $http->postVariable( "BackToEdit" ) )
630             {
631                 $uri = $module->redirectionURI( 'content', 'edit', array( $object->attribute( 'id'), 'f', $EditLanguage ) );
632                 $module->redirectTo( $uri );
633                 eZDebug::writeDebug( $uri, "uri  " .  $object->attribute( 'id')  );
634                 $hasRedirected = true;
635             }
636
637             if ( !$hasRedirected )
638             {
639                 if ( $http->hasPostVariable( 'RedirectURI' ) )
640                 {
641                     $uri = $http->postVariable( 'RedirectURI' );
642                     $module->redirectTo( $uri );
643                 }
644                 else if ( $node !== null )
645                 {
646                     $parentNode = $node->attribute( 'parent_node_id' );
647                     if ( $parentNode == 1 )
648                     {
649                         $parentNode = $node->attribute( 'node_id' );
650                     }
651                     $module->redirectToView( 'view', array( 'full', $parentNode ) );
652                 }
653                 else
654                 {
655                     $module->redirectToView( 'view', array( 'full', $version->attribute( 'main_parent_node_id' ) ) );
656                 }
657             }
658
659         }
660
661         if( $module->isCurrentAction( 'StoreExit' ) )
662         {
663             computeRedirect( $module, $object, $version, $EditLanguage );
664             return eZModule::HOOK_STATUS_CANCEL_RUN;
665         }
666
667         if ( $module->isCurrentAction( 'Publish' ) )
668         {
669             // Checking the source and destination language from the url,
670             // if they are the same no confirmation is needed.
671             if ( $EditLanguage != $FromLanguage )
672             {
673                 $conflictingVersions = $version->hasConflicts( $EditLanguage );
674                 if ( $conflictingVersions )
675                 {
676                     require_once( 'kernel/common/template.php' );
677                     $tpl = templateInit();
678
679                     $res = eZTemplateDesignResource::instance();
680                     $res->setKeys( array( array( 'object', $object->attribute( 'id' ) ),
681                                         array( 'remote_id', $object->attribute( 'remote_id' ) ),
682                                         array( 'class', $class->attribute( 'id' ) ),
683                                         array( 'class_identifier', $class->attribute( 'identifier' ) ),
684                                         array( 'class_group', $class->attribute( 'match_ingroup_id_list' ) ) ) );
685
686                     $tpl->setVariable( 'edit_language', $EditLanguage );
687                     $tpl->setVariable( 'current_version', $version->attribute( 'version' ) );
688                     $tpl->setVariable( 'object', $object );
689                     $tpl->setVariable( 'draft_versions', $conflictingVersions );
690
691                     $Result = array();
692                     $Result['content'] = $tpl->fetch( 'design:content/edit_conflict.tpl' );
693                     return eZModule::HOOK_STATUS_CANCEL_RUN;
694                 }
695             }
696
697             eZDebug::accumulatorStart( 'publish', '', 'publish' );
698             $oldObjectName = $object->name();
699             $operationResult = eZOperationHandler::execute( 'content', 'publish', array( 'object_id' => $object->attribute( 'id' ),
700                                                                                          'version' => $version->attribute( 'version' ) ) );
701             eZDebug::accumulatorStop( 'publish' );
702
703             if ( ( array_key_exists( 'status', $operationResult ) && $operationResult['status'] != eZModuleOperationInfo::STATUS_CONTINUE ) )
704             {
705                 switch( $operationResult['status'] )
706                 {
707                     case eZModuleOperationInfo::STATUS_HALTED:
708                     {
709                         if ( isset( $operationResult['redirect_url'] ) )
710                         {
711                             $module->redirectTo( $operationResult['redirect_url'] );
712                             return;
713                         }
714                         else if ( isset( $operationResult['result'] ) )
715                         {
716                             $result = $operationResult['result'];
717                             $resultContent = false;
718                             if ( is_array( $result ) )
719                             {
720                                 if ( isset( $result['content'] ) )
721                                 {
722                                     $resultContent = $result['content'];
723                                 }
724                                 if ( isset( $result['path'] ) )
725                                 {
726                                     $Result['path'] = $result['path'];
727                                 }
728                             }
729                             else
730                             {
731                                 $resultContent = $result;
732                             }
733                             // Temporary fix to make approval workflow work with edit.
734                             if ( strpos( $resultContent, 'Deffered to cron' ) === 0 )
735                             {
736                                 $Result = null;
737                             }
738                             else
739                             {
740                                 $Result['content'] = $resultContent;
741                             }
742                         }
743                     }break;
744                     case eZModuleOperationInfo::STATUS_CANCELLED:
745                     {
746                         $Result = array();
747                         $Result['content'] = "Content publish cancelled<br/>";
748                     }
749                 }
750
751                 /* If we already have a correct module result
752                  * we don't need to continue module execution.
753                  */
754                 if ( is_array( $Result ) )
755                     return eZModule::HOOK_STATUS_CANCEL_RUN;
756             }
757
758             // update content object attributes array by refetching them from database
759             $object = eZContentObject::fetch( $object->attribute( 'id' ) );
760             $contentObjectAttributes = $object->attribute( 'contentobject_attributes' );
761
762             // set chosen hidden/invisible attributes for object nodes
763             $http          = eZHTTPTool::instance();
764             $assignedNodes = $object->assignedNodes( true );
765             foreach ( $assignedNodes as $node )
766             {
767                 $nodeID               = $node->attribute( 'node_id' );
768                 $parentNodeID         = $node->attribute( 'parent_node_id' );
769                 $updateNodeVisibility =  false;
770                 $postVarName          = "FutureNodeHiddenState_$parentNodeID";
771
772                 if ( !$http->hasPostVariable( $postVarName ) )
773                     $updateNodeVisibility = true;
774                 else
775                 {
776                     $futureNodeHiddenState = $http->postVariable( $postVarName );
777                     $db = eZDB::instance();
778                     $db->begin();
779                     if ( $futureNodeHiddenState == 'hidden' )
780                         eZContentObjectTreeNode::hideSubTree( $node );
781                     else if ( $futureNodeHiddenState == 'visible' )
782                         eZContentObjectTreeNode::unhideSubTree( $node );
783                     else if ( $futureNodeHiddenState == 'unchanged' )
784                         $updateNodeVisibility = true;
785                     else
786                         eZDebug::writeWarning( "Unknown value for the future node hidden state: '$futureNodeHiddenState'" );
787                     $db->commit();
788                 }
789
790                 if ( $updateNodeVisibility )
791                 {
792                     // this might be redundant
793                     $db = eZDB::instance();
794                     $db->begin();
795                     $parentNode = eZContentObjectTreeNode::fetch( $parentNodeID );
796                     eZContentObjectTreeNode::updateNodeVisibility( $node, $parentNode, /* $recursive = */ false );
797                     $db->commit();
798                     unset( $node, $parentNode );
799                 }
800             }
801             unset( $assignedNodes );
802
803             $object = eZContentObject::fetch( $object->attribute( 'id' ) );
804
805             $newObjectName = $object->name();
806
807             $http = eZHTTPTool::instance();
808
809             computeRedirect( $module, $object, $version, $EditLanguage );
810             // we have set redirection URI for module so we don't need to continue module execution
811             return eZModule::HOOK_STATUS_CANCEL_RUN;
812         }
813     }
814 }
815 $Module->addHook( 'action_check', 'checkContentActions' );
816
817 $includeResult = include( 'kernel/content/attribute_edit.php' );
818
819 if ( $includeResult != 1 )
820     return $includeResult;
821
822 ?>