1c2f8a3c4SAnna Dabrowska<?php 2c2f8a3c4SAnna Dabrowska 3*e31c94d7SAndreas 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'); 28*e31c94d7SAndreas Gohr if (!$in || !isset($in[Constants::ACTION_PUBLISH])) { 29e394901aSAnna Dabrowska return; 30e394901aSAnna Dabrowska } 31e394901aSAnna Dabrowska 32*e31c94d7SAndreas Gohr $this->saveRevision(Constants::STATUS_PUBLISHED); 33c2f8a3c4SAnna Dabrowska 348680d162SAnna Dabrowska $this->updateSchemaData(); 35c2f8a3c4SAnna Dabrowska 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'); 46*e31c94d7SAndreas Gohr if (!$in || !isset($in[Constants::ACTION_APPROVE])) { 471b063be2SAnna Dabrowska return; 481b063be2SAnna Dabrowska } 491b063be2SAnna Dabrowska 50*e31c94d7SAndreas Gohr $this->saveRevision(Constants::STATUS_APPROVED); 518680d162SAnna Dabrowska } 528680d162SAnna Dabrowska 538680d162SAnna Dabrowska /** 548680d162SAnna Dabrowska * Save publish data 558680d162SAnna Dabrowska * 568680d162SAnna Dabrowska * @param string $status 578680d162SAnna Dabrowska * @return void 588680d162SAnna Dabrowska */ 598680d162SAnna Dabrowska protected function saveRevision($status) 608680d162SAnna Dabrowska { 611b063be2SAnna Dabrowska global $ID; 621b063be2SAnna Dabrowska global $INFO; 638680d162SAnna Dabrowska 648680d162SAnna Dabrowska // FIXME prevent bumping an already published revision 65939e6e3cSAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 661b063be2SAnna Dabrowska $revision = new Revision($sqlite, $ID, $INFO['currentrev']); 671b063be2SAnna Dabrowska 688680d162SAnna Dabrowska // TODO do not autoincrement version, make it a string 69*e31c94d7SAndreas Gohr if ($status === Constants::STATUS_PUBLISHED) { 708680d162SAnna Dabrowska $revision->setVersion($revision->getVersion() + 1); 718680d162SAnna Dabrowska } 728680d162SAnna Dabrowska $revision->setUser($_SERVER['REMOTE_USER']); 738680d162SAnna Dabrowska $revision->setStatus($status); 748680d162SAnna Dabrowska $revision->setDate(time()); 751b063be2SAnna Dabrowska $revision->save(); 761b063be2SAnna Dabrowska } 778680d162SAnna Dabrowska 788680d162SAnna Dabrowska /** 798680d162SAnna Dabrowska * Set "published" status in all assigned schemas 808680d162SAnna Dabrowska * 818680d162SAnna Dabrowska * @return void 828680d162SAnna Dabrowska */ 838680d162SAnna Dabrowska protected function updateSchemaData() 848680d162SAnna Dabrowska { 858680d162SAnna Dabrowska global $ID; 868680d162SAnna Dabrowska global $INFO; 878680d162SAnna Dabrowska 888680d162SAnna Dabrowska $schemaAssignments = \dokuwiki\plugin\struct\meta\Assignments::getInstance(); 898680d162SAnna Dabrowska $tables = $schemaAssignments->getPageAssignments($ID); 908680d162SAnna Dabrowska 918680d162SAnna Dabrowska if (empty($tables)) return; 928680d162SAnna Dabrowska 938680d162SAnna Dabrowska $sqlite = $this->dbHelper->getDB(); 948680d162SAnna Dabrowska 958680d162SAnna Dabrowska foreach ($tables as $table) { 968680d162SAnna Dabrowska // TODO unpublish earlier revisions 978680d162SAnna Dabrowska $sqlite->query( "UPDATE data_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]); 988680d162SAnna Dabrowska $sqlite->query( "UPDATE multi_$table SET published = 1 WHERE pid = ? AND rev = ?", [$ID, $INFO['currentrev']]); 998680d162SAnna Dabrowska } 1008680d162SAnna Dabrowska } 101c2f8a3c4SAnna Dabrowska} 102