1<?php 2 3use dokuwiki\Extension\ActionPlugin; 4use dokuwiki\Extension\EventHandler; 5use dokuwiki\Extension\Event; 6 7class action_plugin_approve_approve extends ActionPlugin { 8 /** 9 * @inheritDoc 10 */ 11 public function register(EventHandler $controller) { 12 $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept'); 13 $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev'); 14 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve'); 15 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_mark_ready_for_approval'); 16 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer'); 17 $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner'); 18 $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); 19 } 20 21 /** 22 * @param Event $event 23 */ 24 public function handle_diff_accept(Event $event) { 25 global $INFO; 26 27 /** @var helper_plugin_approve_acl $acl */ 28 $acl = $this->loadHelper('approve_acl'); 29 30 if (!$acl->useApproveHere($INFO['id'])) return; 31 32 if ($event->data == 'diff' && isset($_GET['approve'])) { 33 $href = wl($INFO['id'], ['approve' => 'approve']); 34 echo '<a href="' . $href . '">'.$this->getLang('approve').'</a>'; 35 } 36 37 if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) { 38 $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']); 39 echo '<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>'; 40 } 41 } 42 43 /** 44 * @param Event $event 45 */ 46 public function handle_showrev(Event $event) { 47 global $INFO; 48 49 /** @var helper_plugin_approve_db $db */ 50 $db = $this->loadHelper('approve_db'); 51 /** @var helper_plugin_approve_acl $acl */ 52 $acl = $this->loadHelper('approve_acl'); 53 54 if (!$acl->useApproveHere($INFO['id'])) return; 55 56 $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 57 if ($last_approved_rev == $INFO['rev']) { 58 $event->preventDefault(); 59 } 60 } 61 62 /** 63 * @param Event $event 64 */ 65 public function handle_approve(Event $event) { 66 global $INFO; 67 68 /** @var helper_plugin_approve_acl $acl */ 69 $acl = $this->loadHelper('approve_acl'); 70 71 if ($event->data != 'show') return; 72 if (!isset($_GET['approve'])) return; 73 if (!$acl->useApproveHere($INFO['id'])) return; 74 if (!$acl->clientCanApprove($INFO['id'])) return; 75 76 /** @var helper_plugin_approve_db $db */ 77 $db = $this->loadHelper('approve_db'); 78 $db->setApprovedStatus($INFO['id']); 79 80 header('Location: ' . wl($INFO['id'])); 81 } 82 83 /** 84 * @param Event $event 85 */ 86 public function handle_mark_ready_for_approval(Event $event) { 87 global $INFO; 88 89 /** @var helper_plugin_approve_acl $acl */ 90 $acl = $this->loadHelper('approve_acl'); 91 92 if ($event->data != 'show') return; 93 if (!isset($_GET['ready_for_approval'])) return; 94 if (!$acl->useApproveHere($INFO['id'])) return; 95 if (!$acl->clientCanMarkReadyForApproval($INFO['id'])) return; 96 97 /** @var helper_plugin_approve_db $db */ 98 $db = $this->loadHelper('approve_db'); 99 $db->setReadyForApprovalStatus($INFO['id']); 100 101 header('Location: ' . wl($INFO['id'])); 102 } 103 104 /** 105 * Redirect to latest approved page for user that don't have EDIT permission. 106 * 107 * @param Event $event 108 */ 109 public function handle_viewer(Event $event) { 110 global $INFO; 111 112 /** @var helper_plugin_approve_acl $acl */ 113 $acl = $this->loadHelper('approve_acl'); 114 115 if ($event->data != 'show') return; 116 //apply only to current page 117 if ($INFO['rev'] != 0) return; 118 if (!$acl->useApproveHere($INFO['id'])) return; 119 if ($acl->clientCanSeeDrafts($INFO['id'])) return; 120 121 /** @var helper_plugin_approve_db $db */ 122 $db = $this->loadHelper('approve_db'); 123 $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 124 125 //no page is approved 126 if (!$last_approved_rev) return; 127 128 $last_change_date = @filemtime(wikiFN($INFO['id'])); 129 // current page is approved 130 if ($last_approved_rev == $last_change_date) return; 131 132 header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev], false, '&')); 133 } 134 135 /** 136 * @param Event $event 137 */ 138 public function handle_display_banner(Event $event) { 139 global $conf; 140 141 // for the sprintdoc template we have special integrations 142 if ($conf['template'] == 'sprintdoc') return; 143 144 /** @var helper_plugin_approve_tpl $tpl */ 145 $tpl = $this->loadHelper('approve_tpl'); 146 $tpl->banner($event->data); 147 } 148 149 /** 150 * 151 * @param Event $event 152 */ 153 public function handle_pagesave_after(Event $event) { 154 //no content was changed 155 if (!$event->data['contentChanged']) return; 156 157 /** @var helper_plugin_approve_db $db */ 158 $db = $this->loadHelper('approve_db'); 159 160 $id = $event->data['id']; 161 switch ($event->data['changeType']) { 162 case DOKU_CHANGE_TYPE_CREATE: 163 case DOKU_CHANGE_TYPE_EDIT: 164 case DOKU_CHANGE_TYPE_MINOR_EDIT: 165 case DOKU_CHANGE_TYPE_REVERT: 166 $db->handlePageEdit($id); 167 break; 168 case DOKU_CHANGE_TYPE_DELETE: 169 $db->handlePageDelete($id); 170 break; 171 } 172 } 173} 174