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 */ 9*31e730e1SAnna Dabrowska protected static $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 44b476f81dSAnna Dabrowska $currentRevision = new Revision($ID, $REV ?: $INFO['currentrev']); 4598487b75SAnna Dabrowska $isPublished = $currentRevision->getStatus() === Constants::STATUS_PUBLISHED; 466d5e23d3SAnna Dabrowska 47ed00f27dSAndreas 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