xref: /plugin/structpublish/action/show.php (revision ed00f27d283750104fb7f80bdad97cf3156c4d59)
1e394901aSAnna Dabrowska<?php
2e394901aSAnna Dabrowska
3e31c94d7SAndreas Gohruse dokuwiki\plugin\structpublish\meta\Constants;
4e394901aSAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision;
5e394901aSAnna Dabrowska
6e394901aSAnna Dabrowskaclass action_plugin_structpublish_show extends DokuWiki_Action_Plugin
7e394901aSAnna Dabrowska{
898487b75SAnna Dabrowska    /** @var int */
998487b75SAnna Dabrowska    static protected $latestPublishedRev;
1098487b75SAnna Dabrowska
118b0ba635SAndreas Gohr    /** @inheritDoc */
12e394901aSAnna Dabrowska    public function register(Doku_Event_Handler $controller)
13e394901aSAnna Dabrowska    {
1451066f27SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleShow');
1598487b75SAnna Dabrowska        $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handleShowrev');
16e394901aSAnna Dabrowska    }
17e394901aSAnna Dabrowska
188b0ba635SAndreas Gohr    /**
198b0ba635SAndreas Gohr     * Decide which revision to show based on role assignments
208b0ba635SAndreas Gohr     *
218b0ba635SAndreas Gohr     * @param Doku_Event $event
228b0ba635SAndreas Gohr     * @return void
238b0ba635SAndreas Gohr     */
24e394901aSAnna Dabrowska    public function handleShow(Doku_Event $event)
25e394901aSAnna Dabrowska    {
268b0ba635SAndreas Gohr        if ($event->data != 'show') {
278b0ba635SAndreas Gohr            return;
288b0ba635SAndreas Gohr        }
29e394901aSAnna Dabrowska
30e394901aSAnna Dabrowska        global $ID;
31e394901aSAnna Dabrowska        global $REV;
3251066f27SAnna Dabrowska        global $INFO;
33e394901aSAnna Dabrowska
3440f4519bSAnna Dabrowska        /** @var helper_plugin_structpublish_db $dbHelper */
3551066f27SAnna Dabrowska        $dbHelper = plugin_load('helper', 'structpublish_db');
36e394901aSAnna Dabrowska
37030815a3SAnna Dabrowska        if (
38030815a3SAnna Dabrowska            !$dbHelper->isPublishable() ||
39030815a3SAnna Dabrowska            (auth_isadmin() && !$this->getConf('restrict_admin'))
40030815a3SAnna Dabrowska        ) {
418b0ba635SAndreas Gohr            return;
428b0ba635SAndreas Gohr        }
4340f4519bSAnna Dabrowska
446d5e23d3SAnna Dabrowska        $currentRevision = new Revision($dbHelper->getDB(), $ID, $REV ?: $INFO['currentrev']);
4598487b75SAnna Dabrowska        $isPublished = $currentRevision->getStatus() === Constants::STATUS_PUBLISHED;
466d5e23d3SAnna Dabrowska
47*ed00f27dSAndreas Gohr        if (!$dbHelper->isPublisher($ID)) {
4811580b0eSAnna Dabrowska            $latestPublished = $currentRevision->getLatestPublishedRevision();
4998487b75SAnna Dabrowska            // there is no published revision, show nothing
5098487b75SAnna Dabrowska            if (!$isPublished && is_null($latestPublished)) {
51e394901aSAnna Dabrowska                $event->data = 'denied';
5263483f20SAndreas Gohr                // FIXME we could add our own action to display a custom message instead of standard denied action
5311580b0eSAnna Dabrowska                return;
54e394901aSAnna Dabrowska            }
55e394901aSAnna Dabrowska
5698487b75SAnna Dabrowska            self::$latestPublishedRev = $latestPublished->getRev();
5798487b75SAnna Dabrowska
5898487b75SAnna Dabrowska            // show either the explicitly requested or the latest published revision
5998487b75SAnna Dabrowska            if (!$isPublished) {
6098487b75SAnna Dabrowska                $REV = self::$latestPublishedRev;
6198487b75SAnna Dabrowska                $INFO['rev'] = self::$latestPublishedRev;
6298487b75SAnna Dabrowska            }
6398487b75SAnna Dabrowska        }
6498487b75SAnna Dabrowska    }
6598487b75SAnna Dabrowska
6698487b75SAnna Dabrowska    /**
6798487b75SAnna Dabrowska     * Suppress message about viewing an old revision if it is the latest one
6898487b75SAnna Dabrowska     * that the current user is allowed to see.
6998487b75SAnna Dabrowska     *
7098487b75SAnna Dabrowska     * @param Doku_Event $event
7198487b75SAnna Dabrowska     * @return void
7298487b75SAnna Dabrowska     */
7398487b75SAnna Dabrowska    public function handleShowrev(Doku_Event $event)
7498487b75SAnna Dabrowska    {
7598487b75SAnna Dabrowska        /** @var helper_plugin_structpublish_db $dbHelper */
7698487b75SAnna Dabrowska        $dbHelper = plugin_load('helper', 'structpublish_db');
7798487b75SAnna Dabrowska
7898487b75SAnna Dabrowska        if (
7998487b75SAnna Dabrowska            !$dbHelper->isPublishable() ||
8098487b75SAnna Dabrowska            (auth_isadmin() && !$this->getConf('restrict_admin'))
8198487b75SAnna Dabrowska        ) {
8298487b75SAnna Dabrowska            return;
8398487b75SAnna Dabrowska        }
8498487b75SAnna Dabrowska
8598487b75SAnna Dabrowska        global $INFO;
8698487b75SAnna Dabrowska
8798487b75SAnna Dabrowska        if (self::$latestPublishedRev && self::$latestPublishedRev == $INFO['rev']) {
8898487b75SAnna Dabrowska            $event->preventDefault();
89e394901aSAnna Dabrowska        }
90e394901aSAnna Dabrowska    }
91e394901aSAnna Dabrowska}
92