xref: /plugin/structpublish/action/show.php (revision 9ab8cbae39a6ffa37705f745bc76916ea212a92b)
1e394901aSAnna Dabrowska<?php
2e394901aSAnna Dabrowska
3*9ab8cbaeSanndause dokuwiki\Extension\ActionPlugin;
4*9ab8cbaeSanndause dokuwiki\Extension\EventHandler;
5*9ab8cbaeSanndause dokuwiki\Extension\Event;
6e31c94d7SAndreas Gohruse dokuwiki\plugin\structpublish\meta\Constants;
7e394901aSAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision;
8e394901aSAnna Dabrowska
9*9ab8cbaeSanndaclass action_plugin_structpublish_show extends ActionPlugin
10e394901aSAnna Dabrowska{
1198487b75SAnna Dabrowska    /** @var int */
1231e730e1SAnna Dabrowska    protected static $latestPublishedRev;
1398487b75SAnna Dabrowska
148b0ba635SAndreas Gohr    /** @inheritDoc */
15*9ab8cbaeSannda    public function register(EventHandler $controller)
16e394901aSAnna Dabrowska    {
1751066f27SAnna Dabrowska        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleShow');
1898487b75SAnna Dabrowska        $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, 'handleShowrev');
19e394901aSAnna Dabrowska    }
20e394901aSAnna Dabrowska
218b0ba635SAndreas Gohr    /**
228b0ba635SAndreas Gohr     * Decide which revision to show based on role assignments
238b0ba635SAndreas Gohr     *
24*9ab8cbaeSannda     * @param Event $event
258b0ba635SAndreas Gohr     * @return void
268b0ba635SAndreas Gohr     */
27*9ab8cbaeSannda    public function handleShow(Event $event)
28e394901aSAnna Dabrowska    {
298b0ba635SAndreas Gohr        if ($event->data != 'show') {
308b0ba635SAndreas Gohr            return;
318b0ba635SAndreas Gohr        }
32e394901aSAnna Dabrowska
33e394901aSAnna Dabrowska        global $ID;
34e394901aSAnna Dabrowska        global $REV;
3551066f27SAnna Dabrowska        global $INFO;
36e394901aSAnna Dabrowska
3740f4519bSAnna Dabrowska        /** @var helper_plugin_structpublish_db $dbHelper */
3851066f27SAnna Dabrowska        $dbHelper = plugin_load('helper', 'structpublish_db');
39e394901aSAnna Dabrowska
40030815a3SAnna Dabrowska        if (
41030815a3SAnna Dabrowska            !$dbHelper->isPublishable() ||
42030815a3SAnna Dabrowska            (auth_isadmin() && !$this->getConf('restrict_admin'))
43030815a3SAnna Dabrowska        ) {
448b0ba635SAndreas Gohr            return;
458b0ba635SAndreas Gohr        }
4640f4519bSAnna Dabrowska
47b476f81dSAnna Dabrowska        $currentRevision = new Revision($ID, $REV ?: $INFO['currentrev']);
4898487b75SAnna Dabrowska        $isPublished = $currentRevision->getStatus() === Constants::STATUS_PUBLISHED;
496d5e23d3SAnna Dabrowska
509cc4b3d8SAnna Dabrowska        if (!$dbHelper->isPublisher($ID) && auth_quickaclcheck($ID) < AUTH_EDIT) {
5111580b0eSAnna Dabrowska            $latestPublished = $currentRevision->getLatestPublishedRevision();
5298487b75SAnna Dabrowska            // there is no published revision, show nothing
5398487b75SAnna Dabrowska            if (!$isPublished && is_null($latestPublished)) {
54e394901aSAnna Dabrowska                $event->data = 'denied';
5563483f20SAndreas Gohr                // FIXME we could add our own action to display a custom message instead of standard denied action
5611580b0eSAnna Dabrowska                return;
57e394901aSAnna Dabrowska            }
58e394901aSAnna Dabrowska
5998487b75SAnna Dabrowska            self::$latestPublishedRev = $latestPublished->getRev();
6098487b75SAnna Dabrowska
6198487b75SAnna Dabrowska            // show either the explicitly requested or the latest published revision
6298487b75SAnna Dabrowska            if (!$isPublished) {
6398487b75SAnna Dabrowska                $REV = self::$latestPublishedRev;
6498487b75SAnna Dabrowska                $INFO['rev'] = self::$latestPublishedRev;
6598487b75SAnna Dabrowska            }
6698487b75SAnna Dabrowska        }
6798487b75SAnna Dabrowska    }
6898487b75SAnna Dabrowska
6998487b75SAnna Dabrowska    /**
7098487b75SAnna Dabrowska     * Suppress message about viewing an old revision if it is the latest one
7198487b75SAnna Dabrowska     * that the current user is allowed to see.
7298487b75SAnna Dabrowska     *
73*9ab8cbaeSannda     * @param Event $event
7498487b75SAnna Dabrowska     * @return void
7598487b75SAnna Dabrowska     */
76*9ab8cbaeSannda    public function handleShowrev(Event $event)
7798487b75SAnna Dabrowska    {
7898487b75SAnna Dabrowska        /** @var helper_plugin_structpublish_db $dbHelper */
7998487b75SAnna Dabrowska        $dbHelper = plugin_load('helper', 'structpublish_db');
8098487b75SAnna Dabrowska
8198487b75SAnna Dabrowska        if (
8298487b75SAnna Dabrowska            !$dbHelper->isPublishable() ||
8398487b75SAnna Dabrowska            (auth_isadmin() && !$this->getConf('restrict_admin'))
8498487b75SAnna Dabrowska        ) {
8598487b75SAnna Dabrowska            return;
8698487b75SAnna Dabrowska        }
8798487b75SAnna Dabrowska
8898487b75SAnna Dabrowska        global $INFO;
8998487b75SAnna Dabrowska
9098487b75SAnna Dabrowska        if (self::$latestPublishedRev && self::$latestPublishedRev == $INFO['rev']) {
9198487b75SAnna Dabrowska            $event->preventDefault();
92e394901aSAnna Dabrowska        }
93e394901aSAnna Dabrowska    }
94e394901aSAnna Dabrowska}
95