11aeb2b4dSghi<?php 21aeb2b4dSghi 31989ee26SSzymon Olewniczakuse dokuwiki\Extension\ActionPlugin; 41989ee26SSzymon Olewniczakuse dokuwiki\Extension\EventHandler; 51989ee26SSzymon Olewniczakuse dokuwiki\Extension\Event; 61aeb2b4dSghi 71989ee26SSzymon Olewniczakclass action_plugin_approve_approve extends ActionPlugin { 81b552e87SSzymon Olewniczak /** 91989ee26SSzymon Olewniczak * @inheritDoc 104474ed8aSSzymon Olewniczak */ 111989ee26SSzymon Olewniczak public function register(EventHandler $controller) { 124474ed8aSSzymon Olewniczak $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept'); 134474ed8aSSzymon Olewniczak $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev'); 144474ed8aSSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve'); 1507b13373SSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_mark_ready_for_approval'); 164474ed8aSSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer'); 174474ed8aSSzymon Olewniczak $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner'); 1855f447f4SSzymon Olewniczak $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); 191aeb2b4dSghi } 201aeb2b4dSghi 214474ed8aSSzymon Olewniczak /** 221989ee26SSzymon Olewniczak * @param Event $event 234474ed8aSSzymon Olewniczak */ 241989ee26SSzymon Olewniczak public function handle_diff_accept(Event $event) { 254474ed8aSSzymon Olewniczak global $INFO; 264474ed8aSSzymon Olewniczak 271989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 281989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 290c60a293SSzymon Olewniczak 301989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 3150481663SSzymon Olewniczak 321aeb2b4dSghi if ($event->data == 'diff' && isset($_GET['approve'])) { 334474ed8aSSzymon Olewniczak $href = wl($INFO['id'], ['approve' => 'approve']); 34b59355cdSSzymon Olewniczak echo '<a href="' . $href . '">'.$this->getLang('approve').'</a>'; 351aeb2b4dSghi } 3684047bdaSRuud 374474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) { 384474ed8aSSzymon Olewniczak $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']); 39b59355cdSSzymon Olewniczak echo '<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>'; 4084047bdaSRuud } 411aeb2b4dSghi } 421aeb2b4dSghi 434474ed8aSSzymon Olewniczak /** 441989ee26SSzymon Olewniczak * @param Event $event 454474ed8aSSzymon Olewniczak */ 461989ee26SSzymon Olewniczak public function handle_showrev(Event $event) { 474474ed8aSSzymon Olewniczak global $INFO; 481aeb2b4dSghi 49b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 50b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 511989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 521989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 534474ed8aSSzymon Olewniczak 541989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 550c60a293SSzymon Olewniczak 561989ee26SSzymon Olewniczak $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 574474ed8aSSzymon Olewniczak if ($last_approved_rev == $INFO['rev']) { 581aeb2b4dSghi $event->preventDefault(); 591aeb2b4dSghi } 601aeb2b4dSghi } 611aeb2b4dSghi 624474ed8aSSzymon Olewniczak /** 631989ee26SSzymon Olewniczak * @param Event $event 644474ed8aSSzymon Olewniczak */ 651989ee26SSzymon Olewniczak public function handle_approve(Event $event) { 664474ed8aSSzymon Olewniczak global $INFO; 674474ed8aSSzymon Olewniczak 681989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 691989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 700c60a293SSzymon Olewniczak 7107b13373SSzymon Olewniczak if ($event->data != 'show') return; 7207b13373SSzymon Olewniczak if (!isset($_GET['approve'])) return; 731989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 741989ee26SSzymon Olewniczak if (!$acl->clientCanApprove($INFO['id'])) return; 754474ed8aSSzymon Olewniczak 76b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 77b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 781989ee26SSzymon Olewniczak $db->setApprovedStatus($INFO['id']); 7984047bdaSRuud 804474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 8107b13373SSzymon Olewniczak } 8207b13373SSzymon Olewniczak 8307b13373SSzymon Olewniczak /** 841989ee26SSzymon Olewniczak * @param Event $event 8507b13373SSzymon Olewniczak */ 861989ee26SSzymon Olewniczak public function handle_mark_ready_for_approval(Event $event) { 8707b13373SSzymon Olewniczak global $INFO; 8807b13373SSzymon Olewniczak 891989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 901989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 910c60a293SSzymon Olewniczak 9207b13373SSzymon Olewniczak if ($event->data != 'show') return; 9307b13373SSzymon Olewniczak if (!isset($_GET['ready_for_approval'])) return; 941989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 951989ee26SSzymon Olewniczak if (!$acl->clientCanMarkReadyForApproval($INFO['id'])) return; 9650481663SSzymon Olewniczak 97b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 98b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 991989ee26SSzymon Olewniczak $db->setReadyForApprovalStatus($INFO['id']); 10050481663SSzymon Olewniczak 1014474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 1021aeb2b4dSghi } 10355f447f4SSzymon Olewniczak 1044474ed8aSSzymon Olewniczak /** 1051989ee26SSzymon Olewniczak * Redirect to latest approved page for user that don't have EDIT permission. 1064474ed8aSSzymon Olewniczak * 1071989ee26SSzymon Olewniczak * @param Event $event 1084474ed8aSSzymon Olewniczak */ 1091989ee26SSzymon Olewniczak public function handle_viewer(Event $event) { 1104474ed8aSSzymon Olewniczak global $INFO; 1114474ed8aSSzymon Olewniczak 1121989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 1131989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 1140c60a293SSzymon Olewniczak 11538d03fbdSghi if ($event->data != 'show') return; 1164474ed8aSSzymon Olewniczak //apply only to current page 117c7d53eabSSzymon Olewniczak if ($INFO['rev'] != 0) return; 1181989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 1191989ee26SSzymon Olewniczak if ($acl->clientCanSeeDrafts($INFO['id'])) return; 1201aeb2b4dSghi 121b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 122b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 1231989ee26SSzymon Olewniczak $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 1241989ee26SSzymon Olewniczak 12538d03fbdSghi //no page is approved 1264474ed8aSSzymon Olewniczak if (!$last_approved_rev) return; 12738d03fbdSghi 1284474ed8aSSzymon Olewniczak $last_change_date = @filemtime(wikiFN($INFO['id'])); 1294474ed8aSSzymon Olewniczak // current page is approved 1304474ed8aSSzymon Olewniczak if ($last_approved_rev == $last_change_date) return; 1314474ed8aSSzymon Olewniczak 132de24d3c4SSzymon Olewniczak header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev], false, '&')); 1331aeb2b4dSghi } 13455f447f4SSzymon Olewniczak 1354474ed8aSSzymon Olewniczak /** 1361989ee26SSzymon Olewniczak * @param Event $event 1374474ed8aSSzymon Olewniczak */ 1381989ee26SSzymon Olewniczak public function handle_display_banner(Event $event) { 139*4438242dSSzymon Olewniczak global $conf; 140bab76148SSzymon Olewniczak 141*4438242dSSzymon Olewniczak // for the sprintdoc template we have special integrations 142*4438242dSSzymon Olewniczak if ($conf['template'] == 'sprintdoc') return; 1433c40d78bSSzymon Olewniczak 144*4438242dSSzymon Olewniczak /** @var helper_plugin_approve_tpl $tpl */ 145*4438242dSSzymon Olewniczak $tpl = $this->loadHelper('approve_tpl'); 146*4438242dSSzymon Olewniczak $tpl->banner($event->data); 1471aeb2b4dSghi } 1481aeb2b4dSghi 149af3e3cd8SSzymon Olewniczak /** 1504474ed8aSSzymon Olewniczak * 1511989ee26SSzymon Olewniczak * @param Event $event 1524474ed8aSSzymon Olewniczak */ 1531989ee26SSzymon Olewniczak public function handle_pagesave_after(Event $event) { 1541b552e87SSzymon Olewniczak //no content was changed 1554474ed8aSSzymon Olewniczak if (!$event->data['contentChanged']) return; 1564474ed8aSSzymon Olewniczak 157b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 158b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 1594474ed8aSSzymon Olewniczak 1604474ed8aSSzymon Olewniczak $id = $event->data['id']; 1611989ee26SSzymon Olewniczak switch ($event->data['changeType']) { 1621989ee26SSzymon Olewniczak case DOKU_CHANGE_TYPE_CREATE: 1634474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_EDIT: 1644474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_MINOR_EDIT: 1651989ee26SSzymon Olewniczak case DOKU_CHANGE_TYPE_REVERT: 1661989ee26SSzymon Olewniczak $db->handlePageEdit($id); 1674474ed8aSSzymon Olewniczak break; 1684474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_DELETE: 1691989ee26SSzymon Olewniczak $db->handlePageDelete($id); 1704474ed8aSSzymon Olewniczak break; 1714474ed8aSSzymon Olewniczak } 1724474ed8aSSzymon Olewniczak } 1731aeb2b4dSghi} 174