xref: /plugin/approve/action/revisions.php (revision d8ede06043d02e5697f43d6d5bd3619b9ec26549)
1<?php
2
3if(!defined('DOKU_INC')) die();
4
5class action_plugin_approve_revisions extends DokuWiki_Action_Plugin {
6
7    /** @var helper_plugin_sqlite */
8    protected $sqlite;
9
10    /** @var helper_plugin_approve */
11    protected $helper;
12
13    /**
14     * @return helper_plugin_sqlite
15     */
16    protected function sqlite() {
17        if (!$this->sqlite) {
18            /** @var helper_plugin_approve_db $db_helper */
19            $db_helper = plugin_load('helper', 'approve_db');
20            $this->sqlite = $db_helper->getDB();
21        }
22        return $this->sqlite;
23    }
24
25    /**
26     * @return helper_plugin_approve
27     */
28    protected function helper() {
29        if (!$this->helper) {
30            $helper = plugin_load('helper', 'approve');
31            $this->helper = $helper;
32        }
33        return $this->helper;
34    }
35
36    function register(Doku_Event_Handler $controller) {
37		$controller->register_hook('HTML_REVISIONSFORM_OUTPUT', 'BEFORE', $this, 'handle_revisions', array());
38	}
39
40	function handle_revisions(Doku_Event $event, $param) {
41		global $INFO;
42
43        if (!$this->helper()->use_approve_here($INFO['id'])) return;
44
45        $res = $this->sqlite()->query('SELECT rev, approved, ready_for_approval
46                                FROM revision
47                                WHERE page=?', $INFO['id']);
48        $approveRevisions = $this->sqlite()->res2arr($res);
49        $approveRevisions = array_combine(array_column($approveRevisions, 'rev'), $approveRevisions);
50
51		$member = null;
52		foreach ($event->data->_content as $key => $ref) {
53            if(isset($ref['_elem']) && $ref['_elem'] == 'opentag' && $ref['_tag'] == 'div' && $ref['class'] == 'li') {
54                $member = $key;
55            }
56
57            if ($member && $ref['_elem'] == 'tag' &&
58                $ref['_tag'] == 'input' && $ref['name'] == 'rev2[]'){
59                $revision = $ref['value'];
60                if ($revision == 'current') {
61                    $revision = $INFO['meta']['date']['modified'];
62                }
63                if (!isset($approveRevisions[$revision])) {
64                    $class =  'plugin__approve_red';
65                } elseif ($approveRevisions[$revision]['approved']) {
66                    $class =  'plugin__approve_green';
67                } elseif ($this->getConf('ready_for_approval') && $approveRevisions[$revision]['ready_for_approval']) {
68                    $class =  'plugin__approve_ready';
69                } else {
70                    $class =  'plugin__approve_red';
71                }
72
73                $event->data->_content[$member]['class'] = "li $class";
74
75                $member = null;
76            }
77		}
78
79		return true;
80	}
81
82}
83