xref: /plugin/publish/action/banner.php (revision 1794c5facebc8ae31437fc55d2d73a19fef4f734)
1*1794c5faSDominik Eckelmann<?php
2*1794c5faSDominik Eckelmann
3*1794c5faSDominik Eckelmannif(!defined('DOKU_INC')) die();
4*1794c5faSDominik Eckelmann
5*1794c5faSDominik Eckelmannclass action_plugin_publish_banner extends DokuWiki_Action_Plugin {
6*1794c5faSDominik Eckelmann
7*1794c5faSDominik Eckelmann    private $hlp;
8*1794c5faSDominik Eckelmann
9*1794c5faSDominik Eckelmann    function __construct() {
10*1794c5faSDominik Eckelmann        $this->hlp = plugin_load('helper','publish');
11*1794c5faSDominik Eckelmann    }
12*1794c5faSDominik Eckelmann
13*1794c5faSDominik Eckelmann    function register(&$controller) {
14*1794c5faSDominik Eckelmann        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner', array());
15*1794c5faSDominik Eckelmann    }
16*1794c5faSDominik Eckelmann
17*1794c5faSDominik Eckelmann    function handle_display_banner(&$event, $param) {
18*1794c5faSDominik Eckelmann        global $ID;
19*1794c5faSDominik Eckelmann        global $REV;
20*1794c5faSDominik Eckelmann        global $INFO;
21*1794c5faSDominik Eckelmann
22*1794c5faSDominik Eckelmann        if (!$this->hlp->in_namespace($this->getConf('apr_namespaces'), $ID)) {
23*1794c5faSDominik Eckelmann            return;
24*1794c5faSDominik Eckelmann        }
25*1794c5faSDominik Eckelmann
26*1794c5faSDominik Eckelmann        if ($event->data != 'show') {
27*1794c5faSDominik Eckelmann            return;
28*1794c5faSDominik Eckelmann        }
29*1794c5faSDominik Eckelmann
30*1794c5faSDominik Eckelmann        if (!$INFO['exists']) {
31*1794c5faSDominik Eckelmann            return;
32*1794c5faSDominik Eckelmann        }
33*1794c5faSDominik Eckelmann
34*1794c5faSDominik Eckelmann        $meta = $INFO['meta'];
35*1794c5faSDominik Eckelmann
36*1794c5faSDominik Eckelmann        if (!$meta['approval']) {
37*1794c5faSDominik Eckelmann            $meta['approval'] = array();
38*1794c5faSDominik Eckelmann        }
39*1794c5faSDominik Eckelmann
40*1794c5faSDominik Eckelmann
41*1794c5faSDominik Eckelmann        $this->showBanner();
42*1794c5faSDominik Eckelmann        return;
43*1794c5faSDominik Eckelmann    }
44*1794c5faSDominik Eckelmann
45*1794c5faSDominik Eckelmann    function difflink($id, $rev1, $rev2) {
46*1794c5faSDominik Eckelmann        if($rev1 == $rev2) { return ''; }
47*1794c5faSDominik Eckelmann        return '<a href="' . wl($id, 'rev2[]=' . $rev1 . '&rev2[]=' . $rev2 . '&do[diff]=1') .
48*1794c5faSDominik Eckelmann            '" class="approved_diff_link">' .
49*1794c5faSDominik Eckelmann            '<img src="'.DOKU_BASE.'lib/images/diff.png" class="approved_diff_link" alt="Diff" />' .
50*1794c5faSDominik Eckelmann            '</a>';
51*1794c5faSDominik Eckelmann    }
52*1794c5faSDominik Eckelmann
53*1794c5faSDominik Eckelmann    function showBanner() {
54*1794c5faSDominik Eckelmann        if ($this->hlp->isCurrentRevisionApproved()) {
55*1794c5faSDominik Eckelmann            $class = 'approved_yes';
56*1794c5faSDominik Eckelmann        } else {
57*1794c5faSDominik Eckelmann            $class = 'approved_no';
58*1794c5faSDominik Eckelmann        }
59*1794c5faSDominik Eckelmann
60*1794c5faSDominik Eckelmann        printf('<div class="approval %s">', $class);
61*1794c5faSDominik Eckelmann        $this->showLatestDraftIfNewer();
62*1794c5faSDominik Eckelmann        $this->showLatestApprovedVersion();
63*1794c5faSDominik Eckelmann        $this->showDraft();
64*1794c5faSDominik Eckelmann        $this->showApproved();
65*1794c5faSDominik Eckelmann        $this->showPreviousApproved();
66*1794c5faSDominik Eckelmann
67*1794c5faSDominik Eckelmann        $this->showApproveAction();
68*1794c5faSDominik Eckelmann
69*1794c5faSDominik Eckelmann        echo '</div>';
70*1794c5faSDominik Eckelmann    }
71*1794c5faSDominik Eckelmann
72*1794c5faSDominik Eckelmann    function showLatestDraftIfNewer() {
73*1794c5faSDominik Eckelmann        global $ID;
74*1794c5faSDominik Eckelmann        $revision = $this->hlp->getRevision();
75*1794c5faSDominik Eckelmann        $latestRevision = $this->hlp->getLastestRevision();
76*1794c5faSDominik Eckelmann
77*1794c5faSDominik Eckelmann        if ($revision >= $latestRevision) {
78*1794c5faSDominik Eckelmann            return;
79*1794c5faSDominik Eckelmann        }
80*1794c5faSDominik Eckelmann        if ($this->hlp->isRevisionApproved($latestRevision)) {
81*1794c5faSDominik Eckelmann            return;
82*1794c5faSDominik Eckelmann        }
83*1794c5faSDominik Eckelmann
84*1794c5faSDominik Eckelmann        echo '<span class="approval_latest_draft">';
85*1794c5faSDominik Eckelmann        printf($this->getLang('apr_recent_draft'), wl($ID, 'force_rev=1'));
86*1794c5faSDominik Eckelmann        echo $this->difflink($ID, null, $revision) . '</span>';
87*1794c5faSDominik Eckelmann    }
88*1794c5faSDominik Eckelmann
89*1794c5faSDominik Eckelmann    function showLatestApprovedVersion() {
90*1794c5faSDominik Eckelmann        global $ID;
91*1794c5faSDominik Eckelmann        $revision = $this->hlp->getRevision();
92*1794c5faSDominik Eckelmann        $latestApprovedRevision = $this->hlp->getLatestApprovedRevision();
93*1794c5faSDominik Eckelmann
94*1794c5faSDominik Eckelmann        if ($latestApprovedRevision <= $revision) {
95*1794c5faSDominik Eckelmann            return;
96*1794c5faSDominik Eckelmann        }
97*1794c5faSDominik Eckelmann
98*1794c5faSDominik Eckelmann        $latestRevision = $this->hlp->getLastestRevision();
99*1794c5faSDominik Eckelmann        if ($latestApprovedRevision == $latestRevision) {
100*1794c5faSDominik Eckelmann            //$latestApprovedRevision = '';
101*1794c5faSDominik Eckelmann        }
102*1794c5faSDominik Eckelmann        echo '<span class="approval_outdated">';
103*1794c5faSDominik Eckelmann        printf($this->getLang('apr_outdated'), wl($ID, 'rev=' . $latestApprovedRevision));
104*1794c5faSDominik Eckelmann        echo $this->difflink($ID, $latestApprovedRevision, $revision) . '</span>';
105*1794c5faSDominik Eckelmann    }
106*1794c5faSDominik Eckelmann
107*1794c5faSDominik Eckelmann    function showDraft() {
108*1794c5faSDominik Eckelmann        $revision = $this->hlp->getRevision();
109*1794c5faSDominik Eckelmann
110*1794c5faSDominik Eckelmann        if ($this->hlp->isCurrentRevisionApproved()) {
111*1794c5faSDominik Eckelmann            return;
112*1794c5faSDominik Eckelmann        }
113*1794c5faSDominik Eckelmann
114*1794c5faSDominik Eckelmann        $approvals = $this->hlp->getApprovalsOnRevision($this->hlp->getRevision());
115*1794c5faSDominik Eckelmann        $approvalCount = count($approvals);
116*1794c5faSDominik Eckelmann
117*1794c5faSDominik Eckelmann        echo '<span class="approval_draft">';
118*1794c5faSDominik Eckelmann        printf($this->getLang('apr_draft'), '<span class="approval_date">' . dformat($revision) . '</span>');
119*1794c5faSDominik Eckelmann        echo '<br />';
120*1794c5faSDominik Eckelmann        printf(' ' . $this->getLang('approvals'), $approvalCount, $this->getConf('number_of_approved'));
121*1794c5faSDominik Eckelmann        if ($approvalCount != 0) {
122*1794c5faSDominik Eckelmann            printf(' ' . $this->getLang('approved by'), implode(', ', $this->hlp->getApprovers()));
123*1794c5faSDominik Eckelmann        }
124*1794c5faSDominik Eckelmann        echo '</span>';
125*1794c5faSDominik Eckelmann    }
126*1794c5faSDominik Eckelmann
127*1794c5faSDominik Eckelmann    function showApproved() {
128*1794c5faSDominik Eckelmann        if (!$this->hlp->isCurrentRevisionApproved()) {
129*1794c5faSDominik Eckelmann            return;
130*1794c5faSDominik Eckelmann        }
131*1794c5faSDominik Eckelmann
132*1794c5faSDominik Eckelmann        echo '<span class="approval_approved">';
133*1794c5faSDominik Eckelmann        printf($this->getLang('apr_approved'),
134*1794c5faSDominik Eckelmann            '<span class="approval_date">' . dformat($this->hlp->getApprovalDate()) . '</span>',
135*1794c5faSDominik Eckelmann            implode(', ', $this->hlp->getApprovers()));
136*1794c5faSDominik Eckelmann        echo '</span>';
137*1794c5faSDominik Eckelmann    }
138*1794c5faSDominik Eckelmann
139*1794c5faSDominik Eckelmann    function showPreviousApproved() {
140*1794c5faSDominik Eckelmann        global $ID;
141*1794c5faSDominik Eckelmann        $previousApproved = $this->hlp->getPreviousApprovedRevision();
142*1794c5faSDominik Eckelmann        if (!$previousApproved) {
143*1794c5faSDominik Eckelmann            return;
144*1794c5faSDominik Eckelmann        }
145*1794c5faSDominik Eckelmann        echo '<span class="approval_previous">';
146*1794c5faSDominik Eckelmann        printf($this->getLang('apr_previous'),
147*1794c5faSDominik Eckelmann            wl($ID, 'rev=' . $previousApproved),
148*1794c5faSDominik Eckelmann            dformat($previousApproved));
149*1794c5faSDominik Eckelmann        echo $this->difflink($ID, $previousApproved, $this->hlp->getRevision()) . '</span>';
150*1794c5faSDominik Eckelmann    }
151*1794c5faSDominik Eckelmann
152*1794c5faSDominik Eckelmann    private function showApproveAction() {
153*1794c5faSDominik Eckelmann        global $ID;
154*1794c5faSDominik Eckelmann        global $REV;
155*1794c5faSDominik Eckelmann        global $USERINFO;
156*1794c5faSDominik Eckelmann        if (!$this->hlp->canApprove()) {
157*1794c5faSDominik Eckelmann            return;
158*1794c5faSDominik Eckelmann        }
159*1794c5faSDominik Eckelmann
160*1794c5faSDominik Eckelmann        $approvals = $this->hlp->getApprovalsOnRevision($this->hlp->getRevision());
161*1794c5faSDominik Eckelmann        foreach ($approvals as $approve) {
162*1794c5faSDominik Eckelmann            if ($approve[1] == $_SERVER['REMOTE_USER']) {
163*1794c5faSDominik Eckelmann                return;
164*1794c5faSDominik Eckelmann            }
165*1794c5faSDominik Eckelmann            if ($approve[1] == $USERINFO['mail']) {
166*1794c5faSDominik Eckelmann                return;
167*1794c5faSDominik Eckelmann            }
168*1794c5faSDominik Eckelmann        }
169*1794c5faSDominik Eckelmann
170*1794c5faSDominik Eckelmann        echo '<span class="approval_action">';
171*1794c5faSDominik Eckelmann        echo '<a href="' . wl($ID, array('rev' => $REV, 'publish_approve'=>1)) . '">';
172*1794c5faSDominik Eckelmann        echo $this->getLang('approve action');
173*1794c5faSDominik Eckelmann        echo '</a>';
174*1794c5faSDominik Eckelmann        echo '</span> ';
175*1794c5faSDominik Eckelmann    }
176*1794c5faSDominik Eckelmann}
177