- Fixed #16160: Call to undefined function ezi18n()
[tinyz:tinyz.git] / kernel / content / copy.php
1 <?php
2 //
3 // Created on: <17-Jan-2003 12:47:11 amos>
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 $ObjectID = $Params['ObjectID'];
31
32 $http = eZHTTPTool::instance();
33
34 if ( $http->hasPostVariable( 'BrowseCancelButton' ) )
35 {
36     if ( $http->hasPostVariable( 'BrowseCancelURI' ) )
37     {
38         return $Module->redirectTo( $http->postVariable( 'BrowseCancelURI' ) );
39     }
40 }
41
42 if ( $ObjectID === null )
43 {
44     // ObjectID is returned after browsing
45     $ObjectID = $http->postVariable( 'ObjectID' );
46 }
47
48 $object = eZContentObject::fetch( $ObjectID );
49
50 if ( $object === null )
51     return $Module->handleError( eZError::KERNEL_NOT_AVAILABLE, 'kernel' );
52
53 if ( !$object->attribute( 'can_read' ) )
54     return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
55
56 if ( $Module->isCurrentAction( 'Cancel' ) )
57 {
58     $mainParentNodeID = $object->attribute( 'main_parent_node_id' );
59     return $Module->redirectToView( 'view', array( 'full', $mainParentNodeID ) );
60 }
61
62 $contentINI = eZINI::instance( 'content.ini' );
63
64 /*!
65  Copy the specified object to a given node
66 */
67 function copyObject( $Module, $object, $allVersions, $newParentNodeID )
68 {
69     if ( !$newParentNodeID )
70         return $Module->redirectToView( 'view', array( 'full', 2 ) );
71
72     // check if we can create node under the specified parent node
73     if( ( $newParentNode = eZContentObjectTreeNode::fetch( $newParentNodeID ) ) === null )
74         return $Module->redirectToView( 'view', array( 'full', 2 ) );
75
76     $classID = $object->attribute('contentclass_id');
77
78     if ( !$newParentNode->checkAccess( 'create', $classID ) )
79     {
80         $objectID = $object->attribute( 'id' );
81         eZDebug::writeError( "Cannot copy object $objectID to node $newParentNodeID, " .
82                                "the current user does not have create permission for class ID $classID",
83                              'content/copy' );
84         return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
85     }
86
87     $db = eZDB::instance();
88     $db->begin();
89     $newObject = $object->copy( $allVersions );
90     // We should reset section that will be updated in updateSectionID().
91     // If sectionID is 0 then the object has been newly created
92     $newObject->setAttribute( 'section_id', 0 );
93     $newObject->store();
94
95     $curVersion        = $newObject->attribute( 'current_version' );
96     $curVersionObject  = $newObject->attribute( 'current' );
97     $newObjAssignments = $curVersionObject->attribute( 'node_assignments' );
98     unset( $curVersionObject );
99
100     // remove old node assignments
101     foreach( $newObjAssignments as $assignment )
102     {
103         $assignment->purge();
104     }
105
106     // and create a new one
107     $nodeAssignment = eZNodeAssignment::create( array(
108                                                      'contentobject_id' => $newObject->attribute( 'id' ),
109                                                      'contentobject_version' => $curVersion,
110                                                      'parent_node' => $newParentNodeID,
111                                                      'is_main' => 1
112                                                      ) );
113     $nodeAssignment->store();
114
115     // publish the newly created object
116     eZOperationHandler::execute( 'content', 'publish', array( 'object_id' => $newObject->attribute( 'id' ),
117                                                               'version'   => $curVersion ) );
118     // Update "is_invisible" attribute for the newly created node.
119     $newNode = $newObject->attribute( 'main_node' );
120     eZContentObjectTreeNode::updateNodeVisibility( $newNode, $newParentNode );
121
122     $db->commit();
123     return $Module->redirectToView( 'view', array( 'full', $newParentNodeID ) );
124 }
125
126 /*!
127 Browse for node to place the object copy into
128 */
129 function browse( $Module, $object )
130 {
131     if ( $Module->hasActionParameter( 'LanguageCode' ) )
132         $languageCode = $Module->actionParameter( 'LanguageCode' );
133     else
134     {
135         $languageCode = false;
136     }
137
138     $objectID = $object->attribute( 'id' );
139     $node     = $object->attribute( 'main_node' );
140     $class    = $object->contentClass();
141
142     $ignoreNodesSelect = array();
143     $ignoreNodesClick = array();
144     foreach ( $object->assignedNodes( false ) as $element )
145     {
146         $ignoreNodesSelect[] = $element['node_id'];
147         $ignoreNodesClick[]  = $element['node_id'];
148     }
149     $ignoreNodesSelect = array_unique( $ignoreNodesSelect );
150     $ignoreNodesClick = array_unique( $ignoreNodesClick );
151
152     $viewMode = 'full';
153     if ( $Module->hasActionParameter( 'ViewMode' ) )
154         $viewMode = $module->actionParameter( 'ViewMode' );
155
156
157     $sourceParentNodeID = $node->attribute( 'parent_node_id' );
158     eZContentBrowse::browse( array( 'action_name' => 'CopyNode',
159                                     'description_template' => 'design:content/browse_copy_node.tpl',
160                                     'keys' => array( 'class' => $class->attribute( 'id' ),
161                                                      'class_id' => $class->attribute( 'identifier' ),
162                                                      'classgroup' => $class->attribute( 'ingroup_id_list' ),
163                                                      'section' => $object->attribute( 'section_id' ) ),
164                                     'ignore_nodes_select' => $ignoreNodesSelect,
165                                     'ignore_nodes_click'  => $ignoreNodesClick,
166                                     'persistent_data' => array( 'ObjectID' => $objectID ),
167                                     'permission' => array( 'access' => 'create', 'contentclass_id' => $class->attribute( 'id' ) ),
168                                     'content' => array( 'object_id' => $objectID,
169                                                         'object_version' => $object->attribute( 'current_version' ),
170                                                         'object_language' => $languageCode ),
171                                     'start_node' => $sourceParentNodeID,
172                                     'cancel_page' => $Module->redirectionURIForModule( $Module, 'view',
173                                                                                        array( $viewMode, $sourceParentNodeID, $languageCode ) ),
174                                     'from_page' => "/content/copy" ),
175                              $Module );
176 }
177
178 /*!
179 Redirect to the page that lets a user to choose which versions to copy:
180 either all version or the current one.
181 */
182 function chooseObjectVersionsToCopy( $Module, &$Result, $object )
183 {
184         $selectedNodeIDArray = eZContentBrowse::result( $Module->currentAction() );
185         require_once( 'kernel/common/template.php' );
186         $tpl = templateInit();
187         $tpl->setVariable( 'object', $object );
188         $tpl->setVariable( 'selected_node_id', $selectedNodeIDArray[0] );
189         $Result['content'] = $tpl->fetch( 'design:content/copy.tpl' );
190         $Result['path'] = array( array( 'url' => false,
191                                         'text' => ezpI18n::translate( 'kernel/content', 'Content' ) ),
192                                  array( 'url' => false,
193                                         'text' => ezpI18n::translate( 'kernel/content', 'Copy' ) ) );
194 }
195
196 /*
197  Object copying logic in pseudo-code:
198
199  $targetNodeID = browse();
200  $versionsToCopy = fetchObjectVersionsToCopyFromContentINI();
201  if ( $versionsToCopy != 'user-defined' )
202     $versionsToCopy = askUserAboutVersionsToCopy();
203  copyObject( $object, $versionsToCopy, $targeNodeID );
204
205  Action parameters:
206
207  1. initially:                                   null
208  2. when user has selected the target node:     'CopyNode'
209  3. when/if user has selected versions to copy: 'Copy' or 'Cancel'
210 */
211
212 $versionHandling = $contentINI->variable( 'CopySettings', 'VersionHandling' );
213 $chooseVersions = ( $versionHandling == 'user-defined' );
214 if( $chooseVersions )
215     $allVersions = ( $Module->actionParameter( 'VersionChoice' ) == 1 ) ? true : false;
216 else
217     $allVersions = ( $versionHandling == 'last-published' ) ? false : true;
218
219 if ( $Module->isCurrentAction( 'Copy' ) )
220 {
221     // actually do copying after a user has selected object versions to copy
222     $newParentNodeID = $http->postVariable( 'SelectedNodeID' );
223     return copyObject( $Module, $object, $allVersions, $newParentNodeID );
224 }
225 else if ( $Module->isCurrentAction( 'CopyNode' ) )
226 {
227     // we get here after a user selects target node to place the source object under
228     if( $chooseVersions )
229     {
230         // redirect to the page with choice of versions to copy
231         $Result = array();
232         chooseObjectVersionsToCopy( $Module, $Result, $object );
233     }
234     else
235     {
236         // actually do copying of the pre-configured object version(s)
237         $selectedNodeIDArray = eZContentBrowse::result( $Module->currentAction() );
238         $newParentNodeID = $selectedNodeIDArray[0];
239         return copyObject( $Module, $object, $allVersions, $newParentNodeID );
240     }
241 }
242 else // default, initial action
243 {
244     /*
245     Browse for target node.
246     We get here when a user clicks "copy" button when viewing some node.
247     */
248     browse( $Module, $object );
249 }
250
251 ?>