PageRenderTime 27ms CodeModel.GetById 19ms RepoModel.GetById 0ms app.codeStats 0ms

/kernel/content/history.php

https://github.com/eeggenberger/ezpublish
PHP | 376 lines | 304 code | 51 blank | 21 comment | 54 complexity | 45047c0db9b7b147fc4dd6ba97421b82 MD5 | raw file
  1. <?php
  2. /**
  3. * @copyright Copyright (C) 1999-2011 eZ Systems AS. All rights reserved.
  4. * @license http://www.gnu.org/licenses/gpl-2.0.txt GNU General Public License v2
  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. // Check the version limit for the object's class
  228. $versionlimit = eZContentClass::versionHistoryLimit( $object->attribute( 'contentclass_id' ) );
  229. $versionCount = $object->getVersionCount();
  230. if ( $versionCount < $versionlimit )
  231. {
  232. $db = eZDB::instance();
  233. $db->begin();
  234. $newVersionID = $object->copyRevertTo( $versionID, $language );
  235. $db->commit();
  236. if ( !$http->hasPostVariable( 'DoNotEditAfterCopy' ) )
  237. {
  238. return $Module->redirectToView( 'edit', array( $ObjectID, $newVersionID, $language ) );
  239. }
  240. }
  241. else
  242. {
  243. $params = array( 'conditions'=> array( 'status' => eZContentObjectVersion::STATUS_ARCHIVED ) );
  244. $versions = $object->versions( true, $params );
  245. if ( count( $versions ) > 0 )
  246. {
  247. $modified = $versions[0]->attribute( 'modified' );
  248. $removeVersion = $versions[0];
  249. foreach ( $versions as $version )
  250. {
  251. $currentModified = $version->attribute( 'modified' );
  252. if ( $currentModified < $modified )
  253. {
  254. $modified = $currentModified;
  255. $removeVersion = $version;
  256. }
  257. }
  258. $db = eZDB::instance();
  259. $db->begin();
  260. $removeVersion->removeThis();
  261. $newVersionID = $object->copyRevertTo( $versionID, $language );
  262. $db->commit();
  263. if ( !$http->hasPostVariable( 'DoNotEditAfterCopy' ) )
  264. {
  265. return $Module->redirectToView( 'edit', array( $ObjectID, $newVersionID, $language ) );
  266. }
  267. }
  268. else
  269. {
  270. $http->setSessionVariable( 'ExcessVersionHistoryLimit', true );
  271. $currentVersion = $object->attribute( 'current_version' );
  272. $Module->redirectToView( 'history', array( $ObjectID, $currentVersion ) );
  273. return eZModule::HOOK_STATUS_CANCEL_RUN;
  274. }
  275. }
  276. }
  277. $res = eZTemplateDesignResource::instance();
  278. $res->setKeys( array( array( 'object', $object->attribute( 'id' ) ), // Object ID
  279. array( 'remote_id', $object->attribute( 'remote_id' ) ),
  280. array( 'class', $object->attribute( 'contentclass_id' ) ), // Class ID
  281. array( 'class_identifier', $object->attribute( 'class_identifier' ) ), // Class identifier
  282. array( 'section_id', $object->attribute( 'section_id' ) ), // Section ID, typo, deprecated
  283. array( 'section', $object->attribute( 'section_id' ) ) // Section ID
  284. ) ); // Section ID, 0 so far
  285. $section = eZSection::fetch( $object->attribute( 'section_id' ) );
  286. if( $section )
  287. {
  288. $res->setKeys( array( array( 'section_identifier', $section->attribute( 'identifier' ) ) ) );
  289. }
  290. $versionArray =( isset( $versionArray ) and is_array( $versionArray ) ) ? array_unique( $versionArray ) : array();
  291. $LastAccessesVersionURI = $http->hasSessionVariable( 'LastAccessesVersionURI' ) ? $http->sessionVariable( 'LastAccessesVersionURI' ) : null;
  292. $explodedURI = $LastAccessesVersionURI ? explode ( '/', $LastAccessesVersionURI ) : null;
  293. if ( $LastAccessesVersionURI and is_array( $versionArray ) and !in_array( $explodedURI[3], $versionArray ) )
  294. $tpl->setVariable( 'redirect_uri', $http->sessionVariable( 'LastAccessesVersionURI' ) );
  295. //Fetch newer drafts and count of newer drafts.
  296. $newerDraftVersionList = eZPersistentObject::fetchObjectList( eZContentObjectVersion::definition(),
  297. null,
  298. array( 'contentobject_id' => $object->attribute( 'id' ),
  299. 'status' => eZContentObjectVersion::STATUS_DRAFT,
  300. 'version' => array( '>', $object->attribute( 'current_version' ) ) ),
  301. array( 'modified' => 'asc',
  302. 'initial_language_id' => 'desc' ),
  303. null, true );
  304. $newerDraftVersionListCount = is_array( $newerDraftVersionList ) ? count( $newerDraftVersionList ) : 0;
  305. $versions = $object->versions();
  306. $tpl->setVariable( 'newerDraftVersionList', $newerDraftVersionList );
  307. $tpl->setVariable( 'newerDraftVersionListCount', $newerDraftVersionListCount );
  308. $tpl->setVariable( 'view_parameters', $viewParameters );
  309. $tpl->setVariable( 'object', $object );
  310. $tpl->setVariable( 'edit_version', $EditVersion );
  311. $tpl->setVariable( 'versions', $versions );
  312. $tpl->setVariable( 'edit_warning', $editWarning );
  313. $tpl->setVariable( 'can_edit', $canEdit );
  314. //$tpl->setVariable( 'can_remove', $canRemove );
  315. $tpl->setVariable( 'user_id', $user->attribute( 'contentobject_id' ) );
  316. $Result = array();
  317. $Result['content'] = $tpl->fetch( 'design:content/history.tpl' );
  318. $Result['path'] = array( array( 'text' => ezpI18n::tr( 'kernel/content', 'History' ),
  319. 'url' => false ) );
  320. if ( $section )
  321. {
  322. $Result['navigation_part'] = $section->attribute( 'navigation_part_identifier' );
  323. $Result['section_id'] = $section->attribute( 'id' );
  324. }
  325. ?>