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 11c2f8a3c4SAnna Dabrowska /** 12c2f8a3c4SAnna Dabrowska * @inheritDoc 13c2f8a3c4SAnna Dabrowska */ 14c2f8a3c4SAnna Dabrowska public function register(Doku_Event_Handler $controller) 15c2f8a3c4SAnna Dabrowska { 161b063be2SAnna Dabrowska $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleApprove'); 17c2f8a3c4SAnna Dabrowska $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePublish'); 18c2f8a3c4SAnna Dabrowska } 19c2f8a3c4SAnna Dabrowska 20c2f8a3c4SAnna Dabrowska public function handlePublish(Doku_Event $event) 21c2f8a3c4SAnna Dabrowska { 22c2f8a3c4SAnna Dabrowska if ($event->data != 'show') return; 23e394901aSAnna Dabrowska 24939e6e3cSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 25939e6e3cSAnna Dabrowska 26e394901aSAnna Dabrowska global $INPUT; 27e394901aSAnna Dabrowska $in = $INPUT->arr('structpublish'); 28e31c94d7SAndreas Gohr if (!$in || !isset($in[Constants::ACTION_PUBLISH])) { 29e394901aSAnna Dabrowska return; 30e394901aSAnna Dabrowska } 31e394901aSAnna Dabrowska 325c2215e8SAndreas Gohr if(checkSecurityToken()) { 335c2215e8SAndreas Gohr $this->saveRevision(Constants::STATUS_PUBLISHED, $INPUT->str('version')); 348680d162SAnna Dabrowska $this->updateSchemaData(); 355c2215e8SAndreas Gohr } 36c2f8a3c4SAnna Dabrowska } 371b063be2SAnna Dabrowska 381b063be2SAnna Dabrowska public function handleApprove(Doku_Event $event) 391b063be2SAnna Dabrowska { 401b063be2SAnna Dabrowska if ($event->data != 'show') return; 411b063be2SAnna Dabrowska 42939e6e3cSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 43939e6e3cSAnna Dabrowska 441b063be2SAnna Dabrowska global $INPUT; 451b063be2SAnna Dabrowska $in = $INPUT->arr('structpublish'); 46e31c94d7SAndreas Gohr if (!$in || !isset($in[Constants::ACTION_APPROVE])) { 471b063be2SAnna Dabrowska return; 481b063be2SAnna Dabrowska } 491b063be2SAnna Dabrowska 505c2215e8SAndreas Gohr if(checkSecurityToken()) { 51e31c94d7SAndreas Gohr $this->saveRevision(Constants::STATUS_APPROVED); 528680d162SAnna Dabrowska } 535c2215e8SAndreas Gohr } 548680d162SAnna Dabrowska 558680d162SAnna Dabrowska /** 568680d162SAnna Dabrowska * Save publish data 578680d162SAnna Dabrowska * 588680d162SAnna Dabrowska * @param string $status 598680d162SAnna Dabrowska * @return void 608680d162SAnna Dabrowska */ 615c2215e8SAndreas Gohr protected function saveRevision($status, $newversion='') 628680d162SAnna Dabrowska { 631b063be2SAnna Dabrowska global $ID; 641b063be2SAnna Dabrowska global $INFO; 658680d162SAnna Dabrowska 668680d162SAnna Dabrowska // FIXME prevent bumping an already published revision 67939e6e3cSAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 681b063be2SAnna Dabrowska $revision = new Revision($sqlite, $ID, $INFO['currentrev']); 691b063be2SAnna Dabrowska 70e31c94d7SAndreas Gohr if ($status === Constants::STATUS_PUBLISHED) { 715c2215e8SAndreas Gohr $revision->setVersion($newversion); 728680d162SAnna Dabrowska } 738680d162SAnna Dabrowska $revision->setUser($_SERVER['REMOTE_USER']); 748680d162SAnna Dabrowska $revision->setStatus($status); 75*22101782SAndreas Gohr $revision->setTimestamp(time()); 761b063be2SAnna Dabrowska $revision->save(); 771b063be2SAnna Dabrowska } 788680d162SAnna Dabrowska 798680d162SAnna Dabrowska /** 808680d162SAnna Dabrowska * Set "published" status in all assigned schemas 818680d162SAnna Dabrowska * 828680d162SAnna Dabrowska * @return void 838680d162SAnna Dabrowska */ 848680d162SAnna Dabrowska protected function updateSchemaData() 858680d162SAnna Dabrowska { 868680d162SAnna Dabrowska global $ID; 878680d162SAnna Dabrowska global $INFO; 888680d162SAnna Dabrowska 898680d162SAnna Dabrowska $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance(); 908680d162SAnna Dabrowska $tables = $schemaAssignments->getPageAssignments($ID); 918680d162SAnna Dabrowska 928680d162SAnna Dabrowska if (empty($tables)) return; 938680d162SAnna Dabrowska 948680d162SAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 958680d162SAnna Dabrowska 968680d162SAnna Dabrowska foreach ($tables as $table) { 978680d162SAnna Dabrowska // TODO unpublish earlier revisions 988680d162SAnna Dabrowska $sqlite->query( "UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]); 998680d162SAnna Dabrowska $sqlite->query( "UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]); 1008680d162SAnna Dabrowska } 1018680d162SAnna Dabrowska } 102c2f8a3c4SAnna Dabrowska} 103