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

/extensions/history/HistoryController.php

https://code.google.com/p/ontowiki/
PHP | 351 lines | 242 code | 60 blank | 49 comment | 39 complexity | 13d8094d8d5fd7d676435ece087a447c MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause
  1. <?php
  2. /**
  3. * History component controller.
  4. *
  5. * @category OntoWiki
  6. * @package OntoWiki_extensions_components_history
  7. * @author Christoph Rie?&#x; <c.riess.dev@googlemail.com>
  8. * @copyright Copyright (c) 2009, {@link http://aksw.org AKSW}
  9. * @license http://opensource.org/licenses/gpl-license.php GNU General Public License (GPL)
  10. * @version $Id: HistoryController.php 4090 2009-08-19 22:10:54Z christian.wuerker $
  11. */
  12. class HistoryController extends OntoWiki_Controller_Component
  13. {
  14. /**
  15. * Listing history for selected Resource
  16. */
  17. public function listAction()
  18. {
  19. $model = $this->_owApp->selectedModel;
  20. $translate = $this->_owApp->translate;
  21. $store = $this->_erfurt->getStore();
  22. $resource = $this->_owApp->selectedResource;
  23. $ac = $this->_erfurt->getAc();
  24. $params = $this->_request->getParams();
  25. $limit = 20;
  26. // redirecting to home if no model/resource is selected
  27. if (empty($model) || (empty($this->_owApp->selectedResource) && empty($params['r']) && $this->_owApp->lastRoute !== 'instances')) {
  28. $this->_abort('No model/resource selected.', OntoWiki_Message::ERROR);
  29. }
  30. // getting page (from and for paging)
  31. if (!empty($params['page']) && (int) $params['page'] > 0) {
  32. $page = (int) $params['page'];
  33. } else {
  34. $page = 1;
  35. }
  36. // enabling versioning
  37. $versioning = $this->_erfurt->getVersioning();
  38. $versioning->setLimit($limit);
  39. if (!$versioning->isVersioningEnabled()) {
  40. $this->_abort('Versioning/History is currently disabled', null, false);
  41. }
  42. $singleResource = true;
  43. // setting if class or instances
  44. if ($this->_owApp->lastRoute === 'instances') {
  45. // setting default title
  46. $title = $resource->getTitle() ? $resource->getTitle() : OntoWiki_Utils::contractNamespace($resource->getIri());
  47. $windowTitle = $translate->_('Versions for elements of the list');
  48. $listHelper = Zend_Controller_Action_HelperBroker::getStaticHelper('List');
  49. $listName = "instances";
  50. if($listHelper->listExists($listName)){
  51. $list = $listHelper->getList($listName);
  52. } else {
  53. $this->_owApp->appendMessage(
  54. new OntoWiki_Message('something went wrong with the list of instances', OntoWiki_Message::ERROR)
  55. );
  56. }
  57. $query = $list->getResourceQuery();
  58. $query->setLimit(0);
  59. $query->setOffset(0);
  60. //echo htmlentities($query);
  61. $results = $model->sparqlQuery($query);
  62. $resourceVar = $list->getResourceVar()->getName();
  63. $resources = array();
  64. foreach ($results as $result) {
  65. $resources[] = $result[$resourceVar];
  66. }
  67. //var_dump($resources);
  68. $historyArray = $versioning->getHistoryForResourceList(
  69. $resources,
  70. (string) $this->_owApp->selectedModel,
  71. $page
  72. );
  73. $singleResource = false;
  74. } else {
  75. // setting default title
  76. $title = $resource->getTitle() ? $resource->getTitle() : OntoWiki_Utils::contractNamespace($resource->getIri());
  77. $windowTitle = sprintf($translate->_('Versions for %1$s'), $title);
  78. $historyArray = $versioning->getHistoryForResource(
  79. (string)$resource,
  80. (string)$this->_owApp->selectedModel,
  81. $page
  82. );
  83. }
  84. if (sizeof($historyArray) == ( $limit + 1 ) ) {
  85. $count = $page * $limit + 1;
  86. unset($historyArray[$limit]);
  87. } else {
  88. $count = ($page - 1) * $limit + sizeof($historyArray);
  89. }
  90. $idArray = array();
  91. $userArray = $this->_erfurt->getUsers();
  92. $titleHelper = new OntoWiki_Model_TitleHelper();
  93. // Load IDs for rollback and Username Labels for view
  94. foreach ($historyArray as $key => $entry) {
  95. $idArray[] = (int) $entry['id'];
  96. if(!$singleResource){
  97. $historyArray[$key]['url'] = $this->_config->urlBase . "view?r=" . urlencode($entry['resource']);
  98. $titleHelper->addResource($entry['resource']);
  99. }
  100. if ($entry['useruri'] == $this->_erfurt->getConfig()->ac->user->anonymousUser) {
  101. $userArray[$entry['useruri']] = 'Anonymous';
  102. } elseif ($entry['useruri'] == $this->_erfurt->getConfig()->ac->user->superAdmin) {
  103. $userArray[$entry['useruri']] = 'SuperAdmin';
  104. } elseif (
  105. is_array($userArray[$entry['useruri']]) &&
  106. array_key_exists('userName',$userArray[$entry['useruri']])
  107. ) {
  108. $userArray[$entry['useruri']] = $userArray[$entry['useruri']]['userName'];
  109. }
  110. }
  111. $this->view->userArray = $userArray;
  112. $this->view->idArray = $idArray;
  113. $this->view->historyArray = $historyArray;
  114. $this->view->singleResource = $singleResource;
  115. $this->view->titleHelper = $titleHelper;
  116. if (empty($historyArray)) {
  117. $this->_owApp->appendMessage(
  118. new OntoWiki_Message(
  119. 'No matches.' ,
  120. OntoWiki_Message::INFO
  121. )
  122. );
  123. }
  124. if ($this->_erfurt->getAc()->isActionAllowed('Rollback')) {
  125. $this->view->rollbackAllowed = true;
  126. // adding submit button for rollback-action
  127. $toolbar = $this->_owApp->toolbar;
  128. $toolbar->appendButton(
  129. OntoWiki_Toolbar::SUBMIT,
  130. array('name' => $translate->_('Rollback changes'), 'id' => 'history-rollback')
  131. );
  132. $this->view->placeholder('main.window.toolbar')->set($toolbar);
  133. } else {
  134. $this->view->rollbackAllowed = false;
  135. }
  136. // paging
  137. $statusBar = $this->view->placeholder('main.window.statusbar');
  138. OntoWiki_Pager::setOptions(array('page_param'=>'page')); // the normal page_param p collides with the generic-list param p
  139. $statusBar->append(OntoWiki_Pager::get($count,$limit));
  140. // setting view variables
  141. $url = new OntoWiki_Url(array('controller' => 'history', 'action' => 'rollback'));
  142. $this->view->placeholder('main.window.title')->set($windowTitle);
  143. $this->view->formActionUrl = (string) $url;
  144. $this->view->formMethod = 'post';
  145. // $this->view->formName = 'instancelist';
  146. $this->view->formName = 'history-rollback';
  147. $this->view->formEncoding = 'multipart/form-data';
  148. }
  149. /**
  150. * Restoring actions that are specified within the POST parameter
  151. */
  152. public function rollbackAction()
  153. {
  154. $resource = $this->_owApp->selectedResource;
  155. $graphuri = (string) $this->_owApp->selectedModel;
  156. $translate = $this->_owApp->translate;
  157. $params = $this->_request->getParams();
  158. // abort on missing parameters
  159. if (!array_key_exists('actionid',$params) || empty($resource) || empty($graphuri)) {
  160. $this->_abort('missing parameters.', OntoWiki_Message::ERROR);
  161. }
  162. // set active tab to history
  163. Ontowiki_Navigation::setActive('history');
  164. // setting default title
  165. $title = $resource->getTitle() ? $resource->getTitle() : OntoWiki_Utils::contractNamespace($resource->getIri());
  166. $windowTitle = sprintf($translate->_('Versions for %1$s'), $title);
  167. $this->view->placeholder('main.window.title')->set($windowTitle);
  168. // setting more view variables
  169. $url = new OntoWiki_Url(array('controller' => 'view', 'action' => 'index' ), null);
  170. $this->view->backUrl = (string) $url;
  171. // set translate on view
  172. $this->view->translate = $this->_owApp->translate;
  173. // abort on insufficient rights
  174. if (!$this->_erfurt->getAc()->isActionAllowed('Rollback')) {
  175. $this->_abort('not allowed.', OntoWiki_Message::ERROR);
  176. }
  177. // enabling versioning
  178. $versioning = $this->_erfurt->getVersioning();
  179. if (!$versioning->isVersioningEnabled()) {
  180. $this->_abort('versioning / history is currently disabled.', null, false);
  181. }
  182. $successIDs = array();
  183. $errorIDs = array();
  184. $actionids = array();
  185. // starting rollback action
  186. $actionSpec = array(
  187. 'modeluri' => $graphuri ,
  188. 'type' => Erfurt_Versioning::STATEMENTS_ROLLBACK,
  189. 'resourceuri' => (string) $resource
  190. );
  191. $versioning->startAction($actionSpec);
  192. // Trying to rollback actions from POST parameters (style: serialized in actionid)
  193. foreach (unserialize($params['actionid']) as $id) {
  194. if ( $versioning->rollbackAction($id) ) {
  195. $successIDs[] = $id;
  196. } else {
  197. $errorIDs[] = $id;
  198. }
  199. }
  200. // ending rollback action
  201. $versioning->endAction();
  202. // adding messages for errors and success
  203. if (!empty($successIDs)) {
  204. $this->_owApp->appendMessage(
  205. new OntoWiki_Message(
  206. 'Rolled back action(s): ' . implode(', ',$successIDs) ,
  207. OntoWiki_Message::SUCCESS
  208. )
  209. );
  210. }
  211. if (!empty($errorIDs)) {
  212. $this->_owApp->appendMessage(
  213. new OntoWiki_Message(
  214. 'Error on rollback of action(s): ' . implode(', ',$errorIDs) ,
  215. OntoWiki_Message::ERROR
  216. )
  217. );
  218. }
  219. }
  220. /**
  221. * Service to generate small HTML for Action-Details-AJAX-Integration inside Ontowiki
  222. */
  223. public function detailsAction()
  224. {
  225. $params = $this->_request->getParams();
  226. if (empty($params['id'])) {
  227. $this->_abort('missing parameters.');
  228. } else {
  229. $actionID = (int) $params['id'];
  230. }
  231. // disabling layout as it is used as a service
  232. $this->_helper->layout()->disableLayout();
  233. $this->view->isEmpty = true;
  234. // enabling versioning
  235. $versioning = $this->_erfurt->getVersioning();
  236. $detailsArray = $versioning->getDetailsForAction($actionID);
  237. $stAddArray = array();
  238. $stDelArray = array();
  239. $stOtherArray = array();
  240. function toFlatArray($serializedString) {
  241. $walkArray = unserialize($serializedString);
  242. foreach ($walkArray as $subject => $a) {
  243. foreach ($a as $predicate => $b) {
  244. foreach ($b as $object) {
  245. return array($subject, $predicate, $object['value']);
  246. }
  247. }
  248. }
  249. }
  250. foreach ($detailsArray as $entry) {
  251. $this->view->isEmpty = false;
  252. $type = (int) $entry['action_type'];
  253. if ( $type === Erfurt_Versioning::STATEMENT_ADDED ) {
  254. $stAddArray[] = toFlatArray($entry['statement_hash']);
  255. } elseif ( $type === Erfurt_Versioning::STATEMENT_REMOVED ) {
  256. $stDelArray[] = toFlatArray($entry['statement_hash']);
  257. } else {
  258. $stOtherArray[] = toFlatArray($entry['statement_hash']);
  259. }
  260. }
  261. $this->view->translate = $this->_owApp->translate;
  262. $this->view->actionID = $actionID;
  263. $this->view->stAddArray = $stAddArray;
  264. $this->view->stDelArray = $stDelArray;
  265. $this->view->stOtherArray = $stOtherArray;
  266. }
  267. /**
  268. * Shortcut for adding messages
  269. */
  270. private function _abort($msg, $type = null, $redirect = null)
  271. {
  272. if (empty($type)) {
  273. $type = OntoWiki_Message::INFO;
  274. }
  275. $this->_owApp->appendMessage(
  276. new OntoWiki_Message(
  277. $msg ,
  278. $type
  279. )
  280. );
  281. if (empty($redirect)) {
  282. if ($redirect !== false) {
  283. $this->_redirect($this->_config->urlBase);
  284. }
  285. } else {
  286. $this->redirect((string)$redirect);
  287. }
  288. return true;
  289. }
  290. //TODO generate feed about resource
  291. }