xref: /plugin/publish/action/approve.php (revision 9d4b9aa0d7e87a75b5ec6b11b04a4c5387925023)
11794c5faSDominik Eckelmann<?php
21794c5faSDominik Eckelmann
31794c5faSDominik Eckelmannif(!defined('DOKU_INC')) die();
41794c5faSDominik Eckelmann
51794c5faSDominik Eckelmannclass action_plugin_publish_approve extends DokuWiki_Action_Plugin {
61794c5faSDominik Eckelmann
7248339c4SDominik Eckelmann    /**
8248339c4SDominik Eckelmann     * @var helper_plugin_publish
9248339c4SDominik Eckelmann     */
101794c5faSDominik Eckelmann    private $helper;
111794c5faSDominik Eckelmann
121794c5faSDominik Eckelmann    function __construct() {
131794c5faSDominik Eckelmann        $this->helper = plugin_load('helper', 'publish');
141794c5faSDominik Eckelmann    }
151794c5faSDominik Eckelmann
165ccce1abSMichael Große    function register(Doku_Event_Handler $controller) {
171794c5faSDominik Eckelmann        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_io_write', array());
18*9d4b9aa0SMichael Große        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'approveNS', array());
19*9d4b9aa0SMichael Große    }
20*9d4b9aa0SMichael Große
21*9d4b9aa0SMichael Große    function approveNS(Doku_Event &$event, $param) {
22*9d4b9aa0SMichael Große        if ($event->data !== 'plugin_publish_approveNS') {
23*9d4b9aa0SMichael Große            return;
24*9d4b9aa0SMichael Große        }
25*9d4b9aa0SMichael Große        //no other ajax call handlers needed
26*9d4b9aa0SMichael Große        $event->stopPropagation();
27*9d4b9aa0SMichael Große        $event->preventDefault();
28*9d4b9aa0SMichael Große
29*9d4b9aa0SMichael Große        //e.g. access additional request variables
30*9d4b9aa0SMichael Große        global $INPUT; //available since release 2012-10-13 "Adora Belle"
31*9d4b9aa0SMichael Große        $namespace = $INPUT->str('namespace');
32*9d4b9aa0SMichael Große        $pages = $this->helper->getPagesFromNamespace($namespace);
33*9d4b9aa0SMichael Große        $pages = $this->helper->removeSubnamespacePages($pages, $namespace);
34*9d4b9aa0SMichael Große
35*9d4b9aa0SMichael Große        global $ID, $INFO;
36*9d4b9aa0SMichael Große        $original_id = $ID;
37*9d4b9aa0SMichael Große        foreach ($pages as $page) {
38*9d4b9aa0SMichael Große            $ID = $page[0];
39*9d4b9aa0SMichael Große            $INFO = pageinfo();
40*9d4b9aa0SMichael Große            if (!$this->helper->canApprove()) {
41*9d4b9aa0SMichael Große                continue;
42*9d4b9aa0SMichael Große            }
43*9d4b9aa0SMichael Große            $this->addApproval();
44*9d4b9aa0SMichael Große        }
45*9d4b9aa0SMichael Große        $ID = $original_id;
461794c5faSDominik Eckelmann    }
471794c5faSDominik Eckelmann
48d9258364SDominik Eckelmann    function handle_io_write(Doku_Event &$event, $param) {
491794c5faSDominik Eckelmann        # This is the only hook I could find which runs on save,
501794c5faSDominik Eckelmann        # but late enough to have lastmod set (ACTION_ACT_PREPROCESS
511794c5faSDominik Eckelmann        # is too early)
521794c5faSDominik Eckelmann        global $ACT;
5351621a57SChristopher Smith        global $INPUT;
54*9d4b9aa0SMichael Große        global $ID;
551794c5faSDominik Eckelmann
561794c5faSDominik Eckelmann        if ($ACT != 'show') {
571794c5faSDominik Eckelmann            return;
581794c5faSDominik Eckelmann        }
591794c5faSDominik Eckelmann
608fc40594SChristopher Smith        if (!$INPUT->has('publish_approve')) {
611794c5faSDominik Eckelmann            return;
621794c5faSDominik Eckelmann        }
631794c5faSDominik Eckelmann
641794c5faSDominik Eckelmann        if (!$this->helper->canApprove()) {
651794c5faSDominik Eckelmann            msg($this->getLang('wrong permissions to approve'), -1);
661794c5faSDominik Eckelmann            return;
671794c5faSDominik Eckelmann        }
681794c5faSDominik Eckelmann
691794c5faSDominik Eckelmann        $this->addApproval();
70*9d4b9aa0SMichael Große        send_redirect(wl($ID, array('rev' => $this->helper->getRevision()), true, '&'));
711794c5faSDominik Eckelmann    }
721794c5faSDominik Eckelmann
731794c5faSDominik Eckelmann    function addApproval() {
741794c5faSDominik Eckelmann        global $USERINFO;
751794c5faSDominik Eckelmann        global $ID;
761794c5faSDominik Eckelmann        global $INFO;
771794c5faSDominik Eckelmann
781794c5faSDominik Eckelmann        if (!$INFO['exists']) {
791794c5faSDominik Eckelmann            msg($this->getLang('cannot approve a non-existing revision'), -1);
801794c5faSDominik Eckelmann            return;
811794c5faSDominik Eckelmann        }
821794c5faSDominik Eckelmann
831794c5faSDominik Eckelmann        $approvalRevision = $this->helper->getRevision();
841794c5faSDominik Eckelmann        $approvals = $this->helper->getApprovals();
851794c5faSDominik Eckelmann
861794c5faSDominik Eckelmann        if (!isset($approvals[$approvalRevision])) {
871794c5faSDominik Eckelmann            $approvals[$approvalRevision] = array();
881794c5faSDominik Eckelmann        }
891794c5faSDominik Eckelmann
901794c5faSDominik Eckelmann        $approvals[$approvalRevision][$INFO['client']] = array(
911794c5faSDominik Eckelmann            $INFO['client'],
921794c5faSDominik Eckelmann            $_SERVER['REMOTE_USER'],
931794c5faSDominik Eckelmann            $USERINFO['mail'],
941794c5faSDominik Eckelmann            time()
951794c5faSDominik Eckelmann        );
961794c5faSDominik Eckelmann
971794c5faSDominik Eckelmann        $success = p_set_metadata($ID, array('approval' => $approvals), true, true);
981794c5faSDominik Eckelmann        if ($success) {
991794c5faSDominik Eckelmann            msg($this->getLang('version approved'), 1);
100facaff5bSDominik Eckelmann
101facaff5bSDominik Eckelmann            $data = array();
102facaff5bSDominik Eckelmann            $data['rev'] = $approvalRevision;
103facaff5bSDominik Eckelmann            $data['id'] = $ID;
104facaff5bSDominik Eckelmann            $data['approver'] = $_SERVER['REMOTE_USER'];
105facaff5bSDominik Eckelmann            $data['approver_info'] = $USERINFO;
1068bc37331SMichael Große            if ($this->getConf('send_mail_on_approve') && $this->helper->isRevisionApproved($approvalRevision)) {
1070a79fa6aSMichael Große                /** @var action_plugin_publish_mail $mail */
1080a79fa6aSMichael Große                $mail = plugin_load('action','publish_mail');
10992b96518SMichael Große                $mail->send_approve_mail();
11092b96518SMichael Große            }
111facaff5bSDominik Eckelmann            trigger_event('PLUGIN_PUBLISH_APPROVE', $data);
1121794c5faSDominik Eckelmann        } else {
1131794c5faSDominik Eckelmann            msg($this->getLang('cannot approve error'), -1);
1141794c5faSDominik Eckelmann        }
1151794c5faSDominik Eckelmann
1161794c5faSDominik Eckelmann    }
1171794c5faSDominik Eckelmann
1181794c5faSDominik Eckelmann}
119