11aeb2b4dSghi<?php 21aeb2b4dSghi 3bab76148SSzymon Olewniczakuse dokuwiki\plugin\approve\meta\ApproveConst; 41aeb2b4dSghi 51aeb2b4dSghiif(!defined('DOKU_INC')) die(); 61aeb2b4dSghi 71aeb2b4dSghiclass action_plugin_approve_approve extends DokuWiki_Action_Plugin { 81aeb2b4dSghi 9*4474ed8aSSzymon Olewniczak /** @var helper_plugin_sqlite */ 10*4474ed8aSSzymon Olewniczak protected $sqlite; 11bab76148SSzymon Olewniczak 12*4474ed8aSSzymon Olewniczak /** 13*4474ed8aSSzymon Olewniczak * @return helper_plugin_sqlite 14*4474ed8aSSzymon Olewniczak */ 15*4474ed8aSSzymon Olewniczak public function sqlite() { 16*4474ed8aSSzymon Olewniczak if (!$this->sqlite) { 17*4474ed8aSSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 18*4474ed8aSSzymon Olewniczak $this->sqlite = $db_helper->getDB(); 19*4474ed8aSSzymon Olewniczak } 20*4474ed8aSSzymon Olewniczak return $this->sqlite; 2150481663SSzymon Olewniczak } 2250481663SSzymon Olewniczak 23*4474ed8aSSzymon Olewniczak /** 24*4474ed8aSSzymon Olewniczak * @param Doku_Event_Handler $controller 25*4474ed8aSSzymon Olewniczak */ 26*4474ed8aSSzymon Olewniczak public function register(Doku_Event_Handler $controller) { 27*4474ed8aSSzymon Olewniczak $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept'); 28*4474ed8aSSzymon Olewniczak $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev'); 29*4474ed8aSSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve'); 30*4474ed8aSSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer'); 31*4474ed8aSSzymon Olewniczak $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner'); 3255f447f4SSzymon Olewniczak $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); 33*4474ed8aSSzymon Olewniczak // ensure a page revision is created when summary changes: 34*4474ed8aSSzymon Olewniczak// $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'BEFORE', $this, 'handle_pagesave_before'); 35*4474ed8aSSzymon Olewniczak// $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); 361aeb2b4dSghi } 371aeb2b4dSghi 38*4474ed8aSSzymon Olewniczak /** 39*4474ed8aSSzymon Olewniczak * @param $id 40*4474ed8aSSzymon Olewniczak * @return bool 41*4474ed8aSSzymon Olewniczak */ 42*4474ed8aSSzymon Olewniczak protected function use_approve_here($id) { 43*4474ed8aSSzymon Olewniczak $res = $this->sqlite()->query('SELECT page FROM page WHERE page=? AND hidden=0', $id); 44*4474ed8aSSzymon Olewniczak if ($this->sqlite()->res2single($res)) { 45*4474ed8aSSzymon Olewniczak return true; 46*4474ed8aSSzymon Olewniczak } 47*4474ed8aSSzymon Olewniczak return false; 48*4474ed8aSSzymon Olewniczak } 4950481663SSzymon Olewniczak 50*4474ed8aSSzymon Olewniczak /** 51*4474ed8aSSzymon Olewniczak * @param $id 52*4474ed8aSSzymon Olewniczak * @return bool|string 53*4474ed8aSSzymon Olewniczak */ 54*4474ed8aSSzymon Olewniczak protected function find_last_approved($id) { 55*4474ed8aSSzymon Olewniczak $res = $this->sqlite()->query('SELECT rev FROM revision 56*4474ed8aSSzymon Olewniczak WHERE page=? AND approved IS NOT NULL 57*4474ed8aSSzymon Olewniczak ORDER BY rev DESC LIMIT 1', $id); 58*4474ed8aSSzymon Olewniczak return $this->sqlite()->res2single($res); 59*4474ed8aSSzymon Olewniczak } 60*4474ed8aSSzymon Olewniczak 61*4474ed8aSSzymon Olewniczak 62*4474ed8aSSzymon Olewniczak /** 63*4474ed8aSSzymon Olewniczak * @param Doku_Event $event 64*4474ed8aSSzymon Olewniczak */ 65*4474ed8aSSzymon Olewniczak public function handle_diff_accept(Doku_Event $event) { 66*4474ed8aSSzymon Olewniczak global $INFO; 67*4474ed8aSSzymon Olewniczak 68*4474ed8aSSzymon Olewniczak if (!$this->use_approve_here($INFO['id'])) return; 6950481663SSzymon Olewniczak 701aeb2b4dSghi if ($event->data == 'diff' && isset($_GET['approve'])) { 71*4474ed8aSSzymon Olewniczak $href = wl($INFO['id'], ['approve' => 'approve']); 72*4474ed8aSSzymon Olewniczak ptln('<a href="' . $href . '">'.$this->getLang('approve').'</a>'); 731aeb2b4dSghi } 7484047bdaSRuud 75*4474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) { 76*4474ed8aSSzymon Olewniczak $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']); 77*4474ed8aSSzymon Olewniczak ptln('<a href="' . $href . '">'.$this->getLang('approve').'</a>'); 7884047bdaSRuud } 791aeb2b4dSghi } 801aeb2b4dSghi 81*4474ed8aSSzymon Olewniczak /** 82*4474ed8aSSzymon Olewniczak * @param Doku_Event $event 83*4474ed8aSSzymon Olewniczak */ 84*4474ed8aSSzymon Olewniczak public function handle_showrev(Doku_Event $event) { 85*4474ed8aSSzymon Olewniczak global $INFO; 861aeb2b4dSghi 87*4474ed8aSSzymon Olewniczak if (!$this->use_approve_here($INFO['id'])) return; 88*4474ed8aSSzymon Olewniczak 89*4474ed8aSSzymon Olewniczak $last_approved_rev = $this->find_last_approved($INFO['id']); 90*4474ed8aSSzymon Olewniczak if ($last_approved_rev == $INFO['rev']) { 911aeb2b4dSghi $event->preventDefault(); 921aeb2b4dSghi } 931aeb2b4dSghi } 941aeb2b4dSghi 95*4474ed8aSSzymon Olewniczak// function can_approve() { 96*4474ed8aSSzymon Olewniczak// global $ID; 97*4474ed8aSSzymon Olewniczak// return auth_quickaclcheck($ID) >= AUTH_DELETE; 98*4474ed8aSSzymon Olewniczak// } 99*4474ed8aSSzymon Olewniczak// 100*4474ed8aSSzymon Olewniczak// function can_edit() { 101*4474ed8aSSzymon Olewniczak// global $ID; 102*4474ed8aSSzymon Olewniczak// return auth_quickaclcheck($ID) >= AUTH_EDIT; 103*4474ed8aSSzymon Olewniczak// } 104*4474ed8aSSzymon Olewniczak 105*4474ed8aSSzymon Olewniczak /** 106*4474ed8aSSzymon Olewniczak * @param Doku_Event $event 107*4474ed8aSSzymon Olewniczak */ 108*4474ed8aSSzymon Olewniczak public function handle_approve(Doku_Event $event) { 109*4474ed8aSSzymon Olewniczak global $INFO; 110*4474ed8aSSzymon Olewniczak 111*4474ed8aSSzymon Olewniczak if (!$this->use_approve_here($INFO['id'])) return; 112*4474ed8aSSzymon Olewniczak 113*4474ed8aSSzymon Olewniczak if ($event->data == 'show' && isset($_GET['approve']) && 114*4474ed8aSSzymon Olewniczak auth_quickaclcheck($INFO['id']) >= AUTH_DELETE) { 115*4474ed8aSSzymon Olewniczak 116*4474ed8aSSzymon Olewniczak $res = $this->sqlite()->query('SELECT MAX(version)+1 FROM revision 117*4474ed8aSSzymon Olewniczak WHERE page=?', $INFO['id']); 118*4474ed8aSSzymon Olewniczak $next_version = $this->sqlite()->res2single($res); 119*4474ed8aSSzymon Olewniczak if (!$next_version) { 120*4474ed8aSSzymon Olewniczak $next_version = 1; 12184047bdaSRuud } 122*4474ed8aSSzymon Olewniczak //approved IS NULL prevents from overriding already approved page 123*4474ed8aSSzymon Olewniczak $this->sqlite()->query('UPDATE revision 124*4474ed8aSSzymon Olewniczak SET approved=?, version=? 125*4474ed8aSSzymon Olewniczak WHERE page=? AND current=1 AND approved IS NULL', 126*4474ed8aSSzymon Olewniczak date('c'), $next_version, $INFO['id']); 12784047bdaSRuud 128*4474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 129*4474ed8aSSzymon Olewniczak } elseif ($event->data == 'show' && isset($_GET['ready_for_approval']) && 130*4474ed8aSSzymon Olewniczak auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) { 13150481663SSzymon Olewniczak 132*4474ed8aSSzymon Olewniczak $this->sqlite()->query('UPDATE revision SET ready_for_approval=? 133*4474ed8aSSzymon Olewniczak WHERE page=? AND current=1 AND ready_for_approval IS NULL', 134*4474ed8aSSzymon Olewniczak date('c'), $INFO['id']); 13550481663SSzymon Olewniczak 136*4474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 1371aeb2b4dSghi } 13838d03fbdSghi } 13955f447f4SSzymon Olewniczak 140*4474ed8aSSzymon Olewniczak /** 141*4474ed8aSSzymon Olewniczak * Redirect to newest approved page for user that don't have EDIT permission. 142*4474ed8aSSzymon Olewniczak * 143*4474ed8aSSzymon Olewniczak * @param Doku_Event $event 144*4474ed8aSSzymon Olewniczak */ 145*4474ed8aSSzymon Olewniczak public function handle_viewer(Doku_Event $event) { 146*4474ed8aSSzymon Olewniczak global $INFO; 147*4474ed8aSSzymon Olewniczak 14838d03fbdSghi if ($event->data != 'show') return; 149*4474ed8aSSzymon Olewniczak //apply only to current page 150*4474ed8aSSzymon Olewniczak if (!$INFO['rev']) return; 151*4474ed8aSSzymon Olewniczak if (auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) return; 152*4474ed8aSSzymon Olewniczak if (!$this->use_approve_here($INFO['id'])) return; 1531aeb2b4dSghi 154*4474ed8aSSzymon Olewniczak $last_approved_rev = $this->find_last_approved($INFO['id']); 15538d03fbdSghi //no page is approved 156*4474ed8aSSzymon Olewniczak if (!$last_approved_rev) return; 15738d03fbdSghi 158*4474ed8aSSzymon Olewniczak $last_change_date = @filemtime(wikiFN($INFO['id'])); 159*4474ed8aSSzymon Olewniczak //current page is approved 160*4474ed8aSSzymon Olewniczak if ($last_approved_rev == $last_change_date) return; 161*4474ed8aSSzymon Olewniczak 162*4474ed8aSSzymon Olewniczak header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev])); 1631aeb2b4dSghi } 16455f447f4SSzymon Olewniczak 165*4474ed8aSSzymon Olewniczak// function find_lastest_approved() { 166*4474ed8aSSzymon Olewniczak// global $ID; 167*4474ed8aSSzymon Olewniczak// $m = p_get_metadata($ID); 168*4474ed8aSSzymon Olewniczak// $sum = $m['last_change']['sum']; 169*4474ed8aSSzymon Olewniczak// if ($sum == $this->getConf('sum approved')) 170*4474ed8aSSzymon Olewniczak// return 0; 171*4474ed8aSSzymon Olewniczak// 172*4474ed8aSSzymon Olewniczak// $changelog = new PageChangeLog($ID); 173*4474ed8aSSzymon Olewniczak// 174*4474ed8aSSzymon Olewniczak// $chs = $changelog->getRevisions(0, 10000); 175*4474ed8aSSzymon Olewniczak// foreach ($chs as $rev) { 176*4474ed8aSSzymon Olewniczak// $ch = $changelog->getRevisionInfo($rev); 177*4474ed8aSSzymon Olewniczak// if ($ch['sum'] == $this->getConf('sum approved')) 178*4474ed8aSSzymon Olewniczak// return $rev; 179*4474ed8aSSzymon Olewniczak// } 180*4474ed8aSSzymon Olewniczak// return -1; 181*4474ed8aSSzymon Olewniczak// } 1821aeb2b4dSghi 183*4474ed8aSSzymon Olewniczak /** 184*4474ed8aSSzymon Olewniczak * @param Doku_Event $event 185*4474ed8aSSzymon Olewniczak */ 186*4474ed8aSSzymon Olewniczak public function handle_display_banner(Doku_Event $event) { 187*4474ed8aSSzymon Olewniczak global $INFO; 188bab76148SSzymon Olewniczak 1891aeb2b4dSghi if ($event->data != 'show') return; 1901aeb2b4dSghi if (!$INFO['exists']) return; 191*4474ed8aSSzymon Olewniczak if (!$this->use_approve_here($INFO['id'])) return; 1921aeb2b4dSghi 193*4474ed8aSSzymon Olewniczak// $last_change_date = p_get_metadata($INFO['id'], 'last_change date'); 194*4474ed8aSSzymon Olewniczak $last_change_date = @filemtime(wikiFN($INFO['id'])); 195*4474ed8aSSzymon Olewniczak $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev']; 1961aeb2b4dSghi 19755f447f4SSzymon Olewniczak 198*4474ed8aSSzymon Olewniczak $res = $this->sqlite()->query('SELECT ready_for_approval, approved, version 199*4474ed8aSSzymon Olewniczak FROM revision 200*4474ed8aSSzymon Olewniczak WHERE page=? AND rev=?', $INFO['id'], $rev); 201*4474ed8aSSzymon Olewniczak 202*4474ed8aSSzymon Olewniczak $approve = $this->sqlite()->res_fetch_assoc($res); 203*4474ed8aSSzymon Olewniczak 204*4474ed8aSSzymon Olewniczak $classes = []; 20555f447f4SSzymon Olewniczak if ($this->getConf('prettyprint')) { 20655f447f4SSzymon Olewniczak $classes[] = 'plugin__approve_noprint'; 20755f447f4SSzymon Olewniczak } 20855f447f4SSzymon Olewniczak 209*4474ed8aSSzymon Olewniczak if ($approve['approved']) { 21055f447f4SSzymon Olewniczak $classes[] = 'plugin__approve_green'; 211*4474ed8aSSzymon Olewniczak } elseif ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) { 212bab76148SSzymon Olewniczak $classes[] = 'plugin__approve_ready'; 21355f447f4SSzymon Olewniczak } else { 21455f447f4SSzymon Olewniczak $classes[] = 'plugin__approve_red'; 21555f447f4SSzymon Olewniczak } 21655f447f4SSzymon Olewniczak 21755f447f4SSzymon Olewniczak ptln('<div id="plugin__approve" class="' . implode(' ', $classes) . '">'); 2181aeb2b4dSghi 2191aeb2b4dSghi tpl_pageinfo(); 2201aeb2b4dSghi ptln(' | '); 221af3e3cd8SSzymon Olewniczak 222*4474ed8aSSzymon Olewniczak if ($approve['approved']) { 223*4474ed8aSSzymon Olewniczak ptln('<strong>'.$this->getLang('approved').'</strong> (' 224*4474ed8aSSzymon Olewniczak . $this->getLang('version') . ': ' . $approve['version'] . ')'); 225*4474ed8aSSzymon Olewniczak 226*4474ed8aSSzymon Olewniczak //not the newest page 227*4474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 228*4474ed8aSSzymon Olewniczak $res = $this->sqlite()->query('SELECT rev, current FROM revision 229*4474ed8aSSzymon Olewniczak WHERE page=? AND approved IS NOT NULL 230*4474ed8aSSzymon Olewniczak ORDER BY rev DESC LIMIT 1', $INFO['id']); 231*4474ed8aSSzymon Olewniczak 232*4474ed8aSSzymon Olewniczak $lastest_approve = $this->sqlite()->res_fetch_assoc($res); 233*4474ed8aSSzymon Olewniczak 234*4474ed8aSSzymon Olewniczak //we can see drafts 235*4474ed8aSSzymon Olewniczak if (auth_quickaclcheck($INFO['id']) >= AUTH_EDIT) { 236*4474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id']) . '">'); 237*4474ed8aSSzymon Olewniczak ptln($this->getLang($lastest_approve['current'] ? 'newest_approved' : 'newest_draft')); 2381aeb2b4dSghi ptln('</a>'); 239*4474ed8aSSzymon Olewniczak } else { 240*4474ed8aSSzymon Olewniczak $urlParameters = []; 241*4474ed8aSSzymon Olewniczak if (!$lastest_approve['current']) { 242*4474ed8aSSzymon Olewniczak $urlParameters['rev'] = $lastest_approve['rev']; 243*4474ed8aSSzymon Olewniczak } 244*4474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">'); 2451aeb2b4dSghi ptln($this->getLang('newest_approved')); 2461aeb2b4dSghi ptln('</a>'); 2471aeb2b4dSghi } 248*4474ed8aSSzymon Olewniczak } 249*4474ed8aSSzymon Olewniczak 2501aeb2b4dSghi } else { 2511aeb2b4dSghi ptln('<span>'.$this->getLang('draft').'</span>'); 2521aeb2b4dSghi 253*4474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) { 25484047bdaSRuud ptln('<span>| '.$this->getLang('marked_approve_ready').'</span>'); 25584047bdaSRuud } 25684047bdaSRuud 25784047bdaSRuud 258*4474ed8aSSzymon Olewniczak $res = $this->sqlite()->query('SELECT rev, current FROM revision 259*4474ed8aSSzymon Olewniczak WHERE page=? AND approved IS NOT NULL 260*4474ed8aSSzymon Olewniczak ORDER BY rev DESC LIMIT 1', $INFO['id']); 261*4474ed8aSSzymon Olewniczak 262*4474ed8aSSzymon Olewniczak $lastest_approve = $this->sqlite()->res_fetch_assoc($res); 263*4474ed8aSSzymon Olewniczak 264*4474ed8aSSzymon Olewniczak 265*4474ed8aSSzymon Olewniczak //not exists approve for current page 266*4474ed8aSSzymon Olewniczak if (!$lastest_approve) { 267*4474ed8aSSzymon Olewniczak //not the newest page 268*4474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 269*4474ed8aSSzymon Olewniczak ptln('<a href="'.wl($INFO['id']).'">'); 270274d699aSghi ptln($this->getLang('newest_draft')); 271274d699aSghi ptln('</a>'); 272274d699aSghi } 273274d699aSghi } else { 274*4474ed8aSSzymon Olewniczak $urlParameters = []; 275*4474ed8aSSzymon Olewniczak if (!$lastest_approve['current']) { 276*4474ed8aSSzymon Olewniczak $urlParameters['rev'] = $lastest_approve['rev']; 277*4474ed8aSSzymon Olewniczak } 278*4474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">'); 2791aeb2b4dSghi ptln($this->getLang('newest_approved')); 2801aeb2b4dSghi ptln('</a>'); 2811aeb2b4dSghi } 2821aeb2b4dSghi 283*4474ed8aSSzymon Olewniczak //we are in current page 284*4474ed8aSSzymon Olewniczak if ($rev == $last_change_date) { 285*4474ed8aSSzymon Olewniczak 286*4474ed8aSSzymon Olewniczak $last_approved_rev = 0; 287*4474ed8aSSzymon Olewniczak if (isset($lastest_approve['rev'])) { 288*4474ed8aSSzymon Olewniczak $last_approved_rev = $lastest_approve['rev']; 289*4474ed8aSSzymon Olewniczak } 290*4474ed8aSSzymon Olewniczak 291*4474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && 292*4474ed8aSSzymon Olewniczak auth_quickaclcheck($INFO['id']) >= AUTH_EDIT && 293*4474ed8aSSzymon Olewniczak !$approve['ready_for_approval']) { 294*4474ed8aSSzymon Olewniczak 295*4474ed8aSSzymon Olewniczak $urlParameters = [ 296*4474ed8aSSzymon Olewniczak 'rev' => $last_approved_rev, 297*4474ed8aSSzymon Olewniczak 'do' => 'diff', 298*4474ed8aSSzymon Olewniczak 'ready_for_approval' => 'ready_for_approval' 299*4474ed8aSSzymon Olewniczak ]; 300*4474ed8aSSzymon Olewniczak ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">'); 30184047bdaSRuud ptln($this->getLang('approve_ready')); 30284047bdaSRuud ptln('</a>'); 30384047bdaSRuud } 30484047bdaSRuud 305*4474ed8aSSzymon Olewniczak if (auth_quickaclcheck($INFO['id']) >= AUTH_DELETE) { 306*4474ed8aSSzymon Olewniczak 307*4474ed8aSSzymon Olewniczak $urlParameters = [ 308*4474ed8aSSzymon Olewniczak 'rev' => $last_approved_rev, 309*4474ed8aSSzymon Olewniczak 'do' => 'diff', 310*4474ed8aSSzymon Olewniczak 'approve' => 'approve' 311*4474ed8aSSzymon Olewniczak ]; 312*4474ed8aSSzymon Olewniczak ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">'); 3131aeb2b4dSghi ptln($this->getLang('approve')); 3141aeb2b4dSghi ptln('</a>'); 3151aeb2b4dSghi } 31684047bdaSRuud 317*4474ed8aSSzymon Olewniczak } 3181aeb2b4dSghi } 3191aeb2b4dSghi ptln('</div>'); 3201aeb2b4dSghi } 3211aeb2b4dSghi 322af3e3cd8SSzymon Olewniczak /** 323*4474ed8aSSzymon Olewniczak * @return bool|string 324*4474ed8aSSzymon Olewniczak */ 325*4474ed8aSSzymon Olewniczak protected function prev_rev($id) { 326*4474ed8aSSzymon Olewniczak $res = $this->sqlite()->query('SELECT rev FROM revision 327*4474ed8aSSzymon Olewniczak WHERE page=? 328*4474ed8aSSzymon Olewniczak AND current=1 329*4474ed8aSSzymon Olewniczak AND approved IS NULL 330*4474ed8aSSzymon Olewniczak AND ready_for_approval IS NULL', $id); 331*4474ed8aSSzymon Olewniczak 332*4474ed8aSSzymon Olewniczak return $this->sqlite()->res2single($res); 333*4474ed8aSSzymon Olewniczak } 334*4474ed8aSSzymon Olewniczak 335*4474ed8aSSzymon Olewniczak /** 336*4474ed8aSSzymon Olewniczak * 337*4474ed8aSSzymon Olewniczak * @param Doku_Event $event event object by reference 338*4474ed8aSSzymon Olewniczak * @return void 339*4474ed8aSSzymon Olewniczak */ 340*4474ed8aSSzymon Olewniczak public function handle_pagesave_after(Doku_Event $event) { 341*4474ed8aSSzymon Olewniczak //no content was mde 342*4474ed8aSSzymon Olewniczak if (!$event->data['contentChanged']) return; 343*4474ed8aSSzymon Olewniczak 344*4474ed8aSSzymon Olewniczak $changeType = $event->data['changeType']; 345*4474ed8aSSzymon Olewniczak if ($changeType == DOKU_CHANGE_TYPE_REVERT) { 346*4474ed8aSSzymon Olewniczak if ($event->data['oldContent'] == '') { 347*4474ed8aSSzymon Olewniczak $changeType = DOKU_CHANGE_TYPE_CREATE; 348*4474ed8aSSzymon Olewniczak } else { 349*4474ed8aSSzymon Olewniczak $changeType = DOKU_CHANGE_TYPE_EDIT; 350*4474ed8aSSzymon Olewniczak } 351*4474ed8aSSzymon Olewniczak } 352*4474ed8aSSzymon Olewniczak 353*4474ed8aSSzymon Olewniczak $id = $event->data['id']; 354*4474ed8aSSzymon Olewniczak //TODO: if created, if deleted 355*4474ed8aSSzymon Olewniczak switch ($changeType) { 356*4474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_EDIT: 357*4474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_REVERT: 358*4474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_MINOR_EDIT: 359*4474ed8aSSzymon Olewniczak $last_change_date = $event->data['newRevision']; 360*4474ed8aSSzymon Olewniczak 361*4474ed8aSSzymon Olewniczak //if the current page has approved or ready_for_approval -- keep it 362*4474ed8aSSzymon Olewniczak $prev_rev = $this->prev_rev($id); 363*4474ed8aSSzymon Olewniczak if ($prev_rev) { 364*4474ed8aSSzymon Olewniczak $this->sqlite()->query('UPDATE revision SET rev=? WHERE page=? AND rev=?', 365*4474ed8aSSzymon Olewniczak $last_change_date, $id, $prev_rev); 366*4474ed8aSSzymon Olewniczak 367*4474ed8aSSzymon Olewniczak } else { 368*4474ed8aSSzymon Olewniczak //keep previous record 369*4474ed8aSSzymon Olewniczak $this->sqlite()->query('UPDATE revision SET current=0 370*4474ed8aSSzymon Olewniczak WHERE page=? 371*4474ed8aSSzymon Olewniczak AND current=1', $id); 372*4474ed8aSSzymon Olewniczak 373*4474ed8aSSzymon Olewniczak $this->sqlite()->storeEntry('revision', [ 374*4474ed8aSSzymon Olewniczak 'page' => $id, 375*4474ed8aSSzymon Olewniczak 'rev' => $last_change_date, 376*4474ed8aSSzymon Olewniczak 'current' => 1 377*4474ed8aSSzymon Olewniczak ]); 378*4474ed8aSSzymon Olewniczak } 379*4474ed8aSSzymon Olewniczak break; 380*4474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_DELETE: 381*4474ed8aSSzymon Olewniczak //delete information about availability of a page but keep the history 382*4474ed8aSSzymon Olewniczak $this->sqlite()->query('DELETE FROM page WHERE page=?', $id); 383*4474ed8aSSzymon Olewniczak 384*4474ed8aSSzymon Olewniczak //delete revision if no information about approvals 385*4474ed8aSSzymon Olewniczak $prev_rev = $this->prev_rev($id); 386*4474ed8aSSzymon Olewniczak if ($prev_rev) { 387*4474ed8aSSzymon Olewniczak $this->sqlite()->query('DELETE FROM revision WHERE page=? AND rev=?', 388*4474ed8aSSzymon Olewniczak $id, $prev_rev); 389*4474ed8aSSzymon Olewniczak } else { 390*4474ed8aSSzymon Olewniczak $this->sqlite()->query('UPDATE revision SET current=0 WHERE page=? AND rev=?', 391*4474ed8aSSzymon Olewniczak $id, $prev_rev); 392*4474ed8aSSzymon Olewniczak } 393*4474ed8aSSzymon Olewniczak 394*4474ed8aSSzymon Olewniczak break; 395*4474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_CREATE: 396*4474ed8aSSzymon Olewniczak $last_change_date = $event->data['newRevision']; 397*4474ed8aSSzymon Olewniczak //TODO should be checked against no_approve_rev 398*4474ed8aSSzymon Olewniczak $this->sqlite()->storeEntry('page', [ 399*4474ed8aSSzymon Olewniczak 'page' => $id 400*4474ed8aSSzymon Olewniczak ]); 401*4474ed8aSSzymon Olewniczak 402*4474ed8aSSzymon Olewniczak $this->sqlite()->storeEntry('revision', [ 403*4474ed8aSSzymon Olewniczak 'page' => $id, 404*4474ed8aSSzymon Olewniczak 'rev' => $last_change_date, 405*4474ed8aSSzymon Olewniczak 'current' => 1 406*4474ed8aSSzymon Olewniczak ]); 407*4474ed8aSSzymon Olewniczak break; 408*4474ed8aSSzymon Olewniczak } 409*4474ed8aSSzymon Olewniczak } 410*4474ed8aSSzymon Olewniczak 411*4474ed8aSSzymon Olewniczak /** 412af3e3cd8SSzymon Olewniczak * Check if the page has to be changed 413af3e3cd8SSzymon Olewniczak * 414af3e3cd8SSzymon Olewniczak * @param Doku_Event $event event object by reference 415af3e3cd8SSzymon Olewniczak * @param mixed $param [the parameters passed as fifth argument to register_hook() when this 416af3e3cd8SSzymon Olewniczak * handler was registered] 417af3e3cd8SSzymon Olewniczak * @return void 418af3e3cd8SSzymon Olewniczak */ 419*4474ed8aSSzymon Olewniczak// public function handle_pagesave_before(Doku_Event $event, $param) { 420*4474ed8aSSzymon Olewniczak// global $REV; 421*4474ed8aSSzymon Olewniczak// $id = $event->data['id']; 422*4474ed8aSSzymon Olewniczak// if (!$this->hlp->use_approve_here($id)) return; 423*4474ed8aSSzymon Olewniczak// 424*4474ed8aSSzymon Olewniczak// //save page if summary is provided 425*4474ed8aSSzymon Olewniczak// if($event->data['summary'] == $this->getConf('sum approved') || 426*4474ed8aSSzymon Olewniczak// $event->data['summary'] == $this->getConf('sum ready for approval')) { 427*4474ed8aSSzymon Olewniczak// $event->data['contentChanged'] = true; 428*4474ed8aSSzymon Olewniczak// } 429*4474ed8aSSzymon Olewniczak// } 430af3e3cd8SSzymon Olewniczak 43155f447f4SSzymon Olewniczak /** 43255f447f4SSzymon Olewniczak * @param Doku_Event $event 43355f447f4SSzymon Olewniczak * @param $param 43455f447f4SSzymon Olewniczak */ 435*4474ed8aSSzymon Olewniczak// public function handle_pagesave_after(Doku_Event $event, $param) { 436*4474ed8aSSzymon Olewniczak// global $REV; 437*4474ed8aSSzymon Olewniczak// $id = $event->data['id']; 438*4474ed8aSSzymon Olewniczak// if (!$this->hlp->use_approve_here($id)) return; 439*4474ed8aSSzymon Olewniczak// 440*4474ed8aSSzymon Olewniczak// //save page if summary is provided 441*4474ed8aSSzymon Olewniczak// if($event->data['summary'] == $this->getConf('sum approved')) { 442*4474ed8aSSzymon Olewniczak// 443*4474ed8aSSzymon Olewniczak// $versions = p_get_metadata($id, ApproveConst::METADATA_VERSIONS_KEY); 444*4474ed8aSSzymon Olewniczak// //calculate versions 445*4474ed8aSSzymon Olewniczak// if (!$versions) { 446*4474ed8aSSzymon Olewniczak// $this->render_metadata_for_approved_page($id, $event->data['newRevision']); 447*4474ed8aSSzymon Olewniczak// } else { 448*4474ed8aSSzymon Olewniczak// $curver = $versions[0] + 1; 449*4474ed8aSSzymon Olewniczak// $versions[0] = $curver; 450*4474ed8aSSzymon Olewniczak// $versions[$event->data['newRevision']] = $curver; 451*4474ed8aSSzymon Olewniczak// p_set_metadata($id, array(ApproveConst::METADATA_VERSIONS_KEY => $versions)); 452*4474ed8aSSzymon Olewniczak// } 453*4474ed8aSSzymon Olewniczak// } 454*4474ed8aSSzymon Olewniczak// } 455af3e3cd8SSzymon Olewniczak 456af3e3cd8SSzymon Olewniczak 457af3e3cd8SSzymon Olewniczak /** 458af3e3cd8SSzymon Olewniczak * Calculate current version 459af3e3cd8SSzymon Olewniczak * 460af3e3cd8SSzymon Olewniczak * @param $id 461bab76148SSzymon Olewniczak * @return array 462af3e3cd8SSzymon Olewniczak */ 463*4474ed8aSSzymon Olewniczak// protected function render_metadata_for_approved_page($id, $currev=false) { 464*4474ed8aSSzymon Olewniczak// if (!$currev) $currev = @filemtime(wikiFN($id)); 465*4474ed8aSSzymon Olewniczak// 466*4474ed8aSSzymon Olewniczak// $version = $this->approved($id); 467*4474ed8aSSzymon Olewniczak// //version for current page 468*4474ed8aSSzymon Olewniczak// $curver = $version + 1; 469*4474ed8aSSzymon Olewniczak// $versions = array(0 => $curver, $currev => $curver); 470*4474ed8aSSzymon Olewniczak// 471*4474ed8aSSzymon Olewniczak// $changelog = new PageChangeLog($id); 472*4474ed8aSSzymon Olewniczak// $first = 0; 473*4474ed8aSSzymon Olewniczak// $num = 100; 474*4474ed8aSSzymon Olewniczak// while (count($revs = $changelog->getRevisions($first, $num)) > 0) { 475*4474ed8aSSzymon Olewniczak// foreach ($revs as $rev) { 476*4474ed8aSSzymon Olewniczak// $revInfo = $changelog->getRevisionInfo($rev); 477*4474ed8aSSzymon Olewniczak// if ($revInfo['sum'] == $this->getConf('sum approved')) { 478*4474ed8aSSzymon Olewniczak// $versions[$rev] = $version; 479*4474ed8aSSzymon Olewniczak// $version -= 1; 480*4474ed8aSSzymon Olewniczak// } 481*4474ed8aSSzymon Olewniczak// } 482*4474ed8aSSzymon Olewniczak// $first += $num; 483*4474ed8aSSzymon Olewniczak// } 484*4474ed8aSSzymon Olewniczak// 485*4474ed8aSSzymon Olewniczak// p_set_metadata($id, array(ApproveConst::METADATA_VERSIONS_KEY => $versions)); 486*4474ed8aSSzymon Olewniczak// 487*4474ed8aSSzymon Olewniczak// return $versions; 488*4474ed8aSSzymon Olewniczak// } 489af3e3cd8SSzymon Olewniczak 49055f447f4SSzymon Olewniczak /** 49155f447f4SSzymon Olewniczak * Get the number of approved pages 49255f447f4SSzymon Olewniczak * @param $id 49355f447f4SSzymon Olewniczak * @return int 49455f447f4SSzymon Olewniczak */ 495*4474ed8aSSzymon Olewniczak// protected function approved($id) { 496*4474ed8aSSzymon Olewniczak// $count = 0; 497*4474ed8aSSzymon Olewniczak// 498*4474ed8aSSzymon Olewniczak// $changelog = new PageChangeLog($id); 499*4474ed8aSSzymon Olewniczak// $first = 0; 500*4474ed8aSSzymon Olewniczak// $num = 100; 501*4474ed8aSSzymon Olewniczak// while (count($revs = $changelog->getRevisions($first, $num)) > 0) { 502*4474ed8aSSzymon Olewniczak// foreach ($revs as $rev) { 503*4474ed8aSSzymon Olewniczak// $revInfo = $changelog->getRevisionInfo($rev); 504*4474ed8aSSzymon Olewniczak// if ($revInfo['sum'] == $this->getConf('sum approved')) { 505*4474ed8aSSzymon Olewniczak// $count += 1; 506*4474ed8aSSzymon Olewniczak// } 507*4474ed8aSSzymon Olewniczak// } 508*4474ed8aSSzymon Olewniczak// $first += $num; 509*4474ed8aSSzymon Olewniczak// } 510*4474ed8aSSzymon Olewniczak// 511*4474ed8aSSzymon Olewniczak// return $count; 512*4474ed8aSSzymon Olewniczak// } 5131aeb2b4dSghi} 514