xref: /plugin/approve/action/approve.php (revision b59355cdb0bc1813158c3cec643671b1fa1b3e90)
11aeb2b4dSghi<?php
21aeb2b4dSghi
31989ee26SSzymon Olewniczakuse dokuwiki\Extension\ActionPlugin;
41989ee26SSzymon Olewniczakuse dokuwiki\Extension\EventHandler;
51989ee26SSzymon Olewniczakuse dokuwiki\Extension\Event;
61aeb2b4dSghi
71989ee26SSzymon Olewniczakclass action_plugin_approve_approve extends ActionPlugin {
81b552e87SSzymon Olewniczak    /**
91989ee26SSzymon Olewniczak     * @inheritDoc
104474ed8aSSzymon Olewniczak     */
111989ee26SSzymon Olewniczak    public function register(EventHandler $controller) {
124474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, 'handle_diff_accept');
134474ed8aSSzymon Olewniczak        $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handle_showrev');
144474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_approve');
1507b13373SSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_mark_ready_for_approval');
164474ed8aSSzymon Olewniczak        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_viewer');
174474ed8aSSzymon Olewniczak        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner');
1855f447f4SSzymon Olewniczak        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after');
191aeb2b4dSghi    }
201aeb2b4dSghi
214474ed8aSSzymon Olewniczak    /**
221989ee26SSzymon Olewniczak     * @param Event $event
234474ed8aSSzymon Olewniczak     */
241989ee26SSzymon Olewniczak    public function handle_diff_accept(Event $event) {
254474ed8aSSzymon Olewniczak        global $INFO;
264474ed8aSSzymon Olewniczak
271989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
281989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
290c60a293SSzymon Olewniczak
301989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
3150481663SSzymon Olewniczak
321aeb2b4dSghi        if ($event->data == 'diff' && isset($_GET['approve'])) {
334474ed8aSSzymon Olewniczak            $href = wl($INFO['id'], ['approve' => 'approve']);
34*b59355cdSSzymon Olewniczak            echo '<a href="' . $href . '">'.$this->getLang('approve').'</a>';
351aeb2b4dSghi        }
3684047bdaSRuud
374474ed8aSSzymon Olewniczak        if ($this->getConf('ready_for_approval') && $event->data == 'diff' && isset($_GET['ready_for_approval'])) {
384474ed8aSSzymon Olewniczak            $href = wl($INFO['id'], ['ready_for_approval' => 'ready_for_approval']);
39*b59355cdSSzymon Olewniczak            echo '<a href="' . $href . '">'.$this->getLang('approve_ready').'</a>';
4084047bdaSRuud        }
411aeb2b4dSghi    }
421aeb2b4dSghi
434474ed8aSSzymon Olewniczak    /**
441989ee26SSzymon Olewniczak     * @param Event $event
454474ed8aSSzymon Olewniczak     */
461989ee26SSzymon Olewniczak    public function handle_showrev(Event $event) {
474474ed8aSSzymon Olewniczak        global $INFO;
481aeb2b4dSghi
49*b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
50*b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
511989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
521989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
534474ed8aSSzymon Olewniczak
541989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
550c60a293SSzymon Olewniczak
561989ee26SSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
574474ed8aSSzymon Olewniczak        if ($last_approved_rev == $INFO['rev']) {
581aeb2b4dSghi            $event->preventDefault();
591aeb2b4dSghi        }
601aeb2b4dSghi    }
611aeb2b4dSghi
624474ed8aSSzymon Olewniczak    /**
631989ee26SSzymon Olewniczak     * @param Event $event
644474ed8aSSzymon Olewniczak     */
651989ee26SSzymon Olewniczak    public function handle_approve(Event $event) {
664474ed8aSSzymon Olewniczak        global $INFO;
674474ed8aSSzymon Olewniczak
681989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
691989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
700c60a293SSzymon Olewniczak
7107b13373SSzymon Olewniczak        if ($event->data != 'show') return;
7207b13373SSzymon Olewniczak        if (!isset($_GET['approve'])) return;
731989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
741989ee26SSzymon Olewniczak        if (!$acl->clientCanApprove($INFO['id'])) return;
754474ed8aSSzymon Olewniczak
76*b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
77*b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
781989ee26SSzymon Olewniczak        $db->setApprovedStatus($INFO['id']);
7984047bdaSRuud
804474ed8aSSzymon Olewniczak        header('Location: ' . wl($INFO['id']));
8107b13373SSzymon Olewniczak    }
8207b13373SSzymon Olewniczak
8307b13373SSzymon Olewniczak    /**
841989ee26SSzymon Olewniczak     * @param Event $event
8507b13373SSzymon Olewniczak     */
861989ee26SSzymon Olewniczak    public function handle_mark_ready_for_approval(Event $event) {
8707b13373SSzymon Olewniczak        global $INFO;
8807b13373SSzymon Olewniczak
891989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
901989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
910c60a293SSzymon Olewniczak
9207b13373SSzymon Olewniczak        if ($event->data != 'show') return;
9307b13373SSzymon Olewniczak        if (!isset($_GET['ready_for_approval'])) return;
941989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
951989ee26SSzymon Olewniczak        if (!$acl->clientCanMarkReadyForApproval($INFO['id'])) return;
9650481663SSzymon Olewniczak
97*b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
98*b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
991989ee26SSzymon Olewniczak        $db->setReadyForApprovalStatus($INFO['id']);
10050481663SSzymon Olewniczak
1014474ed8aSSzymon Olewniczak        header('Location: ' . wl($INFO['id']));
1021aeb2b4dSghi    }
10355f447f4SSzymon Olewniczak
1044474ed8aSSzymon Olewniczak    /**
1051989ee26SSzymon Olewniczak     * Redirect to latest approved page for user that don't have EDIT permission.
1064474ed8aSSzymon Olewniczak     *
1071989ee26SSzymon Olewniczak     * @param Event $event
1084474ed8aSSzymon Olewniczak     */
1091989ee26SSzymon Olewniczak    public function handle_viewer(Event $event) {
1104474ed8aSSzymon Olewniczak        global $INFO;
1114474ed8aSSzymon Olewniczak
1121989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
1131989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
1140c60a293SSzymon Olewniczak
11538d03fbdSghi        if ($event->data != 'show') return;
1164474ed8aSSzymon Olewniczak        //apply only to current page
117c7d53eabSSzymon Olewniczak        if ($INFO['rev'] != 0) return;
1181989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
1191989ee26SSzymon Olewniczak        if ($acl->clientCanSeeDrafts($INFO['id'])) return;
1201aeb2b4dSghi
121*b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
122*b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
1231989ee26SSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
1241989ee26SSzymon Olewniczak
12538d03fbdSghi        //no page is approved
1264474ed8aSSzymon Olewniczak        if (!$last_approved_rev) return;
12738d03fbdSghi
1284474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1294474ed8aSSzymon Olewniczak        // current page is approved
1304474ed8aSSzymon Olewniczak        if ($last_approved_rev == $last_change_date) return;
1314474ed8aSSzymon Olewniczak
132de24d3c4SSzymon Olewniczak        header("Location: " . wl($INFO['id'], ['rev' => $last_approved_rev], false, '&'));
1331aeb2b4dSghi    }
13455f447f4SSzymon Olewniczak
1354474ed8aSSzymon Olewniczak    /**
1361989ee26SSzymon Olewniczak     * @param Event $event
1374474ed8aSSzymon Olewniczak     */
1381989ee26SSzymon Olewniczak    public function handle_display_banner(Event $event) {
1391989ee26SSzymon Olewniczak        global $INFO;
140bab76148SSzymon Olewniczak
1411989ee26SSzymon Olewniczak        /** @var helper_plugin_approve_acl $acl */
1421989ee26SSzymon Olewniczak        $acl = $this->loadHelper('approve_acl');
1431989ee26SSzymon Olewniczak        if (!$acl->useApproveHere($INFO['id'])) return;
144329c5e3aSMartin Diedrich
1454474ed8aSSzymon Olewniczak        $last_change_date = @filemtime(wikiFN($INFO['id']));
1464474ed8aSSzymon Olewniczak        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
1471aeb2b4dSghi
14855f447f4SSzymon Olewniczak
149*b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
150*b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
1514474ed8aSSzymon Olewniczak
1521989ee26SSzymon Olewniczak        $page_revision = $db->getPageRevision($INFO['id'], $rev);
1531989ee26SSzymon Olewniczak        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
1544474ed8aSSzymon Olewniczak
1554474ed8aSSzymon Olewniczak        $classes = [];
1561989ee26SSzymon Olewniczak        if ($page_revision['status'] == 'approved' && $rev == $last_approved_rev) {
15715e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_approved';
1581989ee26SSzymon Olewniczak        } elseif ($page_revision['status'] == 'approved') {
15915e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_old_approved';
1601989ee26SSzymon Olewniczak        } elseif ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
161bab76148SSzymon Olewniczak            $classes[] = 'plugin__approve_ready';
16255f447f4SSzymon Olewniczak        } else {
16315e5c2ddSSzymon Olewniczak            $classes[] = 'plugin__approve_draft';
16455f447f4SSzymon Olewniczak        }
16555f447f4SSzymon Olewniczak
166*b59355cdSSzymon Olewniczak        echo '<div id="plugin__approve" class="' . implode(' ', $classes) . '">';
1671aeb2b4dSghi
168af3e3cd8SSzymon Olewniczak
1691989ee26SSzymon Olewniczak        if ($page_revision['status'] == 'approved') {
170*b59355cdSSzymon Olewniczak            echo '<strong>'.$this->getLang('approved').'</strong>';
171*b59355cdSSzymon Olewniczak            echo ' ' . dformat(strtotime($page_revision['approved']));
172329c5e3aSMartin Diedrich
173329c5e3aSMartin Diedrich            if($this->getConf('banner_long')) {
174*b59355cdSSzymon Olewniczak                echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true);
175*b59355cdSSzymon Olewniczak                echo ' (' . $this->getLang('version') .  ': ' . $page_revision['version'] . ')';
176329c5e3aSMartin Diedrich            }
1774474ed8aSSzymon Olewniczak
1784474ed8aSSzymon Olewniczak            //not the newest page
1794474ed8aSSzymon Olewniczak            if ($rev != $last_change_date) {
1804474ed8aSSzymon Olewniczak                // we can see drafts
1811989ee26SSzymon Olewniczak                if ($acl->clientCanSeeDrafts($INFO['id'])) {
182*b59355cdSSzymon Olewniczak                    echo '<a href="' . wl($INFO['id']) . '">';
183*b59355cdSSzymon Olewniczak                    echo $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft');
184*b59355cdSSzymon Olewniczak                    echo '</a>';
185c7d53eabSSzymon Olewniczak                    // we cannot see link to draft but there is some newer approved version
1861989ee26SSzymon Olewniczak                } elseif ($last_approved_rev != $rev) {
1874474ed8aSSzymon Olewniczak                    $urlParameters = [];
1881989ee26SSzymon Olewniczak                    if ($last_approved_rev != $last_change_date) {
1891989ee26SSzymon Olewniczak                        $urlParameters['rev'] = $last_approved_rev;
1904474ed8aSSzymon Olewniczak                    }
191*b59355cdSSzymon Olewniczak                    echo '<a href="' . wl($INFO['id'], $urlParameters) . '">';
192*b59355cdSSzymon Olewniczak                    echo $this->getLang('newest_approved');
193*b59355cdSSzymon Olewniczak                    echo '</a>';
1941aeb2b4dSghi                }
1954474ed8aSSzymon Olewniczak            }
1964474ed8aSSzymon Olewniczak
1971aeb2b4dSghi        } else {
1981989ee26SSzymon Olewniczak            if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
199*b59355cdSSzymon Olewniczak                echo '<strong>'.$this->getLang('marked_approve_ready').'</strong>';
200*b59355cdSSzymon Olewniczak                echo ' ' . dformat(strtotime($page_revision['ready_for_approval']));
201*b59355cdSSzymon Olewniczak                echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true);
202c7d53eabSSzymon Olewniczak            } else {
203*b59355cdSSzymon Olewniczak                echo '<strong>'.$this->getLang('draft').'</strong>';
20484047bdaSRuud            }
20584047bdaSRuud
2064474ed8aSSzymon Olewniczak            // not exists approve for current page
2071989ee26SSzymon Olewniczak            if ($last_approved_rev == null) {
2084474ed8aSSzymon Olewniczak                // not the newest page
2094474ed8aSSzymon Olewniczak                if ($rev != $last_change_date) {
210*b59355cdSSzymon Olewniczak                    echo '<a href="'.wl($INFO['id']).'">';
211*b59355cdSSzymon Olewniczak                    echo $this->getLang('newest_draft');
212*b59355cdSSzymon Olewniczak                    echo '</a>';
213274d699aSghi                }
214274d699aSghi            } else {
2154474ed8aSSzymon Olewniczak                $urlParameters = [];
2161989ee26SSzymon Olewniczak                if ($last_approved_rev != $last_change_date) {
2171989ee26SSzymon Olewniczak                    $urlParameters['rev'] = $last_approved_rev;
2184474ed8aSSzymon Olewniczak                }
219*b59355cdSSzymon Olewniczak                echo '<a href="' . wl($INFO['id'], $urlParameters) . '">';
220*b59355cdSSzymon Olewniczak                echo $this->getLang('newest_approved');
221*b59355cdSSzymon Olewniczak                echo '</a>';
2221aeb2b4dSghi            }
2231aeb2b4dSghi
2244474ed8aSSzymon Olewniczak            //we are in current page
2254474ed8aSSzymon Olewniczak            if ($rev == $last_change_date) {
2264474ed8aSSzymon Olewniczak                if ($this->getConf('ready_for_approval') &&
2271989ee26SSzymon Olewniczak                    $acl->clientCanMarkReadyForApproval($INFO['id']) &&
2281989ee26SSzymon Olewniczak                    $page_revision['status'] != 'ready_for_approval') {
2294474ed8aSSzymon Olewniczak
2304474ed8aSSzymon Olewniczak                    $urlParameters = [
2314474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2324474ed8aSSzymon Olewniczak                        'do' => 'diff',
2334474ed8aSSzymon Olewniczak                        'ready_for_approval' => 'ready_for_approval'
2344474ed8aSSzymon Olewniczak                    ];
235*b59355cdSSzymon Olewniczak                    echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
236*b59355cdSSzymon Olewniczak                    echo $this->getLang('approve_ready');
237*b59355cdSSzymon Olewniczak                    echo '</a>';
23884047bdaSRuud                }
23984047bdaSRuud
2401989ee26SSzymon Olewniczak                if ($acl->clientCanApprove($INFO['id'])) {
2414474ed8aSSzymon Olewniczak                    $urlParameters = [
2424474ed8aSSzymon Olewniczak                        'rev' => $last_approved_rev,
2434474ed8aSSzymon Olewniczak                        'do' => 'diff',
2444474ed8aSSzymon Olewniczak                        'approve' => 'approve'
2454474ed8aSSzymon Olewniczak                    ];
246*b59355cdSSzymon Olewniczak                    echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
247*b59355cdSSzymon Olewniczak                    echo $this->getLang('approve');
248*b59355cdSSzymon Olewniczak                    echo '</a>';
2491aeb2b4dSghi                }
250c7d53eabSSzymon Olewniczak            }
251c7d53eabSSzymon Olewniczak        }
25284047bdaSRuud
2531989ee26SSzymon Olewniczak        if (isset($page_metadata['approver']) & $this->getConf('banner_long')) {
254*b59355cdSSzymon Olewniczak            echo ' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true);
2554474ed8aSSzymon Olewniczak        }
256c7d53eabSSzymon Olewniczak
257*b59355cdSSzymon Olewniczak        echo '</div>';
2581aeb2b4dSghi    }
2591aeb2b4dSghi
260af3e3cd8SSzymon Olewniczak    /**
2614474ed8aSSzymon Olewniczak     *
2621989ee26SSzymon Olewniczak     * @param Event $event
2634474ed8aSSzymon Olewniczak     */
2641989ee26SSzymon Olewniczak    public function handle_pagesave_after(Event $event) {
2651b552e87SSzymon Olewniczak        //no content was changed
2664474ed8aSSzymon Olewniczak        if (!$event->data['contentChanged']) return;
2674474ed8aSSzymon Olewniczak
268*b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
269*b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
2704474ed8aSSzymon Olewniczak
2714474ed8aSSzymon Olewniczak        $id = $event->data['id'];
2721989ee26SSzymon Olewniczak        switch ($event->data['changeType']) {
2731989ee26SSzymon Olewniczak            case DOKU_CHANGE_TYPE_CREATE:
2744474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_EDIT:
2754474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_MINOR_EDIT:
2761989ee26SSzymon Olewniczak            case DOKU_CHANGE_TYPE_REVERT:
2771989ee26SSzymon Olewniczak                $db->handlePageEdit($id);
2784474ed8aSSzymon Olewniczak                break;
2794474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_DELETE:
2801989ee26SSzymon Olewniczak                $db->handlePageDelete($id);
2814474ed8aSSzymon Olewniczak                break;
2824474ed8aSSzymon Olewniczak        }
2834474ed8aSSzymon Olewniczak    }
2841aeb2b4dSghi}
285