xref: /plugin/publish/action/approve.php (revision 90a2f5d6fc62f9ebc3cac029e120fa3933d02d87)
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
48        if (!$INFO['exists']) {
49            msg($this->getLang('cannot approve a non-existing revision'), -1);
50            return;
51        }
52
53        $approvalRevision = $this->helper->getRevision();
54        $approvals = $this->helper->getApprovals();
55
56        if (!isset($approvals[$approvalRevision])) {
57            $approvals[$approvalRevision] = array();
58        }
59
60        $approvals[$approvalRevision][$INFO['client']] = array(
61            $INFO['client'],
62            $_SERVER['REMOTE_USER'],
63            $USERINFO['mail'],
64            time()
65        );
66
67        $success = p_set_metadata($ID, array('approval' => $approvals), true, true);
68        if ($success) {
69            msg($this->getLang('version approved'), 1);
70
71            $data = array();
72            $data['rev'] = $approvalRevision;
73            $data['id'] = $ID;
74            $data['approver'] = $_SERVER['REMOTE_USER'];
75            $data['approver_info'] = $USERINFO;
76            trigger_event('PLUGIN_PUBLISH_APPROVE', $data);
77        } else {
78            msg($this->getLang('cannot approve error'), -1);
79        }
80
81        send_redirect(wl($ID, array('rev' => $this->helper->getRevision()), true, '&'));
82    }
83
84}
85