11aeb2b4dSghi<?php 21aeb2b4dSghi 31aeb2b4dSghiif(!defined('DOKU_INC')) die(); 41aeb2b4dSghidefine(APPROVED, 'Approved'); 51aeb2b4dSghi 61aeb2b4dSghiclass action_plugin_approve_approve extends DokuWiki_Action_Plugin { 71aeb2b4dSghi 81aeb2b4dSghi function register(&$controller) { 91aeb2b4dSghi $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, handle_approve, array()); 101aeb2b4dSghi $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, handle_diff_accept, array()); 111aeb2b4dSghi $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, handle_display_banner, array()); 121aeb2b4dSghi $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, handle_showrev, array()); 131aeb2b4dSghi } 141aeb2b4dSghi 151aeb2b4dSghi function handle_diff_accept(&$event, $param) { 161aeb2b4dSghi if ($event->data == 'diff' && isset($_GET['approve'])) { 171aeb2b4dSghi ptln('<a href="'.DOKU_URL.'doku.php?id='.$_GET['id'].'&approve=approve">'.$this->getLang('approve').'</a>'); 181aeb2b4dSghi } 191aeb2b4dSghi } 201aeb2b4dSghi 211aeb2b4dSghi function handle_showrev(&$event, $param) { 221aeb2b4dSghi global $ID, $REV; 231aeb2b4dSghi 241aeb2b4dSghi $last = $this->find_lastest_approved(); 251aeb2b4dSghi if ($last == $REV) 261aeb2b4dSghi $event->preventDefault(); 271aeb2b4dSghi } 281aeb2b4dSghi 291aeb2b4dSghi function can_approve() { 301aeb2b4dSghi global $ID; 31*2cf0ddf9Sghi return auth_quickaclcheck($ID) >= AUTH_DELETE; 321aeb2b4dSghi } 331aeb2b4dSghi 341aeb2b4dSghi function handle_approve(&$event, $param) { 351aeb2b4dSghi global $ID, $REV; 361aeb2b4dSghi if ( ! $this->can_approve()) return; 371aeb2b4dSghi if ($event->data == 'show' && isset($_GET['approve'])) { 381aeb2b4dSghi //Add or remove the new line from the end of the page. Silly but needed. 391aeb2b4dSghi $content = rawWiki($ID, ''); 401aeb2b4dSghi if (substr($content, -1) == "\n") { 411aeb2b4dSghi $content = substr($content, 0, -1); 421aeb2b4dSghi } else { 431aeb2b4dSghi $content .= "\n"; 441aeb2b4dSghi } 451aeb2b4dSghi saveWikiText($ID, $content, APPROVED); 461aeb2b4dSghi 471aeb2b4dSghi header('Location: ?id='.$ID); 481aeb2b4dSghi } 491aeb2b4dSghi 501aeb2b4dSghi /*czytacze wydzą najnowszą zatwierdzaną*/ 511aeb2b4dSghi $last = $this->find_lastest_approved(); 521aeb2b4dSghi /*użytkownik może tylko czytać i jednocześnie istnieje jakaś zatwierdzona strona*/ 531aeb2b4dSghi if (auth_quickaclcheck($ID) <= AUTH_READ && $last != -1) 541aeb2b4dSghi /*najnowsza zatwierdzona nie jest najnowszą*/ 551aeb2b4dSghi /*i jednocześnie znajdujemy się w stronach nowszych niż aktualna zatwierdzona*/ 561aeb2b4dSghi if ($last != 0 && ($REV > $last || $REV == 0)) 571aeb2b4dSghi $REV = $last; 581aeb2b4dSghi } 591aeb2b4dSghi function find_lastest_approved() { 601aeb2b4dSghi global $ID; 611aeb2b4dSghi $m = p_get_metadata($ID); 621aeb2b4dSghi $sum = $m['last_change']['sum']; 631aeb2b4dSghi if ($sum == APPROVED) 641aeb2b4dSghi return 0; 651aeb2b4dSghi 661aeb2b4dSghi $changelog = new PageChangeLog($ID); 671aeb2b4dSghi //wyszukaj najnowszej zatwierdzonej 681aeb2b4dSghi //poszukaj w dół 691aeb2b4dSghi $chs = $changelog->getRevisions(0, 10000); 701aeb2b4dSghi foreach ($chs as $rev) { 711aeb2b4dSghi $ch = $changelog->getRevisionInfo($rev); 721aeb2b4dSghi if ($ch['sum'] == APPROVED) 731aeb2b4dSghi return $rev; 741aeb2b4dSghi } 751aeb2b4dSghi return -1; 761aeb2b4dSghi } 771aeb2b4dSghi 781aeb2b4dSghi function handle_display_banner(&$event, $param) { 791aeb2b4dSghi global $ID, $REV, $INFO; 801aeb2b4dSghi 811aeb2b4dSghi if($event->data != 'show') return; 821aeb2b4dSghi if (!$INFO['exists']) return; 831aeb2b4dSghi 841aeb2b4dSghi $m = p_get_metadata($ID); 851aeb2b4dSghi $changelog = new PageChangeLog($ID); 861aeb2b4dSghi 871aeb2b4dSghi //sprawdź status aktualnej strony 881aeb2b4dSghi if ($REV != 0) { 891aeb2b4dSghi $ch = $changelog->getRevisionInfo($REV); 901aeb2b4dSghi $sum = $ch['sum']; 911aeb2b4dSghi } else { 921aeb2b4dSghi $sum = $m['last_change']['sum']; 931aeb2b4dSghi } 941aeb2b4dSghi 951aeb2b4dSghi if ($sum != APPRVOED) { 961aeb2b4dSghi $class = 'approved_no'; 971aeb2b4dSghi $last_approved_rev = $this->find_lastest_approved(); 981aeb2b4dSghi } 991aeb2b4dSghi 1001aeb2b4dSghi 1011aeb2b4dSghi ptln('<div class="approval '.($sum == APPROVED ? 'approved_yes' : 'approved_no').'">'); 1021aeb2b4dSghi 1031aeb2b4dSghi tpl_pageinfo(); 1041aeb2b4dSghi ptln(' | '); 1051aeb2b4dSghi if ($sum == APPROVED) { 1061aeb2b4dSghi ptln('<span>'.$this->getLang('approved').'</span>'); 1071aeb2b4dSghi if ($REV != 0 && auth_quickaclcheck($ID) > AUTH_READ) { 1081aeb2b4dSghi ptln('<a href="'.wl($ID).'">'); 1091aeb2b4dSghi ptln($this->getLang($m['last_change']['sum'] == APPROVED ? 'newest_approved' : 'newest_draft')); 1101aeb2b4dSghi ptln('</a>'); 1111aeb2b4dSghi } else if ($REV != 0 && $REV != $last_approved_rev) { 1121aeb2b4dSghi ptln('<a href="'.wl($ID).'">'); 1131aeb2b4dSghi ptln($this->getLang('newest_approved')); 1141aeb2b4dSghi ptln('</a>'); 1151aeb2b4dSghi } 1161aeb2b4dSghi } else { 1171aeb2b4dSghi ptln('<span>'.$this->getLang('draft').'</span>'); 1181aeb2b4dSghi 1191aeb2b4dSghi if (isset($last_approved_rev)) { 1201aeb2b4dSghi if ($last_approved_rev != 0) 1211aeb2b4dSghi ptln('<a href="'.wl($ID, array('rev' => $last_approved_rev)).'">'); 1221aeb2b4dSghi else 1231aeb2b4dSghi ptln('<a href="'.wl($ID).'">'); 1241aeb2b4dSghi 1251aeb2b4dSghi ptln($this->getLang('newest_approved')); 1261aeb2b4dSghi ptln('</a>'); 1271aeb2b4dSghi } else { 1281aeb2b4dSghi ptln('<a href="'.wl($ID).'">'); 1291aeb2b4dSghi ptln($this->getLang('newest_draft')); 1301aeb2b4dSghi ptln('</a>'); 1311aeb2b4dSghi } 1321aeb2b4dSghi 1331aeb2b4dSghi //można zatwierdzać tylko najnowsze strony 1341aeb2b4dSghi if ($REV == 0 && $this->can_approve()) { 1351aeb2b4dSghi ptln('<a href="'.wl($ID, array('rev' => $last_approved_rev, 'do' => 'diff', 1361aeb2b4dSghi 'approve' => 'approve')).'">'); 1371aeb2b4dSghi ptln($this->getLang('approve')); 1381aeb2b4dSghi ptln('</a>'); 1391aeb2b4dSghi } 1401aeb2b4dSghi } 1411aeb2b4dSghi ptln('</div>'); 1421aeb2b4dSghi } 1431aeb2b4dSghi 1441aeb2b4dSghi} 145