xref: /plugin/publish/action/approve.php (revision 0a79fa6aabdf937004fa582d7ff53569b3aec53d)
1<?php
2
3if(!defined('DOKU_INC')) die();
4
5class action_plugin_publish_approve extends DokuWiki_Action_Plugin {
6
7    /**
8     * @var helper_plugin_publish
9     */
10    private $helper;
11
12    function __construct() {
13        $this->helper = plugin_load('helper', 'publish');
14    }
15
16    function register(Doku_Event_Handler $controller) {
17        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_io_write', array());
18    }
19
20    function handle_io_write(Doku_Event &$event, $param) {
21        # This is the only hook I could find which runs on save,
22        # but late enough to have lastmod set (ACTION_ACT_PREPROCESS
23        # is too early)
24        global $ACT;
25        global $INPUT;
26
27        if ($ACT != 'show') {
28            return;
29        }
30
31        if (!$INPUT->has('publish_approve')) {
32            return;
33        }
34
35        if (!$this->helper->canApprove()) {
36            msg($this->getLang('wrong permissions to approve'), -1);
37            return;
38        }
39
40        $this->addApproval();
41        return;
42    }
43
44    function addApproval() {
45        global $USERINFO;
46        global $ID;
47        global $INFO;
48
49        if (!$INFO['exists']) {
50            msg($this->getLang('cannot approve a non-existing revision'), -1);
51            return;
52        }
53
54        $approvalRevision = $this->helper->getRevision();
55        $approvals = $this->helper->getApprovals();
56
57        if (!isset($approvals[$approvalRevision])) {
58            $approvals[$approvalRevision] = array();
59        }
60
61        $approvals[$approvalRevision][$INFO['client']] = array(
62            $INFO['client'],
63            $_SERVER['REMOTE_USER'],
64            $USERINFO['mail'],
65            time()
66        );
67
68        $success = p_set_metadata($ID, array('approval' => $approvals), true, true);
69        if ($success) {
70            msg($this->getLang('version approved'), 1);
71
72            $data = array();
73            $data['rev'] = $approvalRevision;
74            $data['id'] = $ID;
75            $data['approver'] = $_SERVER['REMOTE_USER'];
76            $data['approver_info'] = $USERINFO;
77            if ($this->getConf('send_mail_on_approve') && $this->helper->isRevisionApproved($approvalRevision)) {
78                /** @var action_plugin_publish_mail $mail */
79                $mail = plugin_load('action','publish_mail');
80                $mail->send_approve_mail();
81            }
82            trigger_event('PLUGIN_PUBLISH_APPROVE', $data);
83        } else {
84            msg($this->getLang('cannot approve error'), -1);
85        }
86
87        send_redirect(wl($ID, array('rev' => $this->helper->getRevision()), true, '&'));
88    }
89
90}
91