xref: /plugin/publish/action/approve.php (revision 248339c4fdbea2827b9d99434ca08bdf627df7a7)
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(&$controller) {
17        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_io_write', array());
18    }
19
20    function handle_io_write(&$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
26        if ($ACT != 'show') {
27            return;
28        }
29
30        if (!isset($_REQUEST['publish_approve'])) {
31            return;
32        }
33
34        if (!$this->helper->canApprove()) {
35            msg($this->getLang('wrong permissions to approve'), -1);
36            return;
37        }
38
39        $this->addApproval();
40        return;
41    }
42
43    function addApproval() {
44        global $USERINFO;
45        global $ID;
46        global $INFO;
47        global $REV;
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        } else {
72            msg($this->getLang('cannot approve error'), -1);
73        }
74
75        send_redirect(wl($ID, array('rev' => $this->helper->getRevision()), true, '&'));
76    }
77
78}
79