xref: /plugin/structpublish/action/show.php (revision 030815a3f39a1645c375b2646f7b23664948e644)
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{
88b0ba635SAndreas Gohr    /** @inheritDoc */
9e394901aSAnna Dabrowska    public function register(Doku_Event_Handler $controller)
10e394901aSAnna Dabrowska    {
1151066f27SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleShow');
12e394901aSAnna Dabrowska    }
13e394901aSAnna Dabrowska
148b0ba635SAndreas Gohr    /**
158b0ba635SAndreas Gohr     * Decide which revision to show based on role assignments
168b0ba635SAndreas Gohr     *
178b0ba635SAndreas Gohr     * @param Doku_Event $event
188b0ba635SAndreas Gohr     * @return void
198b0ba635SAndreas Gohr     */
20e394901aSAnna Dabrowska    public function handleShow(Doku_Event $event)
21e394901aSAnna Dabrowska    {
228b0ba635SAndreas Gohr        if ($event->data != 'show') {
238b0ba635SAndreas Gohr            return;
248b0ba635SAndreas Gohr        }
25e394901aSAnna Dabrowska
26e394901aSAnna Dabrowska        global $ID;
27e394901aSAnna Dabrowska        global $REV;
2851066f27SAnna Dabrowska        global $INFO;
29e394901aSAnna Dabrowska
3040f4519bSAnna Dabrowska        /** @var helper_plugin_structpublish_db $dbHelper */
3151066f27SAnna Dabrowska        $dbHelper = plugin_load('helper', 'structpublish_db');
32e394901aSAnna Dabrowska
33*030815a3SAnna Dabrowska        if (
34*030815a3SAnna Dabrowska            !$dbHelper->isPublishable() ||
35*030815a3SAnna Dabrowska            (auth_isadmin() && !$this->getConf('restrict_admin'))
36*030815a3SAnna Dabrowska        ) {
378b0ba635SAndreas Gohr            return;
388b0ba635SAndreas Gohr        }
3940f4519bSAnna Dabrowska
406d5e23d3SAnna Dabrowska        $currentRevision = new Revision($dbHelper->getDB(), $ID, $REV ?: $INFO['currentrev']);
416d5e23d3SAnna Dabrowska
42dafa9812SAnna Dabrowska        /** @var action_plugin_structpublish_sqlitefunction $functions */
43dafa9812SAnna Dabrowska        $functions = plugin_load('action', 'structpublish_sqlitefunction');
4451066f27SAnna Dabrowska        if (
45e31c94d7SAndreas Gohr            $currentRevision->getStatus() !== Constants::STATUS_PUBLISHED
46dafa9812SAnna Dabrowska            && !$functions->IS_PUBLISHER($ID)
4751066f27SAnna Dabrowska        ) {
4811580b0eSAnna Dabrowska            $latestPublished = $currentRevision->getLatestPublishedRevision();
4911580b0eSAnna Dabrowska            if (is_null($latestPublished)) {
50e394901aSAnna Dabrowska                $event->data = 'denied';
5163483f20SAndreas Gohr                // FIXME we could add our own action to display a custom message instead of standard denied action
5211580b0eSAnna Dabrowska                return;
53e394901aSAnna Dabrowska            }
54e394901aSAnna Dabrowska
5511580b0eSAnna Dabrowska            $latestPublishedRev = $latestPublished->getRev();
568d2065f7SAnna Dabrowska            $REV = $latestPublishedRev;
578d2065f7SAnna Dabrowska            $INFO['rev'] = $latestPublishedRev;
58e394901aSAnna Dabrowska        }
59e394901aSAnna Dabrowska    }
60e394901aSAnna Dabrowska}
61