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