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']); 34*b59355cdSSzymon 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']); 39*b59355cdSSzymon 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 49*b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 50*b59355cdSSzymon 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 76*b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 77*b59355cdSSzymon 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 97*b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 98*b59355cdSSzymon 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 121*b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 122*b59355cdSSzymon 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) { 1391989ee26SSzymon Olewniczak global $INFO; 140bab76148SSzymon Olewniczak 1411989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 1421989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 1431989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 144329c5e3aSMartin Diedrich 1454474ed8aSSzymon Olewniczak $last_change_date = @filemtime(wikiFN($INFO['id'])); 1464474ed8aSSzymon Olewniczak $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev']; 1471aeb2b4dSghi 14855f447f4SSzymon Olewniczak 149*b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 150*b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 1514474ed8aSSzymon Olewniczak 1521989ee26SSzymon Olewniczak $page_revision = $db->getPageRevision($INFO['id'], $rev); 1531989ee26SSzymon Olewniczak $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 1544474ed8aSSzymon Olewniczak 1554474ed8aSSzymon Olewniczak $classes = []; 1561989ee26SSzymon Olewniczak if ($page_revision['status'] == 'approved' && $rev == $last_approved_rev) { 15715e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_approved'; 1581989ee26SSzymon Olewniczak } elseif ($page_revision['status'] == 'approved') { 15915e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_old_approved'; 1601989ee26SSzymon Olewniczak } elseif ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') { 161bab76148SSzymon Olewniczak $classes[] = 'plugin__approve_ready'; 16255f447f4SSzymon Olewniczak } else { 16315e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_draft'; 16455f447f4SSzymon Olewniczak } 16555f447f4SSzymon Olewniczak 166*b59355cdSSzymon Olewniczak echo '<div id="plugin__approve" class="' . implode(' ', $classes) . '">'; 1671aeb2b4dSghi 168af3e3cd8SSzymon Olewniczak 1691989ee26SSzymon Olewniczak if ($page_revision['status'] == 'approved') { 170*b59355cdSSzymon Olewniczak echo '<strong>'.$this->getLang('approved').'</strong>'; 171*b59355cdSSzymon Olewniczak echo ' ' . dformat(strtotime($page_revision['approved'])); 172329c5e3aSMartin Diedrich 173329c5e3aSMartin Diedrich if($this->getConf('banner_long')) { 174*b59355cdSSzymon Olewniczak echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true); 175*b59355cdSSzymon Olewniczak echo ' (' . $this->getLang('version') . ': ' . $page_revision['version'] . ')'; 176329c5e3aSMartin Diedrich } 1774474ed8aSSzymon Olewniczak 1784474ed8aSSzymon Olewniczak //not the newest page 1794474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 1804474ed8aSSzymon Olewniczak // we can see drafts 1811989ee26SSzymon Olewniczak if ($acl->clientCanSeeDrafts($INFO['id'])) { 182*b59355cdSSzymon Olewniczak echo '<a href="' . wl($INFO['id']) . '">'; 183*b59355cdSSzymon Olewniczak echo $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft'); 184*b59355cdSSzymon Olewniczak echo '</a>'; 185c7d53eabSSzymon Olewniczak // we cannot see link to draft but there is some newer approved version 1861989ee26SSzymon Olewniczak } elseif ($last_approved_rev != $rev) { 1874474ed8aSSzymon Olewniczak $urlParameters = []; 1881989ee26SSzymon Olewniczak if ($last_approved_rev != $last_change_date) { 1891989ee26SSzymon Olewniczak $urlParameters['rev'] = $last_approved_rev; 1904474ed8aSSzymon Olewniczak } 191*b59355cdSSzymon Olewniczak echo '<a href="' . wl($INFO['id'], $urlParameters) . '">'; 192*b59355cdSSzymon Olewniczak echo $this->getLang('newest_approved'); 193*b59355cdSSzymon Olewniczak echo '</a>'; 1941aeb2b4dSghi } 1954474ed8aSSzymon Olewniczak } 1964474ed8aSSzymon Olewniczak 1971aeb2b4dSghi } else { 1981989ee26SSzymon Olewniczak if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') { 199*b59355cdSSzymon Olewniczak echo '<strong>'.$this->getLang('marked_approve_ready').'</strong>'; 200*b59355cdSSzymon Olewniczak echo ' ' . dformat(strtotime($page_revision['ready_for_approval'])); 201*b59355cdSSzymon Olewniczak echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true); 202c7d53eabSSzymon Olewniczak } else { 203*b59355cdSSzymon Olewniczak echo '<strong>'.$this->getLang('draft').'</strong>'; 20484047bdaSRuud } 20584047bdaSRuud 2064474ed8aSSzymon Olewniczak // not exists approve for current page 2071989ee26SSzymon Olewniczak if ($last_approved_rev == null) { 2084474ed8aSSzymon Olewniczak // not the newest page 2094474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 210*b59355cdSSzymon Olewniczak echo '<a href="'.wl($INFO['id']).'">'; 211*b59355cdSSzymon Olewniczak echo $this->getLang('newest_draft'); 212*b59355cdSSzymon Olewniczak echo '</a>'; 213274d699aSghi } 214274d699aSghi } else { 2154474ed8aSSzymon Olewniczak $urlParameters = []; 2161989ee26SSzymon Olewniczak if ($last_approved_rev != $last_change_date) { 2171989ee26SSzymon Olewniczak $urlParameters['rev'] = $last_approved_rev; 2184474ed8aSSzymon Olewniczak } 219*b59355cdSSzymon Olewniczak echo '<a href="' . wl($INFO['id'], $urlParameters) . '">'; 220*b59355cdSSzymon Olewniczak echo $this->getLang('newest_approved'); 221*b59355cdSSzymon Olewniczak echo '</a>'; 2221aeb2b4dSghi } 2231aeb2b4dSghi 2244474ed8aSSzymon Olewniczak //we are in current page 2254474ed8aSSzymon Olewniczak if ($rev == $last_change_date) { 2264474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && 2271989ee26SSzymon Olewniczak $acl->clientCanMarkReadyForApproval($INFO['id']) && 2281989ee26SSzymon Olewniczak $page_revision['status'] != 'ready_for_approval') { 2294474ed8aSSzymon Olewniczak 2304474ed8aSSzymon Olewniczak $urlParameters = [ 2314474ed8aSSzymon Olewniczak 'rev' => $last_approved_rev, 2324474ed8aSSzymon Olewniczak 'do' => 'diff', 2334474ed8aSSzymon Olewniczak 'ready_for_approval' => 'ready_for_approval' 2344474ed8aSSzymon Olewniczak ]; 235*b59355cdSSzymon Olewniczak echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">'; 236*b59355cdSSzymon Olewniczak echo $this->getLang('approve_ready'); 237*b59355cdSSzymon Olewniczak echo '</a>'; 23884047bdaSRuud } 23984047bdaSRuud 2401989ee26SSzymon Olewniczak if ($acl->clientCanApprove($INFO['id'])) { 2414474ed8aSSzymon Olewniczak $urlParameters = [ 2424474ed8aSSzymon Olewniczak 'rev' => $last_approved_rev, 2434474ed8aSSzymon Olewniczak 'do' => 'diff', 2444474ed8aSSzymon Olewniczak 'approve' => 'approve' 2454474ed8aSSzymon Olewniczak ]; 246*b59355cdSSzymon Olewniczak echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">'; 247*b59355cdSSzymon Olewniczak echo $this->getLang('approve'); 248*b59355cdSSzymon Olewniczak echo '</a>'; 2491aeb2b4dSghi } 250c7d53eabSSzymon Olewniczak } 251c7d53eabSSzymon Olewniczak } 25284047bdaSRuud 2531989ee26SSzymon Olewniczak if (isset($page_metadata['approver']) & $this->getConf('banner_long')) { 254*b59355cdSSzymon Olewniczak echo ' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true); 2554474ed8aSSzymon Olewniczak } 256c7d53eabSSzymon Olewniczak 257*b59355cdSSzymon Olewniczak echo '</div>'; 2581aeb2b4dSghi } 2591aeb2b4dSghi 260af3e3cd8SSzymon Olewniczak /** 2614474ed8aSSzymon Olewniczak * 2621989ee26SSzymon Olewniczak * @param Event $event 2634474ed8aSSzymon Olewniczak */ 2641989ee26SSzymon Olewniczak public function handle_pagesave_after(Event $event) { 2651b552e87SSzymon Olewniczak //no content was changed 2664474ed8aSSzymon Olewniczak if (!$event->data['contentChanged']) return; 2674474ed8aSSzymon Olewniczak 268*b59355cdSSzymon Olewniczak /** @var helper_plugin_approve_db $db */ 269*b59355cdSSzymon Olewniczak $db = $this->loadHelper('approve_db'); 2704474ed8aSSzymon Olewniczak 2714474ed8aSSzymon Olewniczak $id = $event->data['id']; 2721989ee26SSzymon Olewniczak switch ($event->data['changeType']) { 2731989ee26SSzymon Olewniczak case DOKU_CHANGE_TYPE_CREATE: 2744474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_EDIT: 2754474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_MINOR_EDIT: 2761989ee26SSzymon Olewniczak case DOKU_CHANGE_TYPE_REVERT: 2771989ee26SSzymon Olewniczak $db->handlePageEdit($id); 2784474ed8aSSzymon Olewniczak break; 2794474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_DELETE: 2801989ee26SSzymon Olewniczak $db->handlePageDelete($id); 2814474ed8aSSzymon Olewniczak break; 2824474ed8aSSzymon Olewniczak } 2834474ed8aSSzymon Olewniczak } 2841aeb2b4dSghi} 285