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 11*8b0ba635SAndreas 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 18*8b0ba635SAndreas Gohr /** 19*8b0ba635SAndreas Gohr * Handle the publish button and version field 20*8b0ba635SAndreas Gohr * 21*8b0ba635SAndreas Gohr * @param Doku_Event $event 22*8b0ba635SAndreas Gohr * @return void 23*8b0ba635SAndreas Gohr */ 24c2f8a3c4SAnna Dabrowska public function handlePublish(Doku_Event $event) 25c2f8a3c4SAnna Dabrowska { 26c2f8a3c4SAnna Dabrowska if ($event->data != 'show') return; 27e394901aSAnna Dabrowska 28939e6e3cSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 29939e6e3cSAnna Dabrowska 30e394901aSAnna Dabrowska global $INPUT; 31e394901aSAnna Dabrowska $in = $INPUT->arr('structpublish'); 32e31c94d7SAndreas Gohr if (!$in || !isset($in[Constants::ACTION_PUBLISH])) { 33e394901aSAnna Dabrowska return; 34e394901aSAnna Dabrowska } 35e394901aSAnna Dabrowska 365c2215e8SAndreas Gohr if(checkSecurityToken()) { 375c2215e8SAndreas Gohr $this->saveRevision(Constants::STATUS_PUBLISHED, $INPUT->str('version')); 388680d162SAnna Dabrowska $this->updateSchemaData(); 395c2215e8SAndreas Gohr } 40c2f8a3c4SAnna Dabrowska } 411b063be2SAnna Dabrowska 42*8b0ba635SAndreas Gohr /** 43*8b0ba635SAndreas Gohr * Handle the approve button 44*8b0ba635SAndreas Gohr * 45*8b0ba635SAndreas Gohr * @param Doku_Event $event 46*8b0ba635SAndreas Gohr * @return void 47*8b0ba635SAndreas Gohr */ 481b063be2SAnna Dabrowska public function handleApprove(Doku_Event $event) 491b063be2SAnna Dabrowska { 501b063be2SAnna Dabrowska if ($event->data != 'show') return; 511b063be2SAnna Dabrowska 52939e6e3cSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 53939e6e3cSAnna Dabrowska 541b063be2SAnna Dabrowska global $INPUT; 551b063be2SAnna Dabrowska $in = $INPUT->arr('structpublish'); 56e31c94d7SAndreas Gohr if (!$in || !isset($in[Constants::ACTION_APPROVE])) { 571b063be2SAnna Dabrowska return; 581b063be2SAnna Dabrowska } 591b063be2SAnna Dabrowska 605c2215e8SAndreas Gohr if(checkSecurityToken()) { 61e31c94d7SAndreas Gohr $this->saveRevision(Constants::STATUS_APPROVED); 628680d162SAnna Dabrowska } 635c2215e8SAndreas Gohr } 648680d162SAnna Dabrowska 658680d162SAnna Dabrowska /** 668680d162SAnna Dabrowska * Save publish data 678680d162SAnna Dabrowska * 68*8b0ba635SAndreas Gohr * @todo check user role 698680d162SAnna Dabrowska * @param string $status 708680d162SAnna Dabrowska * @return void 718680d162SAnna Dabrowska */ 725c2215e8SAndreas Gohr protected function saveRevision($status, $newversion='') 738680d162SAnna Dabrowska { 741b063be2SAnna Dabrowska global $ID; 751b063be2SAnna Dabrowska global $INFO; 768680d162SAnna Dabrowska 778680d162SAnna Dabrowska // FIXME prevent bumping an already published revision 78939e6e3cSAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 791b063be2SAnna Dabrowska $revision = new Revision($sqlite, $ID, $INFO['currentrev']); 801b063be2SAnna Dabrowska 81e31c94d7SAndreas Gohr if ($status === Constants::STATUS_PUBLISHED) { 825c2215e8SAndreas Gohr $revision->setVersion($newversion); 838680d162SAnna Dabrowska } 848680d162SAnna Dabrowska $revision->setUser($_SERVER['REMOTE_USER']); 858680d162SAnna Dabrowska $revision->setStatus($status); 8622101782SAndreas Gohr $revision->setTimestamp(time()); 871b063be2SAnna Dabrowska $revision->save(); 881b063be2SAnna Dabrowska } 898680d162SAnna Dabrowska 908680d162SAnna Dabrowska /** 918680d162SAnna Dabrowska * Set "published" status in all assigned schemas 928680d162SAnna Dabrowska * 938680d162SAnna Dabrowska * @return void 948680d162SAnna Dabrowska */ 958680d162SAnna Dabrowska protected function updateSchemaData() 968680d162SAnna Dabrowska { 978680d162SAnna Dabrowska global $ID; 988680d162SAnna Dabrowska global $INFO; 998680d162SAnna Dabrowska 1008680d162SAnna Dabrowska $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance(); 1018680d162SAnna Dabrowska $tables = $schemaAssignments->getPageAssignments($ID); 1028680d162SAnna Dabrowska 1038680d162SAnna Dabrowska if (empty($tables)) return; 1048680d162SAnna Dabrowska 1058680d162SAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 1068680d162SAnna Dabrowska 1078680d162SAnna Dabrowska foreach ($tables as $table) { 1088680d162SAnna Dabrowska // TODO unpublish earlier revisions 1098680d162SAnna Dabrowska $sqlite->query( "UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]); 1108680d162SAnna Dabrowska $sqlite->query( "UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]); 1118680d162SAnna Dabrowska } 1128680d162SAnna Dabrowska } 113c2f8a3c4SAnna Dabrowska} 114