1c2f8a3c4SAnna Dabrowska<?php 2c2f8a3c4SAnna Dabrowska 3e31c94d7SAndreas Gohruse dokuwiki\plugin\structpublish\meta\Constants; 4c2f8a3c4SAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision; 5c2f8a3c4SAnna Dabrowska 6c2f8a3c4SAnna Dabrowskaclass action_plugin_structpublish_publish extends DokuWiki_Action_Plugin 7c2f8a3c4SAnna Dabrowska{ 8939e6e3cSAnna Dabrowska /** @var \helper_plugin_structpublish_db */ 9939e6e3cSAnna Dabrowska protected $dbHelper; 10c2f8a3c4SAnna Dabrowska 118b0ba635SAndreas Gohr /** @inheritDoc */ 12c2f8a3c4SAnna Dabrowska public function register(Doku_Event_Handler $controller) 13c2f8a3c4SAnna Dabrowska { 141b063be2SAnna Dabrowska $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleApprove'); 15c2f8a3c4SAnna Dabrowska $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePublish'); 16c2f8a3c4SAnna Dabrowska } 17c2f8a3c4SAnna Dabrowska 188b0ba635SAndreas Gohr /** 198b0ba635SAndreas Gohr * Handle the publish button and version field 208b0ba635SAndreas Gohr * 218b0ba635SAndreas Gohr * @param Doku_Event $event 228b0ba635SAndreas Gohr * @return void 238b0ba635SAndreas Gohr */ 24c2f8a3c4SAnna Dabrowska public function handlePublish(Doku_Event $event) 25c2f8a3c4SAnna Dabrowska { 26*b5c0ae7fSAndreas Gohr if ($event->data != 'show') { 27*b5c0ae7fSAndreas Gohr return; 28*b5c0ae7fSAndreas Gohr } 29e394901aSAnna Dabrowska 30939e6e3cSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 31939e6e3cSAnna Dabrowska 32e394901aSAnna Dabrowska global $INPUT; 33e394901aSAnna Dabrowska $in = $INPUT->arr('structpublish'); 34e31c94d7SAndreas Gohr if (!$in || !isset($in[Constants::ACTION_PUBLISH])) { 35e394901aSAnna Dabrowska return; 36e394901aSAnna Dabrowska } 37e394901aSAnna Dabrowska 385c2215e8SAndreas Gohr if (checkSecurityToken()) { 395c2215e8SAndreas Gohr $this->saveRevision(Constants::STATUS_PUBLISHED, $INPUT->str('version')); 408680d162SAnna Dabrowska $this->updateSchemaData(); 415c2215e8SAndreas Gohr } 42c2f8a3c4SAnna Dabrowska } 431b063be2SAnna Dabrowska 448b0ba635SAndreas Gohr /** 458b0ba635SAndreas Gohr * Handle the approve button 468b0ba635SAndreas Gohr * 478b0ba635SAndreas Gohr * @param Doku_Event $event 488b0ba635SAndreas Gohr * @return void 498b0ba635SAndreas Gohr */ 501b063be2SAnna Dabrowska public function handleApprove(Doku_Event $event) 511b063be2SAnna Dabrowska { 52*b5c0ae7fSAndreas Gohr if ($event->data != 'show') { 53*b5c0ae7fSAndreas Gohr return; 54*b5c0ae7fSAndreas Gohr } 551b063be2SAnna Dabrowska 56939e6e3cSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 57939e6e3cSAnna Dabrowska 581b063be2SAnna Dabrowska global $INPUT; 591b063be2SAnna Dabrowska $in = $INPUT->arr('structpublish'); 60e31c94d7SAndreas Gohr if (!$in || !isset($in[Constants::ACTION_APPROVE])) { 611b063be2SAnna Dabrowska return; 621b063be2SAnna Dabrowska } 631b063be2SAnna Dabrowska 645c2215e8SAndreas Gohr if (checkSecurityToken()) { 65e31c94d7SAndreas Gohr $this->saveRevision(Constants::STATUS_APPROVED); 668680d162SAnna Dabrowska } 675c2215e8SAndreas Gohr } 688680d162SAnna Dabrowska 698680d162SAnna Dabrowska /** 708680d162SAnna Dabrowska * Save publish data 718680d162SAnna Dabrowska * 728680d162SAnna Dabrowska * @param string $status 738680d162SAnna Dabrowska * @return void 748680d162SAnna Dabrowska */ 755c2215e8SAndreas Gohr protected function saveRevision($status, $newversion = '') 768680d162SAnna Dabrowska { 771b063be2SAnna Dabrowska global $ID; 781b063be2SAnna Dabrowska global $INFO; 798680d162SAnna Dabrowska 80*b5c0ae7fSAndreas Gohr if ( 81*b5c0ae7fSAndreas Gohr $status === Constants::STATUS_PUBLISHED && 82*b5c0ae7fSAndreas Gohr !$this->dbHelper->checkAccess($ID, [Constants::ACTION_PUBLISH]) 83*b5c0ae7fSAndreas Gohr ) { 84*b5c0ae7fSAndreas Gohr throw new \Exception('User may not publish'); 85*b5c0ae7fSAndreas Gohr } 86*b5c0ae7fSAndreas Gohr 87*b5c0ae7fSAndreas Gohr if ( 88*b5c0ae7fSAndreas Gohr $status === Constants::STATUS_APPROVED && 89*b5c0ae7fSAndreas Gohr !$this->dbHelper->checkAccess($ID, [Constants::ACTION_APPROVE]) 90*b5c0ae7fSAndreas Gohr ) { 91*b5c0ae7fSAndreas Gohr throw new \Exception('User may not approve'); 92*b5c0ae7fSAndreas Gohr } 93*b5c0ae7fSAndreas Gohr 948680d162SAnna Dabrowska // FIXME prevent bumping an already published revision 95939e6e3cSAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 961b063be2SAnna Dabrowska $revision = new Revision($sqlite, $ID, $INFO['currentrev']); 971b063be2SAnna Dabrowska 98e31c94d7SAndreas Gohr if ($status === Constants::STATUS_PUBLISHED) { 995c2215e8SAndreas Gohr $revision->setVersion($newversion); 1008680d162SAnna Dabrowska } 1018680d162SAnna Dabrowska $revision->setUser($_SERVER['REMOTE_USER']); 1028680d162SAnna Dabrowska $revision->setStatus($status); 10322101782SAndreas Gohr $revision->setTimestamp(time()); 1041b063be2SAnna Dabrowska $revision->save(); 1051b063be2SAnna Dabrowska } 1068680d162SAnna Dabrowska 1078680d162SAnna Dabrowska /** 1088680d162SAnna Dabrowska * Set "published" status in all assigned schemas 1098680d162SAnna Dabrowska * 1108680d162SAnna Dabrowska * @return void 1118680d162SAnna Dabrowska */ 1128680d162SAnna Dabrowska protected function updateSchemaData() 1138680d162SAnna Dabrowska { 1148680d162SAnna Dabrowska global $ID; 1158680d162SAnna Dabrowska global $INFO; 1168680d162SAnna Dabrowska 1178680d162SAnna Dabrowska $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance(); 1188680d162SAnna Dabrowska $tables = $schemaAssignments->getPageAssignments($ID); 1198680d162SAnna Dabrowska 120*b5c0ae7fSAndreas Gohr if (empty($tables)) { 121*b5c0ae7fSAndreas Gohr return; 122*b5c0ae7fSAndreas Gohr } 1238680d162SAnna Dabrowska 1248680d162SAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 1258680d162SAnna Dabrowska 1268680d162SAnna Dabrowska foreach ($tables as $table) { 1278680d162SAnna Dabrowska // TODO unpublish earlier revisions 128*b5c0ae7fSAndreas Gohr $sqlite->query("UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", 129*b5c0ae7fSAndreas Gohr [$ID, $INFO['currentrev']]); 130*b5c0ae7fSAndreas Gohr $sqlite->query("UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", 131*b5c0ae7fSAndreas Gohr [$ID, $INFO['currentrev']]); 1328680d162SAnna Dabrowska } 1338680d162SAnna Dabrowska } 134c2f8a3c4SAnna Dabrowska} 135