xref: /plugin/publish/action/banner.php (revision 43aa3594b8d7ee24eee5d135f4ba00d4eaafe720)
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