1c2f8a3c4SAnna Dabrowska<?php 2c2f8a3c4SAnna Dabrowska 3c2f8a3c4SAnna Dabrowskanamespace dokuwiki\plugin\structpublish\meta; 4c2f8a3c4SAnna Dabrowska 5e394901aSAnna Dabrowskause dokuwiki\plugin\struct\meta\ConfigParser; 6e394901aSAnna Dabrowskause dokuwiki\plugin\struct\meta\Schema; 7e394901aSAnna Dabrowskause dokuwiki\plugin\struct\meta\SearchConfig; 8e394901aSAnna Dabrowskause dokuwiki\plugin\struct\meta\Value; 9e394901aSAnna Dabrowska 10c2f8a3c4SAnna Dabrowskaclass Revision 11c2f8a3c4SAnna Dabrowska{ 12e394901aSAnna Dabrowska /** @var \helper_plugin_sqlite */ 13c2f8a3c4SAnna Dabrowska protected $sqlite; 14e7259784SAnna Dabrowska 15e7259784SAnna Dabrowska protected $schema; 16e7259784SAnna Dabrowska 17c2f8a3c4SAnna Dabrowska protected $id; 18c2f8a3c4SAnna Dabrowska protected $rev; 196a791fefSAnna Dabrowska protected $published; 20c2f8a3c4SAnna Dabrowska protected $status; 21e394901aSAnna Dabrowska protected $version; 22c2f8a3c4SAnna Dabrowska protected $user; 23e6dd5f77SAnna Dabrowska protected $datetime; 24e7259784SAnna Dabrowska /** 25e7259784SAnna Dabrowska * @var bool|\dokuwiki\plugin\struct\meta\Column 26e7259784SAnna Dabrowska */ 27e7259784SAnna Dabrowska protected $statusCol; 28e7259784SAnna Dabrowska protected $versionCol; 29e7259784SAnna Dabrowska protected $userCol; 30e6dd5f77SAnna Dabrowska protected $datetimeCol; 31e7259784SAnna Dabrowska protected $revisionCol; 32c2f8a3c4SAnna Dabrowska 33c2f8a3c4SAnna Dabrowska /** 34c2f8a3c4SAnna Dabrowska * @param $sqlite 353449f9ceSAnna Dabrowska * @param string $id 363449f9ceSAnna Dabrowska * @param int $rev 37c2f8a3c4SAnna Dabrowska */ 383449f9ceSAnna Dabrowska public function __construct($sqlite, $id, $rev) 39c2f8a3c4SAnna Dabrowska { 40c2f8a3c4SAnna Dabrowska $this->sqlite = $sqlite; 41c2f8a3c4SAnna Dabrowska $this->id = $id; 42c2f8a3c4SAnna Dabrowska $this->rev = $rev; 436a791fefSAnna Dabrowska $this->published = 0; 44e6dd5f77SAnna Dabrowska $this->status = Constants::STATUS_DRAFT; 45c2f8a3c4SAnna Dabrowska 46e7259784SAnna Dabrowska $this->schema = new Schema('structpublish'); 47e7259784SAnna Dabrowska $this->statusCol = $this->schema->findColumn('status'); 48e7259784SAnna Dabrowska $this->versionCol = $this->schema->findColumn('version'); 49e7259784SAnna Dabrowska $this->userCol = $this->schema->findColumn('user'); 50e6dd5f77SAnna Dabrowska $this->datetimeCol = $this->schema->findColumn('datetime'); 51e7259784SAnna Dabrowska $this->revisionCol = $this->schema->findColumn('revision'); 523449f9ceSAnna Dabrowska 53e394901aSAnna Dabrowska /** @var Value[] $values */ 5451066f27SAnna Dabrowska $values = $this->getCoreData('revision=' . $this->rev); 55e394901aSAnna Dabrowska 56e394901aSAnna Dabrowska if (!empty($values)) { 57e7259784SAnna Dabrowska $this->status = $values[$this->statusCol->getColref() - 1]->getRawValue(); 58e7259784SAnna Dabrowska $this->version = $values[$this->versionCol->getColref() - 1]->getRawValue(); 59e7259784SAnna Dabrowska $this->user = $values[$this->userCol->getColref() - 1]->getRawValue(); 60e6dd5f77SAnna Dabrowska $this->datetime = $values[$this->datetimeCol->getColref() - 1]->getRawValue(); 613449f9ceSAnna Dabrowska } 62c2f8a3c4SAnna Dabrowska } 63c2f8a3c4SAnna Dabrowska 64c2f8a3c4SAnna Dabrowska public function save() 65c2f8a3c4SAnna Dabrowska { 66e31c94d7SAndreas Gohr if ($this->status === Constants::STATUS_PUBLISHED) { 676a791fefSAnna Dabrowska $this->published = 1; 686a791fefSAnna Dabrowska } 693449f9ceSAnna Dabrowska 70e394901aSAnna Dabrowska $this->updateCoreData($this->id); 716a791fefSAnna Dabrowska // TODO reset publish status of older revisions 726a791fefSAnna Dabrowska 73c2f8a3c4SAnna Dabrowska } 74c2f8a3c4SAnna Dabrowska 75c2f8a3c4SAnna Dabrowska /** 763449f9ceSAnna Dabrowska * @return int 77c2f8a3c4SAnna Dabrowska */ 78c2f8a3c4SAnna Dabrowska public function getVersion() 79c2f8a3c4SAnna Dabrowska { 803231ebaeSAnna Dabrowska return (int)$this->version; 81c2f8a3c4SAnna Dabrowska } 82c2f8a3c4SAnna Dabrowska 83c2f8a3c4SAnna Dabrowska /** 843449f9ceSAnna Dabrowska * @param int $version 85c2f8a3c4SAnna Dabrowska */ 86c2f8a3c4SAnna Dabrowska public function setVersion($version): void 87c2f8a3c4SAnna Dabrowska { 88c2f8a3c4SAnna Dabrowska $this->version = $version; 89c2f8a3c4SAnna Dabrowska } 90c2f8a3c4SAnna Dabrowska 91c2f8a3c4SAnna Dabrowska /** 923449f9ceSAnna Dabrowska * @return int 93c2f8a3c4SAnna Dabrowska */ 94c2f8a3c4SAnna Dabrowska public function getRev() 95c2f8a3c4SAnna Dabrowska { 96c2f8a3c4SAnna Dabrowska return $this->rev; 97c2f8a3c4SAnna Dabrowska } 98c2f8a3c4SAnna Dabrowska 99c2f8a3c4SAnna Dabrowska /** 1003449f9ceSAnna Dabrowska * @param int $rev 101c2f8a3c4SAnna Dabrowska */ 102c2f8a3c4SAnna Dabrowska public function setRev($rev): void 103c2f8a3c4SAnna Dabrowska { 104c2f8a3c4SAnna Dabrowska $this->rev = $rev; 105c2f8a3c4SAnna Dabrowska } 106c2f8a3c4SAnna Dabrowska 107c2f8a3c4SAnna Dabrowska /** 1083449f9ceSAnna Dabrowska * @return string 109c2f8a3c4SAnna Dabrowska */ 110c2f8a3c4SAnna Dabrowska public function getStatus() 111c2f8a3c4SAnna Dabrowska { 112e394901aSAnna Dabrowska return $this->status; 113c2f8a3c4SAnna Dabrowska } 114c2f8a3c4SAnna Dabrowska 115c2f8a3c4SAnna Dabrowska /** 1163449f9ceSAnna Dabrowska * @param string $status 117c2f8a3c4SAnna Dabrowska */ 118c2f8a3c4SAnna Dabrowska public function setStatus($status): void 119c2f8a3c4SAnna Dabrowska { 120c2f8a3c4SAnna Dabrowska $this->status = $status; 121c2f8a3c4SAnna Dabrowska } 122c2f8a3c4SAnna Dabrowska 123c2f8a3c4SAnna Dabrowska /** 1243449f9ceSAnna Dabrowska * @return string 125c2f8a3c4SAnna Dabrowska */ 126c2f8a3c4SAnna Dabrowska public function getUser() 127c2f8a3c4SAnna Dabrowska { 128c2f8a3c4SAnna Dabrowska return $this->user; 129c2f8a3c4SAnna Dabrowska } 130c2f8a3c4SAnna Dabrowska 131c2f8a3c4SAnna Dabrowska /** 1323449f9ceSAnna Dabrowska * @param string $user 133c2f8a3c4SAnna Dabrowska */ 134c2f8a3c4SAnna Dabrowska public function setUser($user): void 135c2f8a3c4SAnna Dabrowska { 136c2f8a3c4SAnna Dabrowska $this->user = $user; 137c2f8a3c4SAnna Dabrowska } 1383449f9ceSAnna Dabrowska 139e6dd5f77SAnna Dabrowska public function getDatetime() 140e394901aSAnna Dabrowska { 141e6dd5f77SAnna Dabrowska return $this->datetime; 142e394901aSAnna Dabrowska } 143e394901aSAnna Dabrowska 144*5c2215e8SAndreas Gohr public function getTimestamp() 145*5c2215e8SAndreas Gohr { 146*5c2215e8SAndreas Gohr return strtotime($this->datetime); 147*5c2215e8SAndreas Gohr } 148*5c2215e8SAndreas Gohr 149e6dd5f77SAnna Dabrowska public function setDatetime($time) 150e394901aSAnna Dabrowska { 151*5c2215e8SAndreas Gohr $this->datetime = $time; 152*5c2215e8SAndreas Gohr } 153*5c2215e8SAndreas Gohr 154*5c2215e8SAndreas Gohr public function getId() 155*5c2215e8SAndreas Gohr { 156*5c2215e8SAndreas Gohr return $this->id; 157e394901aSAnna Dabrowska } 158e394901aSAnna Dabrowska 1593449f9ceSAnna Dabrowska /** 1603449f9ceSAnna Dabrowska * Update publish status in the core table 1613449f9ceSAnna Dabrowska */ 162e394901aSAnna Dabrowska protected function updateCoreData($pid, $rid = 0) 1633449f9ceSAnna Dabrowska { 164e394901aSAnna Dabrowska $data = [ 165e394901aSAnna Dabrowska 'status' => $this->status, 166e394901aSAnna Dabrowska 'user' => $this->user, 167*5c2215e8SAndreas Gohr 'datetime' => $this->datetime, 168e394901aSAnna Dabrowska 'revision' => $this->rev, 169e394901aSAnna Dabrowska 'version' => $this->version, 170e394901aSAnna Dabrowska ]; 1713231ebaeSAnna Dabrowska $schema = new Schema('structpublish', 0); 1723231ebaeSAnna Dabrowska $access = new AccessTableStructpublish($schema, $pid, 0, $rid); 1736a791fefSAnna Dabrowska $access->setPublished($this->published); 174e394901aSAnna Dabrowska $access->saveData($data); 175e394901aSAnna Dabrowska } 176e394901aSAnna Dabrowska 177e7259784SAnna Dabrowska public function getCoreData($andFilter = '') 178e394901aSAnna Dabrowska { 179e394901aSAnna Dabrowska $lines = [ 180e394901aSAnna Dabrowska 'schema: structpublish', 181e394901aSAnna Dabrowska 'cols: *', 182e394901aSAnna Dabrowska 'filter: %pageid% = $ID$' 183e394901aSAnna Dabrowska ]; 184e7259784SAnna Dabrowska 185e7259784SAnna Dabrowska if ($andFilter) { 186e7259784SAnna Dabrowska $lines[] = 'filter: ' . $andFilter; 187e7259784SAnna Dabrowska } 188e7259784SAnna Dabrowska 189e394901aSAnna Dabrowska $parser = new ConfigParser($lines); 190e394901aSAnna Dabrowska $config = $parser->getConfig(); 19140f4519bSAnna Dabrowska $search = new SearchConfig($config, $this->sqlite); 192e394901aSAnna Dabrowska $data = $search->execute(); 193e394901aSAnna Dabrowska if (!empty($data)) { 19451066f27SAnna Dabrowska // FIXME 195e394901aSAnna Dabrowska return $data[array_key_last($data)]; 196e394901aSAnna Dabrowska } 197e394901aSAnna Dabrowska return []; 1983449f9ceSAnna Dabrowska } 199e7259784SAnna Dabrowska 2008d2065f7SAnna Dabrowska /** 2010dcf68caSAnna Dabrowska * Return "latest" published revision of a given page. 2020dcf68caSAnna Dabrowska * If $rev is specified, "latest" means relative to the $rev revision. 2038d2065f7SAnna Dabrowska * 2040dcf68caSAnna Dabrowska * @param int|null $rev 205ecad4fdbSAnna Dabrowska * @return Revision|null 2068d2065f7SAnna Dabrowska */ 2070dcf68caSAnna Dabrowska public function getLatestPublishedRevision($rev = null) 208e7259784SAnna Dabrowska { 2090dcf68caSAnna Dabrowska $andFilter = 'status=' . Constants::STATUS_PUBLISHED; 2100dcf68caSAnna Dabrowska if ($rev) { 2110dcf68caSAnna Dabrowska $andFilter .= ' AND revision < ' . $rev; 2120dcf68caSAnna Dabrowska } 2130dcf68caSAnna Dabrowska $latestPublished = $this->getCoreData($andFilter); 214d00ea115SAnna Dabrowska 215ecad4fdbSAnna Dabrowska if (empty($latestPublished)) { 216ecad4fdbSAnna Dabrowska return null; 217ecad4fdbSAnna Dabrowska } 218ecad4fdbSAnna Dabrowska 2190dcf68caSAnna Dabrowska $published = new Revision($this->sqlite, $this->id, $latestPublished[$this->revisionCol->getColref() - 1]->getRawValue()); 220ecad4fdbSAnna Dabrowska 2210dcf68caSAnna Dabrowska $published->setStatus($latestPublished[$this->statusCol->getColref() - 1]->getRawValue()); 2220dcf68caSAnna Dabrowska $published->setUser($latestPublished[$this->userCol->getColref() - 1]->getRawValue()); 223e6dd5f77SAnna Dabrowska $published->setDatetime($latestPublished[$this->datetimeCol->getColref() - 1]->getRawValue()); 2240dcf68caSAnna Dabrowska $published->setVersion($latestPublished[$this->versionCol->getColref() - 1]->getRawValue()); 225e7259784SAnna Dabrowska 2260dcf68caSAnna Dabrowska return $published; 227e7259784SAnna Dabrowska } 228c2f8a3c4SAnna Dabrowska} 229