xref: /plugin/approve/action/approve.php (revision 4438242dce0c443b1470f637180b483505e39cd4)
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']);
34b59355cdSSzymon 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']);
39b59355cdSSzymon 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
49b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
50b59355cdSSzymon 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
76b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
77b59355cdSSzymon 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
97b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
98b59355cdSSzymon 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
121b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
122b59355cdSSzymon 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) {
139*4438242dSSzymon Olewniczak        global $conf;
140bab76148SSzymon Olewniczak
141*4438242dSSzymon Olewniczak        // for the sprintdoc template we have special integrations
142*4438242dSSzymon Olewniczak        if ($conf['template'] == 'sprintdoc') return;
1433c40d78bSSzymon Olewniczak
144*4438242dSSzymon Olewniczak        /** @var helper_plugin_approve_tpl $tpl */
145*4438242dSSzymon Olewniczak        $tpl = $this->loadHelper('approve_tpl');
146*4438242dSSzymon Olewniczak        $tpl->banner($event->data);
1471aeb2b4dSghi    }
1481aeb2b4dSghi
149af3e3cd8SSzymon Olewniczak    /**
1504474ed8aSSzymon Olewniczak     *
1511989ee26SSzymon Olewniczak     * @param Event $event
1524474ed8aSSzymon Olewniczak     */
1531989ee26SSzymon Olewniczak    public function handle_pagesave_after(Event $event) {
1541b552e87SSzymon Olewniczak        //no content was changed
1554474ed8aSSzymon Olewniczak        if (!$event->data['contentChanged']) return;
1564474ed8aSSzymon Olewniczak
157b59355cdSSzymon Olewniczak        /** @var helper_plugin_approve_db $db */
158b59355cdSSzymon Olewniczak        $db = $this->loadHelper('approve_db');
1594474ed8aSSzymon Olewniczak
1604474ed8aSSzymon Olewniczak        $id = $event->data['id'];
1611989ee26SSzymon Olewniczak        switch ($event->data['changeType']) {
1621989ee26SSzymon Olewniczak            case DOKU_CHANGE_TYPE_CREATE:
1634474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_EDIT:
1644474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_MINOR_EDIT:
1651989ee26SSzymon Olewniczak            case DOKU_CHANGE_TYPE_REVERT:
1661989ee26SSzymon Olewniczak                $db->handlePageEdit($id);
1674474ed8aSSzymon Olewniczak                break;
1684474ed8aSSzymon Olewniczak            case DOKU_CHANGE_TYPE_DELETE:
1691989ee26SSzymon Olewniczak                $db->handlePageDelete($id);
1704474ed8aSSzymon Olewniczak                break;
1714474ed8aSSzymon Olewniczak        }
1724474ed8aSSzymon Olewniczak    }
1731aeb2b4dSghi}
174