xref: /plugin/approve/helper/tpl.php (revision 4438242dce0c443b1470f637180b483505e39cd4)
1<?php
2
3use dokuwiki\Extension\Plugin;
4
5class helper_plugin_approve_tpl extends Plugin
6{
7    public function banner($action) {
8        global $INFO;
9
10        if ($action != 'show' || !$INFO['exists']) return;
11
12        /* Return true if banner should not be displayed for users with or below read only permission. */
13        if (auth_quickaclcheck($INFO['id']) <= AUTH_READ && !$this->getConf('display_banner_for_readonly')) {
14            return;
15        }
16
17        /** @var helper_plugin_approve_acl $acl */
18        $acl = $this->loadHelper('approve_acl');
19        if (!$acl->useApproveHere($INFO['id'])) return;
20
21        $last_change_date = @filemtime(wikiFN($INFO['id']));
22        $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev'];
23
24
25        /** @var helper_plugin_approve_db $db */
26        $db = $this->loadHelper('approve_db');
27
28        $page_revision = $db->getPageRevision($INFO['id'], $rev);
29        $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved');
30
31        $classes = [];
32        if ($page_revision['status'] == 'approved' && $rev == $last_approved_rev) {
33            $classes[] = 'plugin__approve_approved';
34        } elseif ($page_revision['status'] == 'approved') {
35            $classes[] = 'plugin__approve_old_approved';
36        } elseif ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
37            $classes[] = 'plugin__approve_ready';
38        } else {
39            $classes[] = 'plugin__approve_draft';
40        }
41
42        echo '<div id="plugin__approve" class="' . implode(' ', $classes) . '">';
43
44
45        if ($page_revision['status'] == 'approved') {
46            echo '<strong>'.$this->getLang('approved').'</strong>';
47            echo ' ' . dformat(strtotime($page_revision['approved']));
48
49            if($this->getConf('banner_long')) {
50                echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true);
51                echo ' (' . $this->getLang('version') .  ': ' . $page_revision['version'] . ')';
52            }
53
54            //not the newest page
55            if ($rev != $last_change_date) {
56                // we can see drafts
57                if ($acl->clientCanSeeDrafts($INFO['id'])) {
58                    echo ' <a href="' . wl($INFO['id']) . '">';
59                    echo $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft');
60                    echo '</a>';
61                    // we cannot see link to draft but there is some newer approved version
62                } elseif ($last_approved_rev != $rev) {
63                    $urlParameters = [];
64                    if ($last_approved_rev != $last_change_date) {
65                        $urlParameters['rev'] = $last_approved_rev;
66                    }
67                    echo ' <a href="' . wl($INFO['id'], $urlParameters) . '">';
68                    echo $this->getLang('newest_approved');
69                    echo '</a>';
70                }
71            }
72
73        } else {
74            if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') {
75                echo '<strong>'.$this->getLang('marked_approve_ready').'</strong>';
76                echo ' ' . dformat(strtotime($page_revision['ready_for_approval']));
77                echo ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true);
78            } else {
79                echo '<strong>'.$this->getLang('draft').'</strong>';
80            }
81
82            // not exists approve for current page
83            if ($last_approved_rev == null) {
84                // not the newest page
85                if ($rev != $last_change_date) {
86                    echo ' <a href="'.wl($INFO['id']).'">';
87                    echo $this->getLang('newest_draft');
88                    echo '</a>';
89                }
90            } else {
91                $urlParameters = [];
92                if ($last_approved_rev != $last_change_date) {
93                    $urlParameters['rev'] = $last_approved_rev;
94                }
95                echo ' <a href="' . wl($INFO['id'], $urlParameters) . '">';
96                echo $this->getLang('newest_approved');
97                echo '</a>';
98            }
99
100            //we are in current page
101            if ($rev == $last_change_date) {
102                if ($this->getConf('ready_for_approval') &&
103                    $acl->clientCanMarkReadyForApproval($INFO['id']) &&
104                    $page_revision['status'] != 'ready_for_approval') {
105
106                    $urlParameters = [
107                        'rev' => $last_approved_rev,
108                        'do' => 'diff',
109                        'ready_for_approval' => 'ready_for_approval'
110                    ];
111                    echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
112                    echo $this->getLang('approve_ready');
113                    echo '</a>';
114                }
115
116                if ($acl->clientCanApprove($INFO['id'])) {
117                    $urlParameters = [
118                        'rev' => $last_approved_rev,
119                        'do' => 'diff',
120                        'approve' => 'approve'
121                    ];
122                    echo ' | <a href="'.wl($INFO['id'], $urlParameters).'">';
123                    echo $this->getLang('approve');
124                    echo '</a>';
125                }
126            }
127        }
128
129
130        if ($this->getConf('banner_long')) {
131            $page_metadata = $db->getPageMetadata($INFO['id']);
132            if (isset($page_metadata['approver'])) {
133                echo ' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true);
134            }
135        }
136
137        echo '</div>';
138    }
139}
140