xref: /plugin/structpublish/action/show.php (revision 98487b7550fc2f486c5f71bc5be8cd19181af4b1)
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{
8*98487b75SAnna Dabrowska    /** @var int */
9*98487b75SAnna Dabrowska    static protected $latestPublishedRev;
10*98487b75SAnna 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');
15*98487b75SAnna 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']);
45*98487b75SAnna Dabrowska        $isPublished = $currentRevision->getStatus() === Constants::STATUS_PUBLISHED;
466d5e23d3SAnna Dabrowska
47dafa9812SAnna Dabrowska        /** @var action_plugin_structpublish_sqlitefunction $functions */
48dafa9812SAnna Dabrowska        $functions = plugin_load('action', 'structpublish_sqlitefunction');
49*98487b75SAnna Dabrowska        if (!$functions->IS_PUBLISHER($ID)) {
5011580b0eSAnna Dabrowska            $latestPublished = $currentRevision->getLatestPublishedRevision();
51*98487b75SAnna Dabrowska            // there is no published revision, show nothing
52*98487b75SAnna Dabrowska            if (!$isPublished && is_null($latestPublished)) {
53e394901aSAnna Dabrowska                $event->data = 'denied';
5463483f20SAndreas Gohr                // FIXME we could add our own action to display a custom message instead of standard denied action
5511580b0eSAnna Dabrowska                return;
56e394901aSAnna Dabrowska            }
57e394901aSAnna Dabrowska
58*98487b75SAnna Dabrowska            self::$latestPublishedRev = $latestPublished->getRev();
59*98487b75SAnna Dabrowska
60*98487b75SAnna Dabrowska            // show either the explicitly requested or the latest published revision
61*98487b75SAnna Dabrowska            if (!$isPublished) {
62*98487b75SAnna Dabrowska                $REV = self::$latestPublishedRev;
63*98487b75SAnna Dabrowska                $INFO['rev'] = self::$latestPublishedRev;
64*98487b75SAnna Dabrowska            }
65*98487b75SAnna Dabrowska        }
66*98487b75SAnna Dabrowska    }
67*98487b75SAnna Dabrowska
68*98487b75SAnna Dabrowska    /**
69*98487b75SAnna Dabrowska     * Suppress message about viewing an old revision if it is the latest one
70*98487b75SAnna Dabrowska     * that the current user is allowed to see.
71*98487b75SAnna Dabrowska     *
72*98487b75SAnna Dabrowska     * @param Doku_Event $event
73*98487b75SAnna Dabrowska     * @return void
74*98487b75SAnna Dabrowska     */
75*98487b75SAnna Dabrowska    public function handleShowrev(Doku_Event $event)
76*98487b75SAnna Dabrowska    {
77*98487b75SAnna Dabrowska        /** @var helper_plugin_structpublish_db $dbHelper */
78*98487b75SAnna Dabrowska        $dbHelper = plugin_load('helper', 'structpublish_db');
79*98487b75SAnna Dabrowska
80*98487b75SAnna Dabrowska        if (
81*98487b75SAnna Dabrowska            !$dbHelper->isPublishable() ||
82*98487b75SAnna Dabrowska            (auth_isadmin() && !$this->getConf('restrict_admin'))
83*98487b75SAnna Dabrowska        ) {
84*98487b75SAnna Dabrowska            return;
85*98487b75SAnna Dabrowska        }
86*98487b75SAnna Dabrowska
87*98487b75SAnna Dabrowska        global $INFO;
88*98487b75SAnna Dabrowska
89*98487b75SAnna Dabrowska        if (self::$latestPublishedRev && self::$latestPublishedRev == $INFO['rev']) {
90*98487b75SAnna Dabrowska            $event->preventDefault();
91e394901aSAnna Dabrowska        }
92e394901aSAnna Dabrowska    }
93e394901aSAnna Dabrowska}
94