1<?php 2 3use dokuwiki\Extension\Plugin; 4 5class helper_plugin_approve_tpl extends Plugin 6{ 7 /** 8 * Check if banner should be displayed 9 * 10 * @return bool 11 */ 12 public function shouldDisplay() { 13 global $ACT; 14 global $INFO; 15 16 if ($ACT != 'show' || !$INFO['exists']) return false; 17 18 /* Return false if banner should not be displayed for users with or below read only permission. */ 19 if (auth_quickaclcheck($INFO['id']) <= AUTH_READ && !$this->getConf('display_banner_for_readonly')) { 20 return false; 21 } 22 23 /** @var helper_plugin_approve_acl $acl */ 24 $acl = $this->loadHelper('approve_acl'); 25 if (!$acl->useApproveHere($INFO['id'])) return false; 26 27 return true; 28 } 29 30 /** 31 * Do all checks and return banner html 32 * 33 * @param string $action 34 * @return string 35 */ 36 public function banner($action) { 37 global $INFO; 38 39 $html = ''; 40 41 if (!$this->shouldDisplay($action)) return $html; 42 43 /** @var helper_plugin_approve_acl $acl */ 44 $acl = $this->loadHelper('approve_acl'); 45 46 $last_change_date = @filemtime(wikiFN($INFO['id'])); 47 $rev = !$INFO['rev'] ? $last_change_date : $INFO['rev']; 48 49 50 /** @var helper_plugin_approve_db $db */ 51 $db = $this->loadHelper('approve_db'); 52 53 $page_revision = $db->getPageRevision($INFO['id'], $rev); 54 $last_approved_rev = $db->getLastDbRev($INFO['id'], 'approved'); 55 56 $classes = $this->getStatusClasses($page_revision['status'], $rev, $last_approved_rev); 57 58 $html .= '<div id="plugin__approve" class="' . implode(' ', $classes) . '">'; 59 60 61 if ($page_revision['status'] == 'approved') { 62 $html .= '<strong>'.$this->getLang('approved').'</strong>'; 63 $html .= ' ' . dformat(strtotime($page_revision['approved'])); 64 65 if ($this->getConf('banner_long')) { 66 $html .= ' ' . $this->getLang('by') . ' ' . userlink($page_revision['approved_by'], true); 67 $html .= ' (' . $this->getLang('version') . ': ' . $page_revision['version'] . ')'; 68 } 69 70 //not the newest page 71 $noprintContent = ''; 72 if ($rev != $last_change_date) { 73 // we can see drafts 74 if ($acl->clientCanSeeDrafts($INFO['id'])) { 75 $noprintContent .= ' <a href="' . wl($INFO['id']) . '">'; 76 $noprintContent .= $this->getLang($last_approved_rev == $last_change_date ? 'newest_approved' : 'newest_draft'); 77 $noprintContent .= '</a>'; 78 // we cannot see link to draft but there is some newer approved version 79 } elseif ($last_approved_rev != $rev) { 80 $urlParameters = []; 81 if ($last_approved_rev != $last_change_date) { 82 $urlParameters['rev'] = $last_approved_rev; 83 } 84 $noprintContent .= ' <a href="' . wl($INFO['id'], $urlParameters) . '">'; 85 $noprintContent .= $this->getLang('newest_approved'); 86 $noprintContent .= '</a>'; 87 } 88 } 89 90 $html .= $this->noprint($noprintContent); 91 92 } else { 93 if ($this->getConf('ready_for_approval') && $page_revision['status'] == 'ready_for_approval') { 94 // alternative print status (only approved or otherwise draft) 95 $html .= '<span class="plugin__approve_printonly"><strong>' . $this->getLang('draft').'</strong></span>'; 96 $noprintContent = '<strong>'.$this->getLang('marked_approve_ready').'</strong>'; 97 $noprintContent .= ' ' . dformat(strtotime($page_revision['ready_for_approval'])); 98 $noprintContent .= ' ' . $this->getLang('by') . ' ' . userlink($page_revision['ready_for_approval_by'], true); 99 $html .= $this->noprint($noprintContent); 100 } else { 101 $html .= '<strong>'.$this->getLang('draft').'</strong>'; 102 } 103 104 // not exists approve for current page 105 $noprintContent = ''; 106 if ($last_approved_rev == null) { 107 // not the newest page 108 if ($rev != $last_change_date) { 109 $noprintContent .= ' <a href="'.wl($INFO['id']).'">'; 110 $noprintContent .= $this->getLang('newest_draft'); 111 $noprintContent .= '</a>'; 112 } 113 } else { 114 $urlParameters = []; 115 if ($last_approved_rev != $last_change_date) { 116 $urlParameters['rev'] = $last_approved_rev; 117 } 118 $noprintContent .= ' <a href="' . wl($INFO['id'], $urlParameters) . '">'; 119 $noprintContent .= $this->getLang('newest_approved'); 120 $noprintContent .= '</a>'; 121 } 122 123 //we are in current page 124 if ($rev == $last_change_date) { 125 if ($this->getConf('ready_for_approval') && 126 $acl->clientCanMarkReadyForApproval($INFO['id']) && 127 $page_revision['status'] != 'ready_for_approval') { 128 129 $urlParameters = [ 130 'rev' => $last_approved_rev, 131 'do' => 'diff', 132 'ready_for_approval' => 'ready_for_approval' 133 ]; 134 $noprintContent .= ' | <a href="'.wl($INFO['id'], $urlParameters).'">'; 135 $noprintContent .= $this->getLang('approve_ready'); 136 $noprintContent .= '</a>'; 137 } 138 139 if ($acl->clientCanApprove($INFO['id'])) { 140 $urlParameters = [ 141 'rev' => $last_approved_rev, 142 'do' => 'diff', 143 'approve' => 'approve' 144 ]; 145 $noprintContent .= ' | <a href="'.wl($INFO['id'], $urlParameters).'">'; 146 $noprintContent .= $this->getLang('approve'); 147 $noprintContent .= '</a>'; 148 } 149 } 150 151 $html .= $this->noprint($noprintContent); 152 } 153 154 155 if ($this->getConf('banner_long')) { 156 $page_metadata = $db->getPageMetadata($INFO['id']); 157 if (isset($page_metadata['approver'])) { 158 $html .= $this->noprint( 159 ' | ' . $this->getLang('approver') . ': ' . userlink($page_metadata['approver'], true) 160 ); 161 } 162 } 163 164 $html .= '</div>'; 165 166 return $html; 167 } 168 169 /** 170 * @param $status 171 * @param $rev 172 * @param int|null $last_approved_rev 173 * @return array 174 */ 175 protected function getStatusClasses($status, $rev, ?int $last_approved_rev): array 176 { 177 $classes = []; 178 if ($status == 'approved' && $rev == $last_approved_rev) { 179 $classes[] = 'plugin__approve_approved'; 180 } elseif ($status == 'approved') { 181 $classes[] = 'plugin__approve_old_approved'; 182 } elseif ($this->getConf('ready_for_approval') && $status == 'ready_for_approval') { 183 $classes[] = 'plugin__approve_ready'; 184 } else { 185 $classes[] = 'plugin__approve_draft'; 186 } 187 return $classes; 188 } 189 190 /** 191 * Wrap string in noprint span 192 * @param $content 193 * @return string 194 */ 195 protected function noprint($content) 196 { 197 return '<span class="plugin__approve_noprint">' . $content . '</span>'; 198 } 199} 200