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{ 12c2f8a3c4SAnna Dabrowska const STATUS_DRAFT = 'draft'; 133231ebaeSAnna Dabrowska const STATUS_APPROVED = 'approved'; 14c2f8a3c4SAnna Dabrowska const STATUS_PUBLISHED = 'published'; 15c2f8a3c4SAnna Dabrowska 16e394901aSAnna Dabrowska /** @var \helper_plugin_sqlite */ 17c2f8a3c4SAnna Dabrowska protected $sqlite; 18e7259784SAnna Dabrowska 19e7259784SAnna Dabrowska protected $schema; 20e7259784SAnna Dabrowska 21c2f8a3c4SAnna Dabrowska protected $id; 22c2f8a3c4SAnna Dabrowska protected $rev; 23*6a791fefSAnna Dabrowska protected $published; 24c2f8a3c4SAnna Dabrowska protected $status; 25e394901aSAnna Dabrowska protected $version; 26c2f8a3c4SAnna Dabrowska protected $user; 27e394901aSAnna Dabrowska protected $date; 28e7259784SAnna Dabrowska /** 29e7259784SAnna Dabrowska * @var bool|\dokuwiki\plugin\struct\meta\Column 30e7259784SAnna Dabrowska */ 31e7259784SAnna Dabrowska protected $statusCol; 32e7259784SAnna Dabrowska protected $versionCol; 33e7259784SAnna Dabrowska protected $userCol; 34e7259784SAnna Dabrowska protected $dateCol; 35e7259784SAnna Dabrowska protected $revisionCol; 36c2f8a3c4SAnna Dabrowska 37c2f8a3c4SAnna Dabrowska /** 38c2f8a3c4SAnna Dabrowska * @param $sqlite 393449f9ceSAnna Dabrowska * @param string $id 403449f9ceSAnna Dabrowska * @param int $rev 41c2f8a3c4SAnna Dabrowska */ 423449f9ceSAnna Dabrowska public function __construct($sqlite, $id, $rev) 43c2f8a3c4SAnna Dabrowska { 44c2f8a3c4SAnna Dabrowska $this->sqlite = $sqlite; 45c2f8a3c4SAnna Dabrowska $this->id = $id; 46c2f8a3c4SAnna Dabrowska $this->rev = $rev; 47*6a791fefSAnna Dabrowska $this->published = 0; 48c2f8a3c4SAnna Dabrowska 49e7259784SAnna Dabrowska $this->schema = new Schema('structpublish'); 50e7259784SAnna Dabrowska $this->statusCol = $this->schema->findColumn('status'); 51e7259784SAnna Dabrowska $this->versionCol = $this->schema->findColumn('version'); 52e7259784SAnna Dabrowska $this->userCol = $this->schema->findColumn('user'); 53e7259784SAnna Dabrowska $this->dateCol = $this->schema->findColumn('date'); 54e7259784SAnna Dabrowska $this->revisionCol = $this->schema->findColumn('revision'); 553449f9ceSAnna Dabrowska 56e394901aSAnna Dabrowska /** @var Value[] $values */ 5751066f27SAnna Dabrowska $values = $this->getCoreData('revision=' . $this->rev); 58e394901aSAnna Dabrowska 59e394901aSAnna Dabrowska if (!empty($values)) { 60e7259784SAnna Dabrowska $this->status = $values[$this->statusCol->getColref() - 1]->getRawValue(); 61e7259784SAnna Dabrowska $this->version = $values[$this->versionCol->getColref() - 1]->getRawValue(); 62e7259784SAnna Dabrowska $this->user = $values[$this->userCol->getColref() - 1]->getRawValue(); 63e7259784SAnna Dabrowska $this->date = $values[$this->dateCol->getColref() - 1]->getRawValue(); 643449f9ceSAnna Dabrowska } 65c2f8a3c4SAnna Dabrowska } 66c2f8a3c4SAnna Dabrowska 67c2f8a3c4SAnna Dabrowska public function save() 68c2f8a3c4SAnna Dabrowska { 69e394901aSAnna Dabrowska // drafts reference the latest version 70e394901aSAnna Dabrowska if ($this->status === self::STATUS_DRAFT) { 71e394901aSAnna Dabrowska //FIXME no rev yet 72e394901aSAnna Dabrowska $this->setVersion($this->getVersion()); 73e394901aSAnna Dabrowska } 74e394901aSAnna Dabrowska 75*6a791fefSAnna Dabrowska if ($this->status === self::STATUS_PUBLISHED) { 76*6a791fefSAnna Dabrowska $this->published = 1; 77*6a791fefSAnna Dabrowska } 783449f9ceSAnna Dabrowska 79e394901aSAnna Dabrowska $this->updateCoreData($this->id); 80*6a791fefSAnna Dabrowska // TODO reset publish status of older revisions 81*6a791fefSAnna Dabrowska 82c2f8a3c4SAnna Dabrowska } 83c2f8a3c4SAnna Dabrowska 84c2f8a3c4SAnna Dabrowska /** 853449f9ceSAnna Dabrowska * @return int 86c2f8a3c4SAnna Dabrowska */ 87c2f8a3c4SAnna Dabrowska public function getVersion() 88c2f8a3c4SAnna Dabrowska { 893231ebaeSAnna Dabrowska return (int)$this->version; 90c2f8a3c4SAnna Dabrowska } 91c2f8a3c4SAnna Dabrowska 92c2f8a3c4SAnna Dabrowska /** 933449f9ceSAnna Dabrowska * @param int $version 94c2f8a3c4SAnna Dabrowska */ 95c2f8a3c4SAnna Dabrowska public function setVersion($version): void 96c2f8a3c4SAnna Dabrowska { 97c2f8a3c4SAnna Dabrowska $this->version = $version; 98c2f8a3c4SAnna Dabrowska } 99c2f8a3c4SAnna Dabrowska 100c2f8a3c4SAnna Dabrowska /** 1013449f9ceSAnna Dabrowska * @return int 102c2f8a3c4SAnna Dabrowska */ 103c2f8a3c4SAnna Dabrowska public function getRev() 104c2f8a3c4SAnna Dabrowska { 105c2f8a3c4SAnna Dabrowska return $this->rev; 106c2f8a3c4SAnna Dabrowska } 107c2f8a3c4SAnna Dabrowska 108c2f8a3c4SAnna Dabrowska /** 1093449f9ceSAnna Dabrowska * @param int $rev 110c2f8a3c4SAnna Dabrowska */ 111c2f8a3c4SAnna Dabrowska public function setRev($rev): void 112c2f8a3c4SAnna Dabrowska { 113c2f8a3c4SAnna Dabrowska $this->rev = $rev; 114c2f8a3c4SAnna Dabrowska } 115c2f8a3c4SAnna Dabrowska 116c2f8a3c4SAnna Dabrowska /** 1173449f9ceSAnna Dabrowska * @return string 118c2f8a3c4SAnna Dabrowska */ 119c2f8a3c4SAnna Dabrowska public function getStatus() 120c2f8a3c4SAnna Dabrowska { 121e394901aSAnna Dabrowska return $this->status; 122c2f8a3c4SAnna Dabrowska } 123c2f8a3c4SAnna Dabrowska 124c2f8a3c4SAnna Dabrowska /** 1253449f9ceSAnna Dabrowska * @param string $status 126c2f8a3c4SAnna Dabrowska */ 127c2f8a3c4SAnna Dabrowska public function setStatus($status): void 128c2f8a3c4SAnna Dabrowska { 129c2f8a3c4SAnna Dabrowska $this->status = $status; 130c2f8a3c4SAnna Dabrowska } 131c2f8a3c4SAnna Dabrowska 132c2f8a3c4SAnna Dabrowska /** 1333449f9ceSAnna Dabrowska * @return string 134c2f8a3c4SAnna Dabrowska */ 135c2f8a3c4SAnna Dabrowska public function getUser() 136c2f8a3c4SAnna Dabrowska { 137c2f8a3c4SAnna Dabrowska return $this->user; 138c2f8a3c4SAnna Dabrowska } 139c2f8a3c4SAnna Dabrowska 140c2f8a3c4SAnna Dabrowska /** 1413449f9ceSAnna Dabrowska * @param string $user 142c2f8a3c4SAnna Dabrowska */ 143c2f8a3c4SAnna Dabrowska public function setUser($user): void 144c2f8a3c4SAnna Dabrowska { 145c2f8a3c4SAnna Dabrowska $this->user = $user; 146c2f8a3c4SAnna Dabrowska } 1473449f9ceSAnna Dabrowska 148e394901aSAnna Dabrowska public function getDate() 149e394901aSAnna Dabrowska { 150e394901aSAnna Dabrowska return $this->date; 151e394901aSAnna Dabrowska } 152e394901aSAnna Dabrowska 153e394901aSAnna Dabrowska public function setDate($time) 154e394901aSAnna Dabrowska { 155e394901aSAnna Dabrowska $this->date = date('Y-m-d', $time); 156e394901aSAnna Dabrowska } 157e394901aSAnna Dabrowska 1583449f9ceSAnna Dabrowska /** 1593449f9ceSAnna Dabrowska * Update publish status in the core table 1603449f9ceSAnna Dabrowska */ 161e394901aSAnna Dabrowska protected function updateCoreData($pid, $rid = 0) 1623449f9ceSAnna Dabrowska { 163e394901aSAnna Dabrowska $data = [ 164e394901aSAnna Dabrowska 'status' => $this->status, 165e394901aSAnna Dabrowska 'user' => $this->user, 166e394901aSAnna Dabrowska 'date' => $this->date, 167e394901aSAnna Dabrowska 'revision' => $this->rev, 168e394901aSAnna Dabrowska 'version' => $this->version, 169e394901aSAnna Dabrowska ]; 1703231ebaeSAnna Dabrowska $schema = new Schema('structpublish', 0); 1713231ebaeSAnna Dabrowska $access = new AccessTableStructpublish($schema, $pid, 0, $rid); 172*6a791fefSAnna Dabrowska $access->setPublished($this->published); 173e394901aSAnna Dabrowska $access->saveData($data); 174e394901aSAnna Dabrowska } 175e394901aSAnna Dabrowska 176e7259784SAnna Dabrowska public function getCoreData($andFilter = '') 177e394901aSAnna Dabrowska { 178e394901aSAnna Dabrowska $lines = [ 179e394901aSAnna Dabrowska 'schema: structpublish', 180e394901aSAnna Dabrowska 'cols: *', 181e394901aSAnna Dabrowska 'filter: %pageid% = $ID$' 182e394901aSAnna Dabrowska ]; 183e7259784SAnna Dabrowska 184e7259784SAnna Dabrowska if ($andFilter) { 185e7259784SAnna Dabrowska $lines[] = 'filter: ' . $andFilter; 186e7259784SAnna Dabrowska } 187e7259784SAnna Dabrowska 188e394901aSAnna Dabrowska $parser = new ConfigParser($lines); 189e394901aSAnna Dabrowska $config = $parser->getConfig(); 19040f4519bSAnna Dabrowska $search = new SearchConfig($config, $this->sqlite); 191e394901aSAnna Dabrowska $data = $search->execute(); 192e394901aSAnna Dabrowska if (!empty($data)) { 19351066f27SAnna Dabrowska // FIXME 194e394901aSAnna Dabrowska return $data[array_key_last($data)]; 195e394901aSAnna Dabrowska } 196e394901aSAnna Dabrowska return []; 1973449f9ceSAnna Dabrowska } 198e7259784SAnna Dabrowska 1998d2065f7SAnna Dabrowska /** 2008d2065f7SAnna Dabrowska * Get a property of the latest published revision associated with the current one 2018d2065f7SAnna Dabrowska * 2028d2065f7SAnna Dabrowska * @param string $key 2038d2065f7SAnna Dabrowska * @return string 2048d2065f7SAnna Dabrowska */ 2058d2065f7SAnna Dabrowska public function getLatestPublished($key) 206e7259784SAnna Dabrowska { 2078d2065f7SAnna Dabrowska $latestPublished = $this->getCoreData('status=' . self::STATUS_PUBLISHED); 2088d2065f7SAnna Dabrowska $data = [ 2098d2065f7SAnna Dabrowska 'status' => $latestPublished[$this->statusCol->getColref() - 1]->getRawValue(), 2108d2065f7SAnna Dabrowska 'user' => $latestPublished[$this->userCol->getColref() - 1]->getRawValue(), 2118d2065f7SAnna Dabrowska 'date' => $latestPublished[$this->dateCol->getColref() - 1]->getRawValue(), 2128d2065f7SAnna Dabrowska 'revision' => $latestPublished[$this->revisionCol->getColref() - 1]->getRawValue(), 2138d2065f7SAnna Dabrowska 'version' => $latestPublished[$this->versionCol->getColref() - 1]->getRawValue(), 2148d2065f7SAnna Dabrowska ]; 215e7259784SAnna Dabrowska 2168d2065f7SAnna Dabrowska return $data[$key] ?? ''; 217e7259784SAnna Dabrowska } 218c2f8a3c4SAnna Dabrowska} 219