11aeb2b4dSghi<?php 21aeb2b4dSghi 31aeb2b4dSghiif(!defined('DOKU_INC')) die(); 41aeb2b4dSghi 51aeb2b4dSghiclass action_plugin_approve_approve extends DokuWiki_Action_Plugin { 61b552e87SSzymon Olewniczak /** 74474ed8aSSzymon Olewniczak * @param Doku_Event_Handler $controller 84474ed8aSSzymon Olewniczak */ 94474ed8aSSzymon Olewniczak public function register(Doku_Event_Handler $controller) { 104474ed8aSSzymon Olewniczak $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept'); 114474ed8aSSzymon Olewniczak $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev'); 124474ed8aSSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve'); 1307b13373SSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_mark_ready_for_approval'); 144474ed8aSSzymon Olewniczak $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer'); 154474ed8aSSzymon Olewniczak $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner'); 1655f447f4SSzymon Olewniczak $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); 171aeb2b4dSghi } 181aeb2b4dSghi 194474ed8aSSzymon Olewniczak /** 204474ed8aSSzymon Olewniczak * @param Doku_Event $event 214474ed8aSSzymon Olewniczak */ 224474ed8aSSzymon Olewniczak public function handle_diff_accept(Doku_Event $event) { 234474ed8aSSzymon Olewniczak global $INFO; 244474ed8aSSzymon Olewniczak 250c60a293SSzymon Olewniczak try { 260c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 270c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 280c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 290c60a293SSzymon Olewniczak } catch (Exception $e) { 300c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 310c60a293SSzymon Olewniczak return; 320c60a293SSzymon Olewniczak } 330c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 340c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 350c60a293SSzymon Olewniczak 360c60a293SSzymon Olewniczak if (!$helper->use_approve_here($sqlite, $INFO['id'])) return; 3750481663SSzymon Olewniczak 381aeb2b4dSghi if ($event->data == 'diff' && isset($_GET['approve'])) { 394474ed8aSSzymon Olewniczak $href = wl($INFO['id'], ['approve' => 'approve']); 404474ed8aSSzymon Olewniczak ptln('<a href="' . $href . '">'.$this->getLang('approve').'</a>'); 411aeb2b4dSghi } 4284047bdaSRuud 434474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) { 444474ed8aSSzymon Olewniczak $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']); 45058bad72SSzymon Olewniczak ptln('<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>'); 4684047bdaSRuud } 471aeb2b4dSghi } 481aeb2b4dSghi 494474ed8aSSzymon Olewniczak /** 504474ed8aSSzymon Olewniczak * @param Doku_Event $event 514474ed8aSSzymon Olewniczak */ 524474ed8aSSzymon Olewniczak public function handle_showrev(Doku_Event $event) { 534474ed8aSSzymon Olewniczak global $INFO; 541aeb2b4dSghi 550c60a293SSzymon Olewniczak try { 560c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 570c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 580c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 590c60a293SSzymon Olewniczak } catch (Exception $e) { 600c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 610c60a293SSzymon Olewniczak return; 620c60a293SSzymon Olewniczak } 630c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 640c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 654474ed8aSSzymon Olewniczak 660c60a293SSzymon Olewniczak if (!$helper->use_approve_here($sqlite, $INFO['id'])) return; 670c60a293SSzymon Olewniczak 680c60a293SSzymon Olewniczak $last_approved_rev = $helper->find_last_approved($sqlite, $INFO['id']); 694474ed8aSSzymon Olewniczak if ($last_approved_rev == $INFO['rev']) { 701aeb2b4dSghi $event->preventDefault(); 711aeb2b4dSghi } 721aeb2b4dSghi } 731aeb2b4dSghi 744474ed8aSSzymon Olewniczak /** 754474ed8aSSzymon Olewniczak * @param Doku_Event $event 764474ed8aSSzymon Olewniczak */ 774474ed8aSSzymon Olewniczak public function handle_approve(Doku_Event $event) { 784474ed8aSSzymon Olewniczak global $INFO; 794474ed8aSSzymon Olewniczak 800c60a293SSzymon Olewniczak try { 810c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 820c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 830c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 840c60a293SSzymon Olewniczak } catch (Exception $e) { 850c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 860c60a293SSzymon Olewniczak return; 870c60a293SSzymon Olewniczak } 880c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 890c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 900c60a293SSzymon Olewniczak 9107b13373SSzymon Olewniczak if ($event->data != 'show') return; 9207b13373SSzymon Olewniczak if (!isset($_GET['approve'])) return; 930c60a293SSzymon Olewniczak if (!$helper->use_approve_here($sqlite, $INFO['id'], $approver)) return; 940c60a293SSzymon Olewniczak if (!$helper->client_can_approve($INFO['id'], $approver)) return; 954474ed8aSSzymon Olewniczak 960c60a293SSzymon Olewniczak $res = $sqlite->query('SELECT MAX(version)+1 FROM revision 974474ed8aSSzymon Olewniczak WHERE page=?', $INFO['id']); 980c60a293SSzymon Olewniczak $next_version = $sqlite->res2single($res); 994474ed8aSSzymon Olewniczak if (!$next_version) { 1004474ed8aSSzymon Olewniczak $next_version = 1; 10184047bdaSRuud } 1024474ed8aSSzymon Olewniczak //approved IS NULL prevents from overriding already approved page 1030c60a293SSzymon Olewniczak $sqlite->query('UPDATE revision 104c7d53eabSSzymon Olewniczak SET approved=?, approved_by=?, version=? 1054474ed8aSSzymon Olewniczak WHERE page=? AND current=1 AND approved IS NULL', 106c7d53eabSSzymon Olewniczak date('c'), $INFO['client'], $next_version, $INFO['id']); 10784047bdaSRuud 1084474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 10907b13373SSzymon Olewniczak } 11007b13373SSzymon Olewniczak 11107b13373SSzymon Olewniczak /** 11207b13373SSzymon Olewniczak * @param Doku_Event $event 11307b13373SSzymon Olewniczak */ 11407b13373SSzymon Olewniczak public function handle_mark_ready_for_approval(Doku_Event $event) { 11507b13373SSzymon Olewniczak global $INFO; 11607b13373SSzymon Olewniczak 1170c60a293SSzymon Olewniczak try { 1180c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 1190c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 1200c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 1210c60a293SSzymon Olewniczak } catch (Exception $e) { 1220c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 1230c60a293SSzymon Olewniczak return; 1240c60a293SSzymon Olewniczak } 1250c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 1260c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 1270c60a293SSzymon Olewniczak 12807b13373SSzymon Olewniczak if ($event->data != 'show') return; 12907b13373SSzymon Olewniczak if (!isset($_GET['ready_for_approval'])) return; 1300c60a293SSzymon Olewniczak if (!$helper->use_approve_here($sqlite, $INFO['id'])) return; 1310c60a293SSzymon Olewniczak if (!$helper->client_can_mark_ready_for_approval($INFO['id'])) return; 13250481663SSzymon Olewniczak 1330c60a293SSzymon Olewniczak $sqlite->query('UPDATE revision SET ready_for_approval=?, ready_for_approval_by=? 1344474ed8aSSzymon Olewniczak WHERE page=? AND current=1 AND ready_for_approval IS NULL', 135c7d53eabSSzymon Olewniczak date('c'), $INFO['client'], $INFO['id']); 13650481663SSzymon Olewniczak 1374474ed8aSSzymon Olewniczak header('Location: ' . wl($INFO['id'])); 1381aeb2b4dSghi } 13955f447f4SSzymon Olewniczak 1404474ed8aSSzymon Olewniczak /** 1414474ed8aSSzymon Olewniczak * Redirect to newest approved page for user that don't have EDIT permission. 1424474ed8aSSzymon Olewniczak * 1434474ed8aSSzymon Olewniczak * @param Doku_Event $event 1444474ed8aSSzymon Olewniczak */ 1454474ed8aSSzymon Olewniczak public function handle_viewer(Doku_Event $event) { 1464474ed8aSSzymon Olewniczak global $INFO; 1474474ed8aSSzymon Olewniczak 1480c60a293SSzymon Olewniczak try { 1490c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 1500c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 1510c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 1520c60a293SSzymon Olewniczak } catch (Exception $e) { 1530c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 1540c60a293SSzymon Olewniczak return; 1550c60a293SSzymon Olewniczak } 1560c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 1570c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 1580c60a293SSzymon Olewniczak 15938d03fbdSghi if ($event->data != 'show') return; 1604474ed8aSSzymon Olewniczak //apply only to current page 161c7d53eabSSzymon Olewniczak if ($INFO['rev'] != 0) return; 1620c60a293SSzymon Olewniczak if (!$helper->use_approve_here($sqlite, $INFO['id'], $approver)) return; 1630c60a293SSzymon Olewniczak if ($helper->client_can_see_drafts($INFO['id'], $approver)) return; 1641aeb2b4dSghi 1650c60a293SSzymon Olewniczak $last_approved_rev = $helper->find_last_approved($sqlite, $INFO['id']); 16638d03fbdSghi //no page is approved 1674474ed8aSSzymon Olewniczak if (!$last_approved_rev) return; 16838d03fbdSghi 1694474ed8aSSzymon Olewniczak $last_change_date = @filemtime(wikiFN($INFO['id'])); 1704474ed8aSSzymon Olewniczak //current page is approved 1714474ed8aSSzymon Olewniczak if ($last_approved_rev == $last_change_date) return; 1724474ed8aSSzymon Olewniczak 173de24d3c4SSzymon Olewniczak header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev], false, '&')); 1741aeb2b4dSghi } 17555f447f4SSzymon Olewniczak 1764474ed8aSSzymon Olewniczak /** 1774474ed8aSSzymon Olewniczak * @param Doku_Event $event 1784474ed8aSSzymon Olewniczak */ 1794474ed8aSSzymon Olewniczak public function handle_display_banner(Doku_Event $event) { 180ba33f445SSzymon Olewniczak global $INFO, $ID; 181bab76148SSzymon Olewniczak 182329c5e3aSMartin Diedrich /* Return true if banner should not be displayed for users with or below read only permission. */ 183e3ecf210SMartin Diedrich if (auth_quickaclcheck($ID) <= AUTH_READ && !$this->getConf('display_banner_for_readonly')) { 184329c5e3aSMartin Diedrich return true; 185eb084c59SSzymon Olewniczak } 186329c5e3aSMartin Diedrich 187329c5e3aSMartin Diedrich /* Not returned - rendering the banner */ 1880c60a293SSzymon Olewniczak try { 1890c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 1900c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 1910c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 1920c60a293SSzymon Olewniczak } catch (Exception $e) { 1930c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 1940c60a293SSzymon Olewniczak return; 1950c60a293SSzymon Olewniczak } 1960c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 1970c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 1980c60a293SSzymon Olewniczak 1991aeb2b4dSghi if ($event->data != 'show') return; 2001aeb2b4dSghi if (!$INFO['exists']) return; 2010c60a293SSzymon Olewniczak if (!$helper->use_approve_here($sqlite, $INFO['id'], $approver)) return; 2021aeb2b4dSghi 2034474ed8aSSzymon Olewniczak// $last_change_date = p_get_metadata($INFO['id'], 'last_change date'); 2044474ed8aSSzymon Olewniczak $last_change_date = @filemtime(wikiFN($INFO['id'])); 2054474ed8aSSzymon Olewniczak $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev']; 2061aeb2b4dSghi 20755f447f4SSzymon Olewniczak 2080c60a293SSzymon Olewniczak $res = $sqlite->query('SELECT ready_for_approval, ready_for_approval_by, 209c7d53eabSSzymon Olewniczak approved, approved_by, version 2104474ed8aSSzymon Olewniczak FROM revision 2114474ed8aSSzymon Olewniczak WHERE page=? AND rev=?', $INFO['id'], $rev); 2124474ed8aSSzymon Olewniczak 2130c60a293SSzymon Olewniczak $approve = $sqlite->res_fetch_assoc($res); 214*15e5c2ddSSzymon Olewniczak $last_approved_rev = $helper->find_last_approved($sqlite, $INFO['id']); 2154474ed8aSSzymon Olewniczak 2164474ed8aSSzymon Olewniczak $classes = []; 21755f447f4SSzymon Olewniczak if ($this->getConf('prettyprint')) { 21855f447f4SSzymon Olewniczak $classes[] = 'plugin__approve_noprint'; 21955f447f4SSzymon Olewniczak } 22055f447f4SSzymon Olewniczak 221*15e5c2ddSSzymon Olewniczak if ($approve['approved'] && $rev == $last_approved_rev) { 222*15e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_approved'; 223*15e5c2ddSSzymon Olewniczak } elseif ($approve['approved']) { 224*15e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_old_approved'; 2254474ed8aSSzymon Olewniczak } elseif ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) { 226bab76148SSzymon Olewniczak $classes[] = 'plugin__approve_ready'; 22755f447f4SSzymon Olewniczak } else { 228*15e5c2ddSSzymon Olewniczak $classes[] = 'plugin__approve_draft'; 22955f447f4SSzymon Olewniczak } 23055f447f4SSzymon Olewniczak 23155f447f4SSzymon Olewniczak ptln('<div id="plugin__approve" class="' . implode(' ', $classes) . '">'); 2321aeb2b4dSghi 233c7d53eabSSzymon Olewniczak// tpl_pageinfo(); 234c7d53eabSSzymon Olewniczak// ptln(' | '); 235af3e3cd8SSzymon Olewniczak 2364474ed8aSSzymon Olewniczak if ($approve['approved']) { 237c7d53eabSSzymon Olewniczak ptln('<strong>'.$this->getLang('approved').'</strong>'); 238c7d53eabSSzymon Olewniczak ptln(' ' . dformat(strtotime($approve['approved']))); 239329c5e3aSMartin Diedrich 240329c5e3aSMartin Diedrich if($this->getConf('banner_long')) { 241d8ede060SSzymon Olewniczak ptln(' ' . $this->getLang('by') . ' ' . userlink($approve['approved_by'], true)); 242c7d53eabSSzymon Olewniczak ptln(' (' . $this->getLang('version') . ': ' . $approve['version'] . ')'); 243329c5e3aSMartin Diedrich } 2444474ed8aSSzymon Olewniczak 2454474ed8aSSzymon Olewniczak //not the newest page 2464474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 2470c60a293SSzymon Olewniczak $res = $sqlite->query('SELECT rev, current FROM revision 2484474ed8aSSzymon Olewniczak WHERE page=? AND approved IS NOT NULL 2494474ed8aSSzymon Olewniczak ORDER BY rev DESC LIMIT 1', $INFO['id']); 2504474ed8aSSzymon Olewniczak 2510c60a293SSzymon Olewniczak $last_approve = $sqlite->res_fetch_assoc($res); 2524474ed8aSSzymon Olewniczak 2534474ed8aSSzymon Olewniczak //we can see drafts 2540c60a293SSzymon Olewniczak if ($helper->client_can_see_drafts($INFO['id'], $approver)) { 2554474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id']) . '">'); 256c7d53eabSSzymon Olewniczak ptln($this->getLang($last_approve['current'] ? 'newest_approved' : 'newest_draft')); 2571aeb2b4dSghi ptln('</a>'); 258c7d53eabSSzymon Olewniczak //we cannot see link to draft but there is some newer approved version 259c7d53eabSSzymon Olewniczak } elseif ($last_approve['rev'] != $rev) { 2604474ed8aSSzymon Olewniczak $urlParameters = []; 261c7d53eabSSzymon Olewniczak if (!$last_approve['current']) { 262c7d53eabSSzymon Olewniczak $urlParameters['rev'] = $last_approve['rev']; 2634474ed8aSSzymon Olewniczak } 2644474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">'); 2651aeb2b4dSghi ptln($this->getLang('newest_approved')); 2661aeb2b4dSghi ptln('</a>'); 2671aeb2b4dSghi } 2684474ed8aSSzymon Olewniczak } 2694474ed8aSSzymon Olewniczak 2701aeb2b4dSghi } else { 2714474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && $approve['ready_for_approval']) { 272c7d53eabSSzymon Olewniczak ptln('<strong>'.$this->getLang('marked_approve_ready').'</strong>'); 273c7d53eabSSzymon Olewniczak ptln(' ' . dformat(strtotime($approve['ready_for_approval']))); 274d8ede060SSzymon Olewniczak ptln(' ' . $this->getLang('by') . ' ' . userlink($approve['ready_for_approval_by'], true)); 275c7d53eabSSzymon Olewniczak } else { 276c7d53eabSSzymon Olewniczak ptln('<strong>'.$this->getLang('draft').'</strong>'); 27784047bdaSRuud } 27884047bdaSRuud 27984047bdaSRuud 2800c60a293SSzymon Olewniczak $res = $sqlite->query('SELECT rev, current FROM revision 2814474ed8aSSzymon Olewniczak WHERE page=? AND approved IS NOT NULL 2824474ed8aSSzymon Olewniczak ORDER BY rev DESC LIMIT 1', $INFO['id']); 2834474ed8aSSzymon Olewniczak 2840c60a293SSzymon Olewniczak $last_approve = $sqlite->res_fetch_assoc($res); 2854474ed8aSSzymon Olewniczak 2864474ed8aSSzymon Olewniczak 2874474ed8aSSzymon Olewniczak //not exists approve for current page 288c7d53eabSSzymon Olewniczak if (!$last_approve) { 2894474ed8aSSzymon Olewniczak //not the newest page 2904474ed8aSSzymon Olewniczak if ($rev != $last_change_date) { 2914474ed8aSSzymon Olewniczak ptln('<a href="'.wl($INFO['id']).'">'); 292274d699aSghi ptln($this->getLang('newest_draft')); 293274d699aSghi ptln('</a>'); 294274d699aSghi } 295274d699aSghi } else { 2964474ed8aSSzymon Olewniczak $urlParameters = []; 297c7d53eabSSzymon Olewniczak if (!$last_approve['current']) { 298c7d53eabSSzymon Olewniczak $urlParameters['rev'] = $last_approve['rev']; 2994474ed8aSSzymon Olewniczak } 3004474ed8aSSzymon Olewniczak ptln('<a href="' . wl($INFO['id'], $urlParameters) . '">'); 3011aeb2b4dSghi ptln($this->getLang('newest_approved')); 3021aeb2b4dSghi ptln('</a>'); 3031aeb2b4dSghi } 3041aeb2b4dSghi 3054474ed8aSSzymon Olewniczak //we are in current page 3064474ed8aSSzymon Olewniczak if ($rev == $last_change_date) { 3074474ed8aSSzymon Olewniczak 308c7d53eabSSzymon Olewniczak //compare with the last approved page or 0 if there is no approved versions 3094474ed8aSSzymon Olewniczak $last_approved_rev = 0; 310c7d53eabSSzymon Olewniczak if (isset($last_approve['rev'])) { 311c7d53eabSSzymon Olewniczak $last_approved_rev = $last_approve['rev']; 3124474ed8aSSzymon Olewniczak } 3134474ed8aSSzymon Olewniczak 3144474ed8aSSzymon Olewniczak if ($this->getConf('ready_for_approval') && 3150c60a293SSzymon Olewniczak $helper->client_can_mark_ready_for_approval($INFO['id']) && 3164474ed8aSSzymon Olewniczak !$approve['ready_for_approval']) { 3174474ed8aSSzymon Olewniczak 3184474ed8aSSzymon Olewniczak $urlParameters = [ 3194474ed8aSSzymon Olewniczak 'rev' => $last_approved_rev, 3204474ed8aSSzymon Olewniczak 'do' => 'diff', 3214474ed8aSSzymon Olewniczak 'ready_for_approval' => 'ready_for_approval' 3224474ed8aSSzymon Olewniczak ]; 3234474ed8aSSzymon Olewniczak ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">'); 32484047bdaSRuud ptln($this->getLang('approve_ready')); 32584047bdaSRuud ptln('</a>'); 32684047bdaSRuud } 32784047bdaSRuud 3280c60a293SSzymon Olewniczak if ($helper->client_can_approve($INFO['id'], $approver)) { 3294474ed8aSSzymon Olewniczak 3304474ed8aSSzymon Olewniczak $urlParameters = [ 3314474ed8aSSzymon Olewniczak 'rev' => $last_approved_rev, 3324474ed8aSSzymon Olewniczak 'do' => 'diff', 3334474ed8aSSzymon Olewniczak 'approve' => 'approve' 3344474ed8aSSzymon Olewniczak ]; 3354474ed8aSSzymon Olewniczak ptln(' | <a href="'.wl($INFO['id'], $urlParameters).'">'); 3361aeb2b4dSghi ptln($this->getLang('approve')); 3371aeb2b4dSghi ptln('</a>'); 3381aeb2b4dSghi } 339c7d53eabSSzymon Olewniczak } 340c7d53eabSSzymon Olewniczak } 34184047bdaSRuud 342329c5e3aSMartin Diedrich if ($approver && $this->getConf('banner_long')) { 3432ce523c6SSzymon Olewniczak ptln(' | ' . $this->getLang('approver') . ': ' . userlink($approver, true)); 3444474ed8aSSzymon Olewniczak } 345c7d53eabSSzymon Olewniczak 3461aeb2b4dSghi ptln('</div>'); 3471aeb2b4dSghi } 3481aeb2b4dSghi 349af3e3cd8SSzymon Olewniczak /** 3500c60a293SSzymon Olewniczak * @return bool|string|void 3514474ed8aSSzymon Olewniczak */ 352b1ff32a1SSzymon Olewniczak protected function lastRevisionHasntApprovalData($id) { 3530c60a293SSzymon Olewniczak 3540c60a293SSzymon Olewniczak try { 3550c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 3560c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 3570c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 3580c60a293SSzymon Olewniczak } catch (Exception $e) { 3590c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 3600c60a293SSzymon Olewniczak return; 3610c60a293SSzymon Olewniczak } 3620c60a293SSzymon Olewniczak 3630c60a293SSzymon Olewniczak $res = $sqlite->query('SELECT rev FROM revision 3644474ed8aSSzymon Olewniczak WHERE page=? 3654474ed8aSSzymon Olewniczak AND current=1 3664474ed8aSSzymon Olewniczak AND approved IS NULL 3674474ed8aSSzymon Olewniczak AND ready_for_approval IS NULL', $id); 3684474ed8aSSzymon Olewniczak 3690c60a293SSzymon Olewniczak return $sqlite->res2single($res); 3704474ed8aSSzymon Olewniczak } 3714474ed8aSSzymon Olewniczak 3724474ed8aSSzymon Olewniczak /** 3734474ed8aSSzymon Olewniczak * 3744474ed8aSSzymon Olewniczak * @param Doku_Event $event event object by reference 3754474ed8aSSzymon Olewniczak * @return void 3764474ed8aSSzymon Olewniczak */ 3774474ed8aSSzymon Olewniczak public function handle_pagesave_after(Doku_Event $event) { 3780c60a293SSzymon Olewniczak try { 3790c60a293SSzymon Olewniczak /** @var \helper_plugin_approve_db $db_helper */ 3800c60a293SSzymon Olewniczak $db_helper = plugin_load('helper', 'approve_db'); 3810c60a293SSzymon Olewniczak $sqlite = $db_helper->getDB(); 3820c60a293SSzymon Olewniczak } catch (Exception $e) { 3830c60a293SSzymon Olewniczak msg($e->getMessage(), -1); 3840c60a293SSzymon Olewniczak return; 3850c60a293SSzymon Olewniczak } 3860c60a293SSzymon Olewniczak /** @var helper_plugin_approve $helper */ 3870c60a293SSzymon Olewniczak $helper = plugin_load('helper', 'approve'); 3880c60a293SSzymon Olewniczak 3891b552e87SSzymon Olewniczak //no content was changed 3904474ed8aSSzymon Olewniczak if (!$event->data['contentChanged']) return; 3914474ed8aSSzymon Olewniczak 3924474ed8aSSzymon Olewniczak $changeType = $event->data['changeType']; 3934474ed8aSSzymon Olewniczak if ($changeType == DOKU_CHANGE_TYPE_REVERT) { 3944474ed8aSSzymon Olewniczak if ($event->data['oldContent'] == '') { 3954474ed8aSSzymon Olewniczak $changeType = DOKU_CHANGE_TYPE_CREATE; 3964474ed8aSSzymon Olewniczak } else { 3974474ed8aSSzymon Olewniczak $changeType = DOKU_CHANGE_TYPE_EDIT; 3984474ed8aSSzymon Olewniczak } 3994474ed8aSSzymon Olewniczak } 4004474ed8aSSzymon Olewniczak 4014474ed8aSSzymon Olewniczak $id = $event->data['id']; 4024474ed8aSSzymon Olewniczak switch ($changeType) { 4034474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_EDIT: 4044474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_REVERT: 4054474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_MINOR_EDIT: 4064474ed8aSSzymon Olewniczak $last_change_date = $event->data['newRevision']; 4074474ed8aSSzymon Olewniczak 4084474ed8aSSzymon Olewniczak //if the current page has approved or ready_for_approval -- keep it 409b1ff32a1SSzymon Olewniczak $rev = $this->lastRevisionHasntApprovalData($id); 410b1ff32a1SSzymon Olewniczak if ($rev) { 4110c60a293SSzymon Olewniczak $sqlite->query('UPDATE revision SET rev=? WHERE page=? AND rev=?', 412b1ff32a1SSzymon Olewniczak $last_change_date, $id, $rev); 4134474ed8aSSzymon Olewniczak 4144474ed8aSSzymon Olewniczak } else { 4154474ed8aSSzymon Olewniczak //keep previous record 4160c60a293SSzymon Olewniczak $sqlite->query('UPDATE revision SET current=0 4174474ed8aSSzymon Olewniczak WHERE page=? 4184474ed8aSSzymon Olewniczak AND current=1', $id); 4194474ed8aSSzymon Olewniczak 4200c60a293SSzymon Olewniczak $sqlite->storeEntry('revision', [ 4214474ed8aSSzymon Olewniczak 'page' => $id, 4224474ed8aSSzymon Olewniczak 'rev' => $last_change_date, 4234474ed8aSSzymon Olewniczak 'current' => 1 4244474ed8aSSzymon Olewniczak ]); 4254474ed8aSSzymon Olewniczak } 4264474ed8aSSzymon Olewniczak break; 4274474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_DELETE: 4284474ed8aSSzymon Olewniczak //delete information about availability of a page but keep the history 4290c60a293SSzymon Olewniczak $sqlite->query('DELETE FROM page WHERE page=?', $id); 4304474ed8aSSzymon Olewniczak 4314474ed8aSSzymon Olewniczak //delete revision if no information about approvals 432b1ff32a1SSzymon Olewniczak $rev = $this->lastRevisionHasntApprovalData($id); 433b1ff32a1SSzymon Olewniczak if ($rev) { 4340c60a293SSzymon Olewniczak $sqlite->query('DELETE FROM revision WHERE page=? AND rev=?', $id, $rev); 4354474ed8aSSzymon Olewniczak } else { 4360c60a293SSzymon Olewniczak $sqlite->query('UPDATE revision SET current=0 WHERE page=? AND current=1', $id); 4374474ed8aSSzymon Olewniczak } 4384474ed8aSSzymon Olewniczak 4394474ed8aSSzymon Olewniczak break; 4404474ed8aSSzymon Olewniczak case DOKU_CHANGE_TYPE_CREATE: 4410c60a293SSzymon Olewniczak if ($helper->isPageAssigned($sqlite, $id, $newApprover)) { 442b1ff32a1SSzymon Olewniczak $data = [ 4431b552e87SSzymon Olewniczak 'page' => $id, 4440c60a293SSzymon Olewniczak 'hidden' => $helper->in_hidden_namespace($sqlite, $id) ? '1' : '0' 445b1ff32a1SSzymon Olewniczak ]; 4462ce523c6SSzymon Olewniczak if (!blank($newApprover)) { 4472ce523c6SSzymon Olewniczak $data['approver'] = $newApprover; 448b1ff32a1SSzymon Olewniczak } 4490c60a293SSzymon Olewniczak $sqlite->storeEntry('page', $data); 450b1ff32a1SSzymon Olewniczak } 4514474ed8aSSzymon Olewniczak 452b1ff32a1SSzymon Olewniczak //store revision 453b1ff32a1SSzymon Olewniczak $last_change_date = $event->data['newRevision']; 4540c60a293SSzymon Olewniczak $sqlite->storeEntry('revision', [ 4554474ed8aSSzymon Olewniczak 'page' => $id, 4564474ed8aSSzymon Olewniczak 'rev' => $last_change_date, 4574474ed8aSSzymon Olewniczak 'current' => 1 4584474ed8aSSzymon Olewniczak ]); 4594474ed8aSSzymon Olewniczak break; 4604474ed8aSSzymon Olewniczak } 4614474ed8aSSzymon Olewniczak } 4621aeb2b4dSghi} 463