xref: /plugin/approve/action/approve.php (revision 15e5c2ddd36bd07a9c7b18a2478b8dd105b7296b)
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