1c2f8a3c4SAnna Dabrowska<?php 2c2f8a3c4SAnna Dabrowska 3c2f8a3c4SAnna Dabrowskause dokuwiki\plugin\structpublish\meta\Revision; 4c2f8a3c4SAnna Dabrowska 5c2f8a3c4SAnna Dabrowskaclass action_plugin_structpublish_publish extends DokuWiki_Action_Plugin 6c2f8a3c4SAnna Dabrowska{ 7939e6e3cSAnna Dabrowska /** @var \helper_plugin_structpublish_db */ 8939e6e3cSAnna Dabrowska protected $dbHelper; 9c2f8a3c4SAnna Dabrowska 10c2f8a3c4SAnna Dabrowska /** 11c2f8a3c4SAnna Dabrowska * @inheritDoc 12c2f8a3c4SAnna Dabrowska */ 13c2f8a3c4SAnna Dabrowska public function register(Doku_Event_Handler $controller) 14c2f8a3c4SAnna Dabrowska { 151b063be2SAnna Dabrowska $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handleApprove'); 16c2f8a3c4SAnna Dabrowska $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, 'handlePublish'); 17c2f8a3c4SAnna Dabrowska } 18c2f8a3c4SAnna Dabrowska 19c2f8a3c4SAnna Dabrowska public function handlePublish(Doku_Event $event) 20c2f8a3c4SAnna Dabrowska { 21c2f8a3c4SAnna Dabrowska if ($event->data != 'show') return; 22e394901aSAnna Dabrowska 23939e6e3cSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 24939e6e3cSAnna Dabrowska 25e394901aSAnna Dabrowska global $INPUT; 26e394901aSAnna Dabrowska $in = $INPUT->arr('structpublish'); 27939e6e3cSAnna Dabrowska if (!$in || !isset($in[$this->dbHelper::ACTION_PUBLISH])) { 28e394901aSAnna Dabrowska return; 29e394901aSAnna Dabrowska } 30e394901aSAnna Dabrowska 31*8680d162SAnna Dabrowska $this->saveRevision(Revision::STATUS_PUBLISHED); 32c2f8a3c4SAnna Dabrowska 33*8680d162SAnna Dabrowska $this->updateSchemaData(); 34c2f8a3c4SAnna Dabrowska 35c2f8a3c4SAnna Dabrowska } 361b063be2SAnna Dabrowska 371b063be2SAnna Dabrowska public function handleApprove(Doku_Event $event) 381b063be2SAnna Dabrowska { 391b063be2SAnna Dabrowska if ($event->data != 'show') return; 401b063be2SAnna Dabrowska 41939e6e3cSAnna Dabrowska $this->dbHelper = plugin_load('helper', 'structpublish_db'); 42939e6e3cSAnna Dabrowska 431b063be2SAnna Dabrowska global $INPUT; 441b063be2SAnna Dabrowska $in = $INPUT->arr('structpublish'); 45939e6e3cSAnna Dabrowska if (!$in || !isset($in[$this->dbHelper::ACTION_APPROVE])) { 461b063be2SAnna Dabrowska return; 471b063be2SAnna Dabrowska } 481b063be2SAnna Dabrowska 49*8680d162SAnna Dabrowska $this->saveRevision(Revision::STATUS_APPROVED); 50*8680d162SAnna Dabrowska } 51*8680d162SAnna Dabrowska 52*8680d162SAnna Dabrowska /** 53*8680d162SAnna Dabrowska * Save publish data 54*8680d162SAnna Dabrowska * 55*8680d162SAnna Dabrowska * @param string $status 56*8680d162SAnna Dabrowska * @return void 57*8680d162SAnna Dabrowska */ 58*8680d162SAnna Dabrowska protected function saveRevision($status) 59*8680d162SAnna Dabrowska { 601b063be2SAnna Dabrowska global $ID; 611b063be2SAnna Dabrowska global $INFO; 62*8680d162SAnna Dabrowska 63*8680d162SAnna Dabrowska // FIXME prevent bumping an already published revision 64939e6e3cSAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 651b063be2SAnna Dabrowska $revision = new Revision($sqlite, $ID, $INFO['currentrev']); 661b063be2SAnna Dabrowska 67*8680d162SAnna Dabrowska // TODO do not autoincrement version, make it a string 68*8680d162SAnna Dabrowska if ($status === Revision::STATUS_PUBLISHED) { 69*8680d162SAnna Dabrowska $revision->setVersion($revision->getVersion() + 1); 70*8680d162SAnna Dabrowska } 71*8680d162SAnna Dabrowska $revision->setUser($_SERVER['REMOTE_USER']); 72*8680d162SAnna Dabrowska $revision->setStatus($status); 73*8680d162SAnna Dabrowska $revision->setDate(time()); 741b063be2SAnna Dabrowska $revision->save(); 751b063be2SAnna Dabrowska } 76*8680d162SAnna Dabrowska 77*8680d162SAnna Dabrowska /** 78*8680d162SAnna Dabrowska * Set "published" status in all assigned schemas 79*8680d162SAnna Dabrowska * 80*8680d162SAnna Dabrowska * @return void 81*8680d162SAnna Dabrowska */ 82*8680d162SAnna Dabrowska protected function updateSchemaData() 83*8680d162SAnna Dabrowska { 84*8680d162SAnna Dabrowska global $ID; 85*8680d162SAnna Dabrowska global $INFO; 86*8680d162SAnna Dabrowska 87*8680d162SAnna Dabrowska $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance(); 88*8680d162SAnna Dabrowska $tables = $schemaAssignments->getPageAssignments($ID); 89*8680d162SAnna Dabrowska 90*8680d162SAnna Dabrowska if (empty($tables)) return; 91*8680d162SAnna Dabrowska 92*8680d162SAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 93*8680d162SAnna Dabrowska 94*8680d162SAnna Dabrowska foreach ($tables as $table) { 95*8680d162SAnna Dabrowska // TODO unpublish earlier revisions 96*8680d162SAnna Dabrowska $sqlite->query( "UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]); 97*8680d162SAnna Dabrowska $sqlite->query( "UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]); 98*8680d162SAnna Dabrowska } 99*8680d162SAnna Dabrowska } 100c2f8a3c4SAnna Dabrowska} 101