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