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

/kernel/content/history.php

http://github.com/ezsystems/ezpublish
PHP | 334 lines | 264 code | 49 blank | 21 comment | 51 complexity | d3820997a7fcb367456b16fd83ff83bf MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1
  1. <?php
  2. /**
  3. * @copyright Copyright (C) eZ Systems AS. All rights reserved.
  4. * @license For full copyright and license information view LICENSE file distributed with this source code.
  5. * @version //autogentag//
  6. * @package kernel
  7. */
  8. $tpl = eZTemplate::factory();
  9. $http = eZHTTPTool::instance();
  10. $ObjectID = $Params['ObjectID'];
  11. $EditVersion = $Params['EditVersion'];
  12. $Offset = $Params['Offset'];
  13. $viewParameters = array( 'offset' => $Offset );
  14. if ( $http->hasPostVariable( 'BackButton' ) )
  15. {
  16. $userRedirectURI = '';
  17. if ( $http->hasPostVariable( 'RedirectURI' ) )
  18. {
  19. $redurectURI = $http->postVariable( 'RedirectURI' );
  20. $http->removeSessionVariable( 'LastAccessesVersionURI' );
  21. return $Module->redirectTo( $redurectURI );
  22. }
  23. if ( $http->hasSessionVariable( "LastAccessesURI", false ) )
  24. $userRedirectURI = $http->sessionVariable( "LastAccessesURI" );
  25. return $Module->redirectTo( $userRedirectURI );
  26. }
  27. $object = eZContentObject::fetch( $ObjectID );
  28. $editWarning = false;
  29. $canEdit = false;
  30. $canRemove = false;
  31. if ( $object === null )
  32. return $Module->handleError( eZError::KERNEL_NOT_AVAILABLE, 'kernel' );
  33. if ( !$object->attribute( 'can_read' ) )
  34. return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
  35. if ( $object->attribute( 'can_edit' ) )
  36. $canEdit = true;
  37. $canRemove = true;
  38. //content/diff functionality
  39. //Set default values
  40. $previousVersion = 1;
  41. $newestVersion = 1;
  42. //By default, set preselect the previous and most recent version for diffing
  43. if ( count( $object->versions() ) > 1 )
  44. {
  45. $versionArray = $object->versions( false );
  46. $selectableVersions = array();
  47. foreach( $versionArray as $versionItem )
  48. {
  49. //Only return version numbers of archived or published items
  50. if ( in_array( $versionItem['status'], array( eZContentObjectVersion::STATUS_DRAFT,
  51. eZContentObjectVersion::STATUS_PUBLISHED,
  52. eZContentObjectVersion::STATUS_ARCHIVED ) ) )
  53. {
  54. $selectableVersions[] = $versionItem['version'];
  55. }
  56. }
  57. $newestVersion = array_pop( $selectableVersions );
  58. $previousVersion = array_pop( $selectableVersions );
  59. }
  60. $tpl->setVariable( 'selectOldVersion', $previousVersion );
  61. $tpl->setVariable( 'selectNewVersion', $newestVersion );
  62. $tpl->setVariable( 'module', $Module );
  63. $diff = array();
  64. if ( $http->hasPostVariable('DiffButton') && $http->hasPostVariable( 'FromVersion' ) && $http->hasPostVariable( 'ToVersion' ) )
  65. {
  66. if ( !$object->attribute( 'can_diff' ) )
  67. return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
  68. $lang = false;
  69. if ( $http->hasPostVariable( 'Language' ) )
  70. {
  71. $lang = $http->postVariable( 'Language' );
  72. }
  73. $oldVersion = $http->postVariable( 'FromVersion' );
  74. $newVersion = $http->postVariable( 'ToVersion' );
  75. if ( is_numeric( $oldVersion ) && is_numeric( $newVersion ) )
  76. {
  77. $oldObject = $object->version( $oldVersion );
  78. $newObject = $object->version( $newVersion );
  79. if ( $lang )
  80. {
  81. $oldAttributes = $object->fetchDataMap( $oldVersion, $lang );
  82. //Fallback, if desired language not available in version
  83. if ( !$oldAttributes )
  84. {
  85. $oldObjectLang = $oldObject->attribute( 'initial_language' );
  86. $oldAttributes = $object->fetchDataMap( $oldVersion, $oldObjectLang->attribute( 'locale' ) );
  87. }
  88. $newAttributes = $object->fetchDataMap( $newVersion, $lang );
  89. //Fallback, if desired language not available in version
  90. if ( !$newAttributes )
  91. {
  92. $newObjectLang = $newObject->attribute( 'initial_language' );
  93. $newAttributes = $object->fetchDataMap( $newVersion, $newObjectLang->attribute( 'locale' ) );
  94. }
  95. }
  96. else
  97. {
  98. $oldAttributes = $oldObject->dataMap();
  99. $newAttributes = $newObject->dataMap();
  100. }
  101. //Extra options to open up for future extensions of the system.
  102. $extraOptions = false;
  103. if ( $http->hasPostVariable( 'ExtraOptions' ) )
  104. {
  105. $extraOptions = $http->postVariable( 'ExtraOptions' );
  106. }
  107. //Invoke diff method in the datatype
  108. foreach ( $oldAttributes as $attribute )
  109. {
  110. $newAttr = $newAttributes[$attribute->attribute( 'contentclass_attribute_identifier' )];
  111. $contentClassAttr = $newAttr->attribute( 'contentclass_attribute' );
  112. $diff[$contentClassAttr->attribute( 'id' )] = $contentClassAttr->diff( $attribute, $newAttr, $extraOptions );
  113. }
  114. $tpl->setVariable( 'oldVersion', $oldVersion );
  115. $tpl->setVariable( 'oldVersionObject', $object->version( $oldVersion ) );
  116. $tpl->setVariable( 'newVersion', $newVersion );
  117. $tpl->setVariable( 'newVersionObject', $object->version( $newVersion ) );
  118. $tpl->setVariable( 'diff', $diff );
  119. }
  120. }
  121. //content/diff end
  122. //content/versions
  123. if ( $http->hasSessionVariable( 'ExcessVersionHistoryLimit' ) )
  124. {
  125. $excessLimit = $http->sessionVariable( 'ExcessVersionHistoryLimit' );
  126. if ( $excessLimit )
  127. $editWarning = 3;
  128. $http->removeSessionVariable( 'ExcessVersionHistoryLimit' );
  129. }
  130. if ( $http->hasPostVariable( 'RemoveButton' ) )
  131. {
  132. if ( !$canEdit )
  133. return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
  134. if ( $http->hasPostVariable( 'DeleteIDArray' ) )
  135. {
  136. $db = eZDB::instance();
  137. $db->begin();
  138. $deleteIDArray = $http->postVariable( 'DeleteIDArray' );
  139. $versionArray = array();
  140. foreach ( $deleteIDArray as $deleteID )
  141. {
  142. $version = eZContentObjectVersion::fetch( $deleteID );
  143. $versionArray[] = $version->attribute( 'version' );
  144. if ( $version != null )
  145. {
  146. if ( $version->attribute( 'can_remove' ) )
  147. {
  148. $version->removeThis();
  149. }
  150. }
  151. }
  152. $db->commit();
  153. }
  154. }
  155. $user = eZUser::currentUser();
  156. if ( $Module->isCurrentAction( 'Edit' ) )
  157. {
  158. if ( !$canEdit )
  159. return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
  160. $versionID = false;
  161. if ( is_array( $Module->actionParameter( 'VersionKeyArray' ) ) )
  162. {
  163. $versionID = array_keys( $Module->actionParameter( 'VersionKeyArray' ) );
  164. $versionID = $versionID[0];
  165. }
  166. else if ( $Module->hasActionParameter( 'VersionID' ) )
  167. $versionID = $Module->actionParameter( 'VersionID' );
  168. $version = $object->version( $versionID );
  169. if ( !$version )
  170. $versionID = false;
  171. if ( $versionID !== false and
  172. !in_array( $version->attribute( 'status' ), array( eZContentObjectVersion::STATUS_DRAFT, eZContentObjectVersion::STATUS_INTERNAL_DRAFT ) ) )
  173. {
  174. $editWarning = 1;
  175. $EditVersion = $versionID;
  176. }
  177. else if ( $versionID !== false and
  178. $version->attribute( 'creator_id' ) != $user->attribute( 'contentobject_id' ) )
  179. {
  180. $editWarning = 2;
  181. $EditVersion = $versionID;
  182. }
  183. else
  184. {
  185. return $Module->redirectToView( 'edit', array( $ObjectID, $versionID, $version->initialLanguageCode() ) );
  186. }
  187. }
  188. if ( $Module->isCurrentAction( 'CopyVersion' ) )
  189. {
  190. if ( !$canEdit )
  191. {
  192. return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
  193. }
  194. if ( is_array( $Module->actionParameter( 'VersionKeyArray' ) ) )
  195. {
  196. $versionID = array_keys( $Module->actionParameter( 'VersionKeyArray' ) );
  197. $versionID = $versionID[0];
  198. }
  199. else
  200. {
  201. $versionID = $Module->actionParameter( 'VersionID' );
  202. }
  203. $version = $object->version( $versionID );
  204. if ( !$version )
  205. $versionID = false;
  206. // if we cannot fetch version with given versionID or if fetched version is
  207. // an internal-draft then just skip copying and redirect back to the history view
  208. if ( !$versionID or $version->attribute( 'status' ) == eZContentObjectVersion::STATUS_INTERNAL_DRAFT )
  209. {
  210. $currentVersion = $object->attribute( 'current_version' );
  211. $Module->redirectToView( 'history', array( $ObjectID, $currentVersion ) );
  212. return eZModule::HOOK_STATUS_CANCEL_RUN;
  213. }
  214. $languages = $Module->actionParameter( 'LanguageArray' );
  215. if ( $languages && array_key_exists( $versionID, $languages ) )
  216. {
  217. $language = $languages[$versionID];
  218. }
  219. else
  220. {
  221. $language = $version->initialLanguageCode();
  222. }
  223. if ( !$object->checkAccess( 'edit', false, false, false, $language ) )
  224. {
  225. return $Module->handleError( eZError::KERNEL_ACCESS_DENIED, 'kernel' );
  226. }
  227. // Copying version (versionHistoryLimit is done in eZContentObject createNewVersion() )
  228. $db = eZDB::instance();
  229. $db->begin();
  230. $newVersionID = $object->copyRevertTo( $versionID, $language );
  231. $db->commit();
  232. if ( !$http->hasPostVariable( 'DoNotEditAfterCopy' ) )
  233. {
  234. return $Module->redirectToView( 'edit', array( $ObjectID, $newVersionID, $language ) );
  235. }
  236. }
  237. $res = eZTemplateDesignResource::instance();
  238. $res->setKeys( array( array( 'object', $object->attribute( 'id' ) ), // Object ID
  239. array( 'remote_id', $object->attribute( 'remote_id' ) ),
  240. array( 'class', $object->attribute( 'contentclass_id' ) ), // Class ID
  241. array( 'class_identifier', $object->attribute( 'class_identifier' ) ), // Class identifier
  242. array( 'section_id', $object->attribute( 'section_id' ) ), // Section ID, typo, deprecated
  243. array( 'section', $object->attribute( 'section_id' ) ) // Section ID
  244. ) ); // Section ID, 0 so far
  245. $section = eZSection::fetch( $object->attribute( 'section_id' ) );
  246. if( $section )
  247. {
  248. $res->setKeys( array( array( 'section_identifier', $section->attribute( 'identifier' ) ) ) );
  249. }
  250. $versionArray =( isset( $versionArray ) && is_array( $versionArray ) ) ? array_unique( $versionArray, SORT_REGULAR ) : array();
  251. $LastAccessesVersionURI = $http->hasSessionVariable( 'LastAccessesVersionURI' ) ? $http->sessionVariable( 'LastAccessesVersionURI' ) : null;
  252. $explodedURI = $LastAccessesVersionURI ? explode ( '/', $LastAccessesVersionURI ) : null;
  253. if ( $LastAccessesVersionURI and is_array( $versionArray ) and !in_array( $explodedURI[3], $versionArray ) )
  254. $tpl->setVariable( 'redirect_uri', $http->sessionVariable( 'LastAccessesVersionURI' ) );
  255. //Fetch newer drafts and count of newer drafts.
  256. $newerDraftVersionList = eZPersistentObject::fetchObjectList( eZContentObjectVersion::definition(),
  257. null,
  258. array( 'contentobject_id' => $object->attribute( 'id' ),
  259. 'status' => eZContentObjectVersion::STATUS_DRAFT,
  260. 'version' => array( '>', $object->attribute( 'current_version' ) ) ),
  261. array( 'modified' => 'asc',
  262. 'initial_language_id' => 'desc' ),
  263. null, true );
  264. $newerDraftVersionListCount = is_array( $newerDraftVersionList ) ? count( $newerDraftVersionList ) : 0;
  265. $versions = $object->versions();
  266. $tpl->setVariable( 'newerDraftVersionList', $newerDraftVersionList );
  267. $tpl->setVariable( 'newerDraftVersionListCount', $newerDraftVersionListCount );
  268. $tpl->setVariable( 'view_parameters', $viewParameters );
  269. $tpl->setVariable( 'object', $object );
  270. $tpl->setVariable( 'edit_version', $EditVersion );
  271. $tpl->setVariable( 'versions', $versions );
  272. $tpl->setVariable( 'edit_warning', $editWarning );
  273. $tpl->setVariable( 'can_edit', $canEdit );
  274. //$tpl->setVariable( 'can_remove', $canRemove );
  275. $tpl->setVariable( 'user_id', $user->attribute( 'contentobject_id' ) );
  276. $Result = array();
  277. $Result['content'] = $tpl->fetch( 'design:content/history.tpl' );
  278. $Result['path'] = array( array( 'text' => ezpI18n::tr( 'kernel/content', 'History' ),
  279. 'url' => false ) );
  280. if ( $section )
  281. {
  282. $Result['navigation_part'] = $section->attribute( 'navigation_part_identifier' );
  283. $Result['section_id'] = $section->attribute( 'id' );
  284. }
  285. ?>