11794c5faSDominik Eckelmann<?php 21794c5faSDominik Eckelmann 31794c5faSDominik Eckelmannif(!defined('DOKU_INC')) die(); 41794c5faSDominik Eckelmann 51794c5faSDominik Eckelmannclass action_plugin_publish_banner extends DokuWiki_Action_Plugin { 61794c5faSDominik Eckelmann 7248339c4SDominik Eckelmann /** 8248339c4SDominik Eckelmann * @var helper_plugin_publish 9248339c4SDominik Eckelmann */ 101794c5faSDominik Eckelmann private $hlp; 111794c5faSDominik Eckelmann 121794c5faSDominik Eckelmann function __construct() { 131794c5faSDominik Eckelmann $this->hlp = plugin_load('helper','publish'); 141794c5faSDominik Eckelmann } 151794c5faSDominik Eckelmann 165ccce1abSMichael Große function register(Doku_Event_Handler $controller) { 171794c5faSDominik Eckelmann $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'handle_display_banner', array()); 181794c5faSDominik Eckelmann } 191794c5faSDominik Eckelmann 201794c5faSDominik Eckelmann function handle_display_banner(&$event, $param) { 211794c5faSDominik Eckelmann global $INFO; 221794c5faSDominik Eckelmann 23d9258364SDominik Eckelmann if (!$this->hlp->isActive()) { 241794c5faSDominik Eckelmann return; 251794c5faSDominik Eckelmann } 261794c5faSDominik Eckelmann 271794c5faSDominik Eckelmann if ($event->data != 'show') { 281794c5faSDominik Eckelmann return; 291794c5faSDominik Eckelmann } 301794c5faSDominik Eckelmann 311794c5faSDominik Eckelmann if (!$INFO['exists']) { 321794c5faSDominik Eckelmann return; 331794c5faSDominik Eckelmann } 341794c5faSDominik Eckelmann 351794c5faSDominik Eckelmann $meta = $INFO['meta']; 361794c5faSDominik Eckelmann 371794c5faSDominik Eckelmann if (!$meta['approval']) { 381794c5faSDominik Eckelmann $meta['approval'] = array(); 391794c5faSDominik Eckelmann } 401794c5faSDominik Eckelmann 412391ef60SAndreas Gohr if($INFO['perm'] <= AUTH_READ && $this->getConf('hidereaderbanner')){ 422391ef60SAndreas Gohr return; 432391ef60SAndreas Gohr } 441794c5faSDominik Eckelmann 456994f4a8SMichael Große if ($this->hlp->isCurrentRevisionApproved() && $this->getConf('hide_approved_banner')) { 46269d7557SMichael Große return; 47269d7557SMichael Große } 48269d7557SMichael Große 491794c5faSDominik Eckelmann $this->showBanner(); 501794c5faSDominik Eckelmann return; 511794c5faSDominik Eckelmann } 521794c5faSDominik Eckelmann 531794c5faSDominik Eckelmann function difflink($id, $rev1, $rev2) { 546c4c5b73SMichael Große if($rev1 == $rev2) { 556c4c5b73SMichael Große return ''; 566c4c5b73SMichael Große } 576c4c5b73SMichael Große 586c4c5b73SMichael Große $difflink = $this->hlp->getDifflink($id,$rev1,$rev2); 596c4c5b73SMichael Große 606c4c5b73SMichael Große return '<a href="' . $difflink . 611794c5faSDominik Eckelmann '" class="approved_diff_link">' . 621794c5faSDominik Eckelmann '<img src="'.DOKU_BASE.'lib/images/diff.png" class="approved_diff_link" alt="Diff" />' . 631794c5faSDominik Eckelmann '</a>'; 641794c5faSDominik Eckelmann } 651794c5faSDominik Eckelmann 661794c5faSDominik Eckelmann function showBanner() { 671794c5faSDominik Eckelmann if ($this->hlp->isCurrentRevisionApproved()) { 681794c5faSDominik Eckelmann $class = 'approved_yes'; 691794c5faSDominik Eckelmann } else { 702b00c146SDominik Eckelmann if ($this->hlp->isHiddenForUser()) { 71e9bf2be1SDominik Eckelmann return; 72e9bf2be1SDominik Eckelmann } 731794c5faSDominik Eckelmann $class = 'approved_no'; 741794c5faSDominik Eckelmann } 751794c5faSDominik Eckelmann 761794c5faSDominik Eckelmann printf('<div class="approval %s">', $class); 771794c5faSDominik Eckelmann $this->showLatestDraftIfNewer(); 781794c5faSDominik Eckelmann $this->showLatestApprovedVersion(); 791794c5faSDominik Eckelmann $this->showDraft(); 801794c5faSDominik Eckelmann $this->showApproved(); 811794c5faSDominik Eckelmann $this->showPreviousApproved(); 821794c5faSDominik Eckelmann 831794c5faSDominik Eckelmann $this->showApproveAction(); 842b00c146SDominik Eckelmann $this->showInternalNote(); 851794c5faSDominik Eckelmann 861794c5faSDominik Eckelmann echo '</div>'; 87d5f6523fSMichael Große 88d5f6523fSMichael Große global $INFO; 89d5f6523fSMichael Große if ($this->getConf('apr_mail_receiver') !== '' && $INFO['isadmin']) { 90d5f6523fSMichael Große $addr = $this->getConf('apr_mail_receiver'); 91*43aa3594SPhy if(!mail_isvalid($addr)) { 92d5f6523fSMichael Große msg(sprintf($this->getLang('mail_invalid'),htmlspecialchars($addr)),-1); 93d5f6523fSMichael Große } 94d5f6523fSMichael Große 95d5f6523fSMichael Große } 961794c5faSDominik Eckelmann } 971794c5faSDominik Eckelmann 982b00c146SDominik Eckelmann function showInternalNote() { 992b00c146SDominik Eckelmann $note = trim($this->getConf('internal note')); 1002b00c146SDominik Eckelmann if ($note === '') { 1012b00c146SDominik Eckelmann return; 1022b00c146SDominik Eckelmann } 1032b00c146SDominik Eckelmann if (!$this->hlp->isHidden()) { 1042b00c146SDominik Eckelmann return; 1052b00c146SDominik Eckelmann } 1062b00c146SDominik Eckelmann 1072b00c146SDominik Eckelmann printf('<span>%s</span>', hsc($note)); 1082b00c146SDominik Eckelmann } 1092b00c146SDominik Eckelmann 1101794c5faSDominik Eckelmann function showLatestDraftIfNewer() { 1111794c5faSDominik Eckelmann global $ID; 1121794c5faSDominik Eckelmann $revision = $this->hlp->getRevision(); 1131794c5faSDominik Eckelmann $latestRevision = $this->hlp->getLastestRevision(); 1141794c5faSDominik Eckelmann 1151794c5faSDominik Eckelmann if ($revision >= $latestRevision) { 1161794c5faSDominik Eckelmann return; 1171794c5faSDominik Eckelmann } 1181794c5faSDominik Eckelmann if ($this->hlp->isRevisionApproved($latestRevision)) { 1191794c5faSDominik Eckelmann return; 1201794c5faSDominik Eckelmann } 1211794c5faSDominik Eckelmann 1221794c5faSDominik Eckelmann echo '<span class="approval_latest_draft">'; 1231794c5faSDominik Eckelmann printf($this->getLang('apr_recent_draft'), wl($ID, 'force_rev=1')); 1241794c5faSDominik Eckelmann echo $this->difflink($ID, null, $revision) . '</span>'; 1251794c5faSDominik Eckelmann } 1261794c5faSDominik Eckelmann 1271794c5faSDominik Eckelmann function showLatestApprovedVersion() { 1281794c5faSDominik Eckelmann global $ID; 1291794c5faSDominik Eckelmann $revision = $this->hlp->getRevision(); 1301794c5faSDominik Eckelmann $latestApprovedRevision = $this->hlp->getLatestApprovedRevision(); 1311794c5faSDominik Eckelmann 1321794c5faSDominik Eckelmann if ($latestApprovedRevision <= $revision) { 1331794c5faSDominik Eckelmann return; 1341794c5faSDominik Eckelmann } 1351794c5faSDominik Eckelmann 1361794c5faSDominik Eckelmann $latestRevision = $this->hlp->getLastestRevision(); 1371794c5faSDominik Eckelmann if ($latestApprovedRevision == $latestRevision) { 1381794c5faSDominik Eckelmann //$latestApprovedRevision = ''; 1391794c5faSDominik Eckelmann } 1401794c5faSDominik Eckelmann echo '<span class="approval_outdated">'; 1411794c5faSDominik Eckelmann printf($this->getLang('apr_outdated'), wl($ID, 'rev=' . $latestApprovedRevision)); 1421794c5faSDominik Eckelmann echo $this->difflink($ID, $latestApprovedRevision, $revision) . '</span>'; 1431794c5faSDominik Eckelmann } 1441794c5faSDominik Eckelmann 1451794c5faSDominik Eckelmann function showDraft() { 1461794c5faSDominik Eckelmann $revision = $this->hlp->getRevision(); 1471794c5faSDominik Eckelmann 1481794c5faSDominik Eckelmann if ($this->hlp->isCurrentRevisionApproved()) { 1491794c5faSDominik Eckelmann return; 1501794c5faSDominik Eckelmann } 1511794c5faSDominik Eckelmann 1521794c5faSDominik Eckelmann $approvals = $this->hlp->getApprovalsOnRevision($this->hlp->getRevision()); 1531794c5faSDominik Eckelmann $approvalCount = count($approvals); 1541794c5faSDominik Eckelmann 1551794c5faSDominik Eckelmann echo '<span class="approval_draft">'; 1561794c5faSDominik Eckelmann printf($this->getLang('apr_draft'), '<span class="approval_date">' . dformat($revision) . '</span>'); 1571794c5faSDominik Eckelmann echo '<br />'; 1581794c5faSDominik Eckelmann printf(' ' . $this->getLang('approvals'), $approvalCount, $this->getConf('number_of_approved')); 1591794c5faSDominik Eckelmann if ($approvalCount != 0) { 1601794c5faSDominik Eckelmann printf(' ' . $this->getLang('approved by'), implode(', ', $this->hlp->getApprovers())); 1611794c5faSDominik Eckelmann } 1621794c5faSDominik Eckelmann echo '</span>'; 1631794c5faSDominik Eckelmann } 1641794c5faSDominik Eckelmann 1651794c5faSDominik Eckelmann function showApproved() { 1661794c5faSDominik Eckelmann if (!$this->hlp->isCurrentRevisionApproved()) { 1671794c5faSDominik Eckelmann return; 1681794c5faSDominik Eckelmann } 1691794c5faSDominik Eckelmann 1701794c5faSDominik Eckelmann echo '<span class="approval_approved">'; 1711794c5faSDominik Eckelmann printf($this->getLang('apr_approved'), 1721794c5faSDominik Eckelmann '<span class="approval_date">' . dformat($this->hlp->getApprovalDate()) . '</span>', 1731794c5faSDominik Eckelmann implode(', ', $this->hlp->getApprovers())); 1741794c5faSDominik Eckelmann echo '</span>'; 1751794c5faSDominik Eckelmann } 1761794c5faSDominik Eckelmann 1771794c5faSDominik Eckelmann function showPreviousApproved() { 1781794c5faSDominik Eckelmann global $ID; 1791794c5faSDominik Eckelmann $previousApproved = $this->hlp->getPreviousApprovedRevision(); 1801794c5faSDominik Eckelmann if (!$previousApproved) { 1811794c5faSDominik Eckelmann return; 1821794c5faSDominik Eckelmann } 1831794c5faSDominik Eckelmann echo '<span class="approval_previous">'; 1841794c5faSDominik Eckelmann printf($this->getLang('apr_previous'), 1851794c5faSDominik Eckelmann wl($ID, 'rev=' . $previousApproved), 1861794c5faSDominik Eckelmann dformat($previousApproved)); 1871794c5faSDominik Eckelmann echo $this->difflink($ID, $previousApproved, $this->hlp->getRevision()) . '</span>'; 1881794c5faSDominik Eckelmann } 1891794c5faSDominik Eckelmann 1901794c5faSDominik Eckelmann private function showApproveAction() { 1911794c5faSDominik Eckelmann global $ID; 1921794c5faSDominik Eckelmann global $REV; 1931794c5faSDominik Eckelmann global $USERINFO; 1941794c5faSDominik Eckelmann if (!$this->hlp->canApprove()) { 1951794c5faSDominik Eckelmann return; 1961794c5faSDominik Eckelmann } 1971794c5faSDominik Eckelmann 1981794c5faSDominik Eckelmann $approvals = $this->hlp->getApprovalsOnRevision($this->hlp->getRevision()); 1991794c5faSDominik Eckelmann foreach ($approvals as $approve) { 2001794c5faSDominik Eckelmann if ($approve[1] == $_SERVER['REMOTE_USER']) { 2011794c5faSDominik Eckelmann return; 2021794c5faSDominik Eckelmann } 2031794c5faSDominik Eckelmann if ($approve[1] == $USERINFO['mail']) { 2041794c5faSDominik Eckelmann return; 2051794c5faSDominik Eckelmann } 2061794c5faSDominik Eckelmann } 2071794c5faSDominik Eckelmann 2081794c5faSDominik Eckelmann echo '<span class="approval_action">'; 2091794c5faSDominik Eckelmann echo '<a href="' . wl($ID, array('rev' => $REV, 'publish_approve'=>1)) . '">'; 2101794c5faSDominik Eckelmann echo $this->getLang('approve action'); 2111794c5faSDominik Eckelmann echo '</a>'; 2121794c5faSDominik Eckelmann echo '</span> '; 2131794c5faSDominik Eckelmann } 2141794c5faSDominik Eckelmann} 215