11aeb2b4dSghi<?php 21aeb2b4dSghi 3*1989ee26SSzymon Olewniczakuse dokuwiki\Extension\ActionPlugin; 4*1989ee26SSzymon Olewniczakuse dokuwiki\Extension\EventHandler; 5*1989ee26SSzymon Olewniczakuse dokuwiki\Extension\Event; 61aeb2b4dSghi 7*1989ee26SSzymon Olewniczakclass action_plugin_approve_approve extends ActionPlugin { 81b552e87SSzymon Olewniczak /** 9*1989ee26SSzymon Olewniczak * @inheritDoc 104474ed8aSSzymon Olewniczak */ 11*1989ee26SSzymon 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 /** 22*1989ee26SSzymon Olewniczak * @param Event $event 234474ed8aSSzymon Olewniczak */ 24*1989ee26SSzymon Olewniczak public function handle_diff_accept(Event $event) { 254474ed8aSSzymon Olewniczak global $INFO; 264474ed8aSSzymon Olewniczak 27*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 28*1989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 290c60a293SSzymon Olewniczak 30*1989ee26SSzymon 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']); 344474ed8aSSzymon Olewniczak ptln('<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']); 39058bad72SSzymon Olewniczak ptln('<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>'); 4084047bdaSRuud } 411aeb2b4dSghi } 421aeb2b4dSghi 434474ed8aSSzymon Olewniczak /** 44*1989ee26SSzymon Olewniczak * @param Event $event 454474ed8aSSzymon Olewniczak */ 46*1989ee26SSzymon Olewniczak public function handle_showrev(Event $event) { 474474ed8aSSzymon Olewniczak global $INFO; 481aeb2b4dSghi 49*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_data $db */ 50*1989ee26SSzymon Olewniczak $db = $this->loadHelper('approve_data'); 51*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 52*1989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 534474ed8aSSzymon Olewniczak 54*1989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 550c60a293SSzymon Olewniczak 56*1989ee26SSzymon 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 /** 63*1989ee26SSzymon Olewniczak * @param Event $event 644474ed8aSSzymon Olewniczak */ 65*1989ee26SSzymon Olewniczak public function handle_approve(Event $event) { 664474ed8aSSzymon Olewniczak global $INFO; 674474ed8aSSzymon Olewniczak 68*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 69*1989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 700c60a293SSzymon Olewniczak 7107b13373SSzymon Olewniczak if ($event->data != 'show') return; 7207b13373SSzymon Olewniczak if (!isset($_GET['approve'])) return; 73*1989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 74*1989ee26SSzymon Olewniczak if (!$acl->clientCanApprove($INFO['id'])) return; 754474ed8aSSzymon Olewniczak 76*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_data $db */ 77*1989ee26SSzymon Olewniczak $db = $this->loadHelper('approve_data'); 78*1989ee26SSzymon Olewniczak $db->setApprovedStatus($INFO['id']); 7984047bdaSRuud 804474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 8107b13373SSzymon Olewniczak } 8207b13373SSzymon Olewniczak 8307b13373SSzymon Olewniczak /** 84*1989ee26SSzymon Olewniczak * @param Event $event 8507b13373SSzymon Olewniczak */ 86*1989ee26SSzymon Olewniczak public function handle_mark_ready_for_approval(Event $event) { 8707b13373SSzymon Olewniczak global $INFO; 8807b13373SSzymon Olewniczak 89*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 90*1989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 910c60a293SSzymon Olewniczak 9207b13373SSzymon Olewniczak if ($event->data != 'show') return; 9307b13373SSzymon Olewniczak if (!isset($_GET['ready_for_approval'])) return; 94*1989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 95*1989ee26SSzymon Olewniczak if (!$acl->clientCanMarkReadyForApproval($INFO['id'])) return; 9650481663SSzymon Olewniczak 97*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_data $db */ 98*1989ee26SSzymon Olewniczak $db = $this->loadHelper('approve_data'); 99*1989ee26SSzymon Olewniczak $db->setReadyForApprovalStatus($INFO['id']); 10050481663SSzymon Olewniczak 1014474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 1021aeb2b4dSghi } 10355f447f4SSzymon Olewniczak 1044474ed8aSSzymon Olewniczak /** 105*1989ee26SSzymon Olewniczak * Redirect to latest approved page for user that don't have EDIT permission. 1064474ed8aSSzymon Olewniczak * 107*1989ee26SSzymon Olewniczak * @param Event $event 1084474ed8aSSzymon Olewniczak */ 109*1989ee26SSzymon Olewniczak public function handle_viewer(Event $event) { 1104474ed8aSSzymon Olewniczak global $INFO; 1114474ed8aSSzymon Olewniczak 112*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 113*1989ee26SSzymon 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; 118*1989ee26SSzymon Olewniczak if (!$acl->useApproveHere($INFO['id'])) return; 119*1989ee26SSzymon Olewniczak if ($acl->clientCanSeeDrafts($INFO['id'])) return; 1201aeb2b4dSghi 121*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_data $db */ 122*1989ee26SSzymon Olewniczak $db = $this->loadHelper('approve_data'); 123*1989ee26SSzymon Olewniczak $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 124*1989ee26SSzymon 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 /** 136*1989ee26SSzymon Olewniczak * @param Event $event 1374474ed8aSSzymon Olewniczak */ 138*1989ee26SSzymon Olewniczak public function handle_display_banner(Event $event) { 139*1989ee26SSzymon Olewniczak global $INFO; 140bab76148SSzymon Olewniczak 141*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_acl $acl */ 142*1989ee26SSzymon Olewniczak $acl = $this->loadHelper('approve_acl'); 143*1989ee26SSzymon 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*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_data $db */ 150*1989ee26SSzymon Olewniczak $db = $this->loadHelper('approve_data'); 1514474ed8aSSzymon Olewniczak 152*1989ee26SSzymon Olewniczak $page_revision = $db->getPageRevision($INFO['id'], $rev); 153*1989ee26SSzymon Olewniczak $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 1544474ed8aSSzymon Olewniczak 1554474ed8aSSzymon Olewniczak $classes = []; 156*1989ee26SSzymon Olewniczak if ($page_revision['status'] == 'approved' && $rev == $last_approved_rev) { 15715e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_approved'; 158*1989ee26SSzymon Olewniczak } elseif ($page_revision['status'] == 'approved') { 15915e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_old_approved'; 160*1989ee26SSzymon 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 16655f447f4SSzymon Olewniczak ptln('<div id="plugin__approve" class="' . implode(' ', $classes) . '">'); 1671aeb2b4dSghi 168af3e3cd8SSzymon Olewniczak 169*1989ee26SSzymon Olewniczak if ($page_revision['status'] == 'approved') { 170c7d53eabSSzymon Olewniczak ptln('<strong>'.$this->getLang('approved').'</strong>'); 171*1989ee26SSzymon Olewniczak ptln(' ' . dformat(strtotime($page_revision['approved']))); 172329c5e3aSMartin Diedrich 173329c5e3aSMartin Diedrich if($this->getConf('banner_long')) { 174*1989ee26SSzymon Olewniczak ptln(' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true)); 175*1989ee26SSzymon Olewniczak ptln(' (' . $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 181*1989ee26SSzymon Olewniczak if ($acl->clientCanSeeDrafts($INFO['id'])) { 1824474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id']) . '">'); 183*1989ee26SSzymon Olewniczak ptln($this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft')); 1841aeb2b4dSghi ptln('</a>'); 185c7d53eabSSzymon Olewniczak // we cannot see link to draft but there is some newer approved version 186*1989ee26SSzymon Olewniczak } elseif ($last_approved_rev != $rev) { 1874474ed8aSSzymon Olewniczak $urlParameters = []; 188*1989ee26SSzymon Olewniczak if ($last_approved_rev != $last_change_date) { 189*1989ee26SSzymon Olewniczak $urlParameters['rev'] = $last_approved_rev; 1904474ed8aSSzymon Olewniczak } 1914474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">'); 1921aeb2b4dSghi ptln($this->getLang('newest_approved')); 1931aeb2b4dSghi ptln('</a>'); 1941aeb2b4dSghi } 1954474ed8aSSzymon Olewniczak } 1964474ed8aSSzymon Olewniczak 1971aeb2b4dSghi } else { 198*1989ee26SSzymon Olewniczak if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') { 199c7d53eabSSzymon Olewniczak ptln('<strong>'.$this->getLang('marked_approve_ready').'</strong>'); 200*1989ee26SSzymon Olewniczak ptln(' ' . dformat(strtotime($page_revision['ready_for_approval']))); 201*1989ee26SSzymon Olewniczak ptln(' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true)); 202c7d53eabSSzymon Olewniczak } else { 203c7d53eabSSzymon Olewniczak ptln('<strong>'.$this->getLang('draft').'</strong>'); 20484047bdaSRuud } 20584047bdaSRuud 2064474ed8aSSzymon Olewniczak // not exists approve for current page 207*1989ee26SSzymon Olewniczak if ($last_approved_rev == null) { 2084474ed8aSSzymon Olewniczak // not the newest page 2094474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 2104474ed8aSSzymon Olewniczak ptln('<a href="'.wl($INFO['id']).'">'); 211274d699aSghi ptln($this->getLang('newest_draft')); 212274d699aSghi ptln('</a>'); 213274d699aSghi } 214274d699aSghi } else { 2154474ed8aSSzymon Olewniczak $urlParameters = []; 216*1989ee26SSzymon Olewniczak if ($last_approved_rev != $last_change_date) { 217*1989ee26SSzymon Olewniczak $urlParameters['rev'] = $last_approved_rev; 2184474ed8aSSzymon Olewniczak } 2194474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">'); 2201aeb2b4dSghi ptln($this->getLang('newest_approved')); 2211aeb2b4dSghi ptln('</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') && 227*1989ee26SSzymon Olewniczak $acl->clientCanMarkReadyForApproval($INFO['id']) && 228*1989ee26SSzymon 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 ]; 2354474ed8aSSzymon Olewniczak ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">'); 23684047bdaSRuud ptln($this->getLang('approve_ready')); 23784047bdaSRuud ptln('</a>'); 23884047bdaSRuud } 23984047bdaSRuud 240*1989ee26SSzymon 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 ]; 2464474ed8aSSzymon Olewniczak ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">'); 2471aeb2b4dSghi ptln($this->getLang('approve')); 2481aeb2b4dSghi ptln('</a>'); 2491aeb2b4dSghi } 250c7d53eabSSzymon Olewniczak } 251c7d53eabSSzymon Olewniczak } 25284047bdaSRuud 253*1989ee26SSzymon Olewniczak if (isset($page_metadata['approver']) & $this->getConf('banner_long')) { 254*1989ee26SSzymon Olewniczak ptln(' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true)); 2554474ed8aSSzymon Olewniczak } 256c7d53eabSSzymon Olewniczak 2571aeb2b4dSghi ptln('</div>'); 2581aeb2b4dSghi } 2591aeb2b4dSghi 260af3e3cd8SSzymon Olewniczak /** 2614474ed8aSSzymon Olewniczak * 262*1989ee26SSzymon Olewniczak * @param Event $event 2634474ed8aSSzymon Olewniczak */ 264*1989ee26SSzymon Olewniczak public function handle_pagesave_after(Event $event) { 2651b552e87SSzymon Olewniczak //no content was changed 2664474ed8aSSzymon Olewniczak if (!$event->data['contentChanged']) return; 2674474ed8aSSzymon Olewniczak 268*1989ee26SSzymon Olewniczak /** @var helper_plugin_approve_data $db */ 269*1989ee26SSzymon Olewniczak $db = $this->loadHelper('approve_data'); 2704474ed8aSSzymon Olewniczak 2714474ed8aSSzymon Olewniczak $id = $event->data['id']; 272*1989ee26SSzymon Olewniczak switch ($event->data['changeType']) { 273*1989ee26SSzymon Olewniczak case DOKU_CHANGE_TYPE_CREATE: 2744474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_EDIT: 2754474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_MINOR_EDIT: 276*1989ee26SSzymon Olewniczak case DOKU_CHANGE_TYPE_REVERT: 277*1989ee26SSzymon Olewniczak $db->handlePageEdit($id); 2784474ed8aSSzymon Olewniczak break; 2794474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_DELETE: 280*1989ee26SSzymon Olewniczak $db->handlePageDelete($id); 2814474ed8aSSzymon Olewniczak break; 2824474ed8aSSzymon Olewniczak } 2834474ed8aSSzymon Olewniczak } 2841aeb2b4dSghi} 285