xref: /plugin/publish/action/approve.php (revision ad7dceb92bdd297b73e8dc0bc7d00c2f672ce775)
11794c5faSDominik Eckelmann<?php
21794c5faSDominik Eckelmann
31794c5faSDominik Eckelmannif(!defined('DOKU_INC')) die();
41794c5faSDominik Eckelmann
5*ad7dceb9Sobel1xuse dokuwiki\Extension\Event;
6*ad7dceb9Sobel1x
71794c5faSDominik Eckelmannclass action_plugin_publish_approve extends DokuWiki_Action_Plugin {
81794c5faSDominik Eckelmann
9248339c4SDominik Eckelmann    /**
10248339c4SDominik Eckelmann     * @var helper_plugin_publish
11248339c4SDominik Eckelmann     */
121794c5faSDominik Eckelmann    private $helper;
131794c5faSDominik Eckelmann
141794c5faSDominik Eckelmann    function __construct() {
151794c5faSDominik Eckelmann        $this->helper = plugin_load('helper', 'publish');
161794c5faSDominik Eckelmann    }
171794c5faSDominik Eckelmann
185ccce1abSMichael Große    function register(Doku_Event_Handler $controller) {
191794c5faSDominik Eckelmann        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handle_io_write', array());
209d4b9aa0SMichael Große        $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'approveNS', array());
219d4b9aa0SMichael Große    }
229d4b9aa0SMichael Große
239d4b9aa0SMichael Große    function approveNS(Doku_Event &$event, $param) {
249d4b9aa0SMichael Große        if ($event->data !== 'plugin_publish_approveNS') {
259d4b9aa0SMichael Große            return;
269d4b9aa0SMichael Große        }
279d4b9aa0SMichael Große        //no other ajax call handlers needed
289d4b9aa0SMichael Große        $event->stopPropagation();
299d4b9aa0SMichael Große        $event->preventDefault();
309d4b9aa0SMichael Große
319d4b9aa0SMichael Große        //e.g. access additional request variables
329d4b9aa0SMichael Große        global $INPUT; //available since release 2012-10-13 "Adora Belle"
339d4b9aa0SMichael Große        $namespace = $INPUT->str('namespace');
349d4b9aa0SMichael Große        $pages = $this->helper->getPagesFromNamespace($namespace);
359d4b9aa0SMichael Große        $pages = $this->helper->removeSubnamespacePages($pages, $namespace);
369d4b9aa0SMichael Große
379d4b9aa0SMichael Große        global $ID, $INFO;
389d4b9aa0SMichael Große        $original_id = $ID;
399d4b9aa0SMichael Große        foreach ($pages as $page) {
409d4b9aa0SMichael Große            $ID = $page[0];
419d4b9aa0SMichael Große            $INFO = pageinfo();
429d4b9aa0SMichael Große            if (!$this->helper->canApprove()) {
439d4b9aa0SMichael Große                continue;
449d4b9aa0SMichael Große            }
459d4b9aa0SMichael Große            $this->addApproval();
469d4b9aa0SMichael Große        }
479d4b9aa0SMichael Große        $ID = $original_id;
481794c5faSDominik Eckelmann    }
491794c5faSDominik Eckelmann
50d9258364SDominik Eckelmann    function handle_io_write(Doku_Event &$event, $param) {
511794c5faSDominik Eckelmann        # This is the only hook I could find which runs on save,
521794c5faSDominik Eckelmann        # but late enough to have lastmod set (ACTION_ACT_PREPROCESS
531794c5faSDominik Eckelmann        # is too early)
541794c5faSDominik Eckelmann        global $ACT;
5551621a57SChristopher Smith        global $INPUT;
569d4b9aa0SMichael Große        global $ID;
571794c5faSDominik Eckelmann
581794c5faSDominik Eckelmann        if ($ACT != 'show') {
591794c5faSDominik Eckelmann            return;
601794c5faSDominik Eckelmann        }
611794c5faSDominik Eckelmann
628fc40594SChristopher Smith        if (!$INPUT->has('publish_approve')) {
631794c5faSDominik Eckelmann            return;
641794c5faSDominik Eckelmann        }
651794c5faSDominik Eckelmann
661794c5faSDominik Eckelmann        if (!$this->helper->canApprove()) {
671794c5faSDominik Eckelmann            msg($this->getLang('wrong permissions to approve'), -1);
681794c5faSDominik Eckelmann            return;
691794c5faSDominik Eckelmann        }
701794c5faSDominik Eckelmann
711794c5faSDominik Eckelmann        $this->addApproval();
729d4b9aa0SMichael Große        send_redirect(wl($ID, array('rev' => $this->helper->getRevision()), true, '&'));
731794c5faSDominik Eckelmann    }
741794c5faSDominik Eckelmann
751794c5faSDominik Eckelmann    function addApproval() {
761794c5faSDominik Eckelmann        global $USERINFO;
771794c5faSDominik Eckelmann        global $ID;
781794c5faSDominik Eckelmann        global $INFO;
791794c5faSDominik Eckelmann
801794c5faSDominik Eckelmann        if (!$INFO['exists']) {
811794c5faSDominik Eckelmann            msg($this->getLang('cannot approve a non-existing revision'), -1);
821794c5faSDominik Eckelmann            return;
831794c5faSDominik Eckelmann        }
841794c5faSDominik Eckelmann
851794c5faSDominik Eckelmann        $approvalRevision = $this->helper->getRevision();
861794c5faSDominik Eckelmann        $approvals = $this->helper->getApprovals();
871794c5faSDominik Eckelmann
881794c5faSDominik Eckelmann        if (!isset($approvals[$approvalRevision])) {
891794c5faSDominik Eckelmann            $approvals[$approvalRevision] = array();
901794c5faSDominik Eckelmann        }
911794c5faSDominik Eckelmann
921794c5faSDominik Eckelmann        $approvals[$approvalRevision][$INFO['client']] = array(
931794c5faSDominik Eckelmann            $INFO['client'],
941794c5faSDominik Eckelmann            $_SERVER['REMOTE_USER'],
951794c5faSDominik Eckelmann            $USERINFO['mail'],
961794c5faSDominik Eckelmann            time()
971794c5faSDominik Eckelmann        );
981794c5faSDominik Eckelmann
991794c5faSDominik Eckelmann        $success = p_set_metadata($ID, array('approval' => $approvals), true, true);
1001794c5faSDominik Eckelmann        if ($success) {
1011794c5faSDominik Eckelmann            msg($this->getLang('version approved'), 1);
102facaff5bSDominik Eckelmann
103facaff5bSDominik Eckelmann            $data = array();
104facaff5bSDominik Eckelmann            $data['rev'] = $approvalRevision;
105facaff5bSDominik Eckelmann            $data['id'] = $ID;
106facaff5bSDominik Eckelmann            $data['approver'] = $_SERVER['REMOTE_USER'];
107facaff5bSDominik Eckelmann            $data['approver_info'] = $USERINFO;
1088bc37331SMichael Große            if ($this->getConf('send_mail_on_approve') && $this->helper->isRevisionApproved($approvalRevision)) {
1090a79fa6aSMichael Große                /** @var action_plugin_publish_mail $mail */
1100a79fa6aSMichael Große                $mail = plugin_load('action','publish_mail');
11192b96518SMichael Große                $mail->send_approve_mail();
11292b96518SMichael Große            }
113*ad7dceb9Sobel1x            Event::createAndTrigger('PLUGIN_PUBLISH_APPROVE', $data);
1141794c5faSDominik Eckelmann        } else {
1151794c5faSDominik Eckelmann            msg($this->getLang('cannot approve error'), -1);
1161794c5faSDominik Eckelmann        }
1171794c5faSDominik Eckelmann
1181794c5faSDominik Eckelmann    }
1191794c5faSDominik Eckelmann
1201794c5faSDominik Eckelmann}
121