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