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