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; 23e394901aSAnna Dabrowska protected $date; 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; 30e7259784SAnna Dabrowska protected $dateCol; 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; 44c2f8a3c4SAnna Dabrowska 45e7259784SAnna Dabrowska $this->schema = new Schema('structpublish'); 46e7259784SAnna Dabrowska $this->statusCol = $this->schema->findColumn('status'); 47e7259784SAnna Dabrowska $this->versionCol = $this->schema->findColumn('version'); 48e7259784SAnna Dabrowska $this->userCol = $this->schema->findColumn('user'); 49e7259784SAnna Dabrowska $this->dateCol = $this->schema->findColumn('date'); 50e7259784SAnna Dabrowska $this->revisionCol = $this->schema->findColumn('revision'); 513449f9ceSAnna Dabrowska 52e394901aSAnna Dabrowska /** @var Value[] $values */ 5351066f27SAnna Dabrowska $values = $this->getCoreData('revision=' . $this->rev); 54e394901aSAnna Dabrowska 55e394901aSAnna Dabrowska if (!empty($values)) { 56e7259784SAnna Dabrowska $this->status = $values[$this->statusCol->getColref() - 1]->getRawValue(); 57e7259784SAnna Dabrowska $this->version = $values[$this->versionCol->getColref() - 1]->getRawValue(); 58e7259784SAnna Dabrowska $this->user = $values[$this->userCol->getColref() - 1]->getRawValue(); 59e7259784SAnna Dabrowska $this->date = $values[$this->dateCol->getColref() - 1]->getRawValue(); 603449f9ceSAnna Dabrowska } 61c2f8a3c4SAnna Dabrowska } 62c2f8a3c4SAnna Dabrowska 63c2f8a3c4SAnna Dabrowska public function save() 64c2f8a3c4SAnna Dabrowska { 65e394901aSAnna Dabrowska // drafts reference the latest version 66*e31c94d7SAndreas Gohr if ($this->status === Constants::STATUS_DRAFT) { 67e394901aSAnna Dabrowska //FIXME no rev yet 68e394901aSAnna Dabrowska $this->setVersion($this->getVersion()); 69e394901aSAnna Dabrowska } 70e394901aSAnna Dabrowska 71*e31c94d7SAndreas Gohr if ($this->status === Constants::STATUS_PUBLISHED) { 726a791fefSAnna Dabrowska $this->published = 1; 736a791fefSAnna Dabrowska } 743449f9ceSAnna Dabrowska 75e394901aSAnna Dabrowska $this->updateCoreData($this->id); 766a791fefSAnna Dabrowska // TODO reset publish status of older revisions 776a791fefSAnna Dabrowska 78c2f8a3c4SAnna Dabrowska } 79c2f8a3c4SAnna Dabrowska 80c2f8a3c4SAnna Dabrowska /** 813449f9ceSAnna Dabrowska * @return int 82c2f8a3c4SAnna Dabrowska */ 83c2f8a3c4SAnna Dabrowska public function getVersion() 84c2f8a3c4SAnna Dabrowska { 853231ebaeSAnna Dabrowska return (int)$this->version; 86c2f8a3c4SAnna Dabrowska } 87c2f8a3c4SAnna Dabrowska 88c2f8a3c4SAnna Dabrowska /** 893449f9ceSAnna Dabrowska * @param int $version 90c2f8a3c4SAnna Dabrowska */ 91c2f8a3c4SAnna Dabrowska public function setVersion($version): void 92c2f8a3c4SAnna Dabrowska { 93c2f8a3c4SAnna Dabrowska $this->version = $version; 94c2f8a3c4SAnna Dabrowska } 95c2f8a3c4SAnna Dabrowska 96c2f8a3c4SAnna Dabrowska /** 973449f9ceSAnna Dabrowska * @return int 98c2f8a3c4SAnna Dabrowska */ 99c2f8a3c4SAnna Dabrowska public function getRev() 100c2f8a3c4SAnna Dabrowska { 101c2f8a3c4SAnna Dabrowska return $this->rev; 102c2f8a3c4SAnna Dabrowska } 103c2f8a3c4SAnna Dabrowska 104c2f8a3c4SAnna Dabrowska /** 1053449f9ceSAnna Dabrowska * @param int $rev 106c2f8a3c4SAnna Dabrowska */ 107c2f8a3c4SAnna Dabrowska public function setRev($rev): void 108c2f8a3c4SAnna Dabrowska { 109c2f8a3c4SAnna Dabrowska $this->rev = $rev; 110c2f8a3c4SAnna Dabrowska } 111c2f8a3c4SAnna Dabrowska 112c2f8a3c4SAnna Dabrowska /** 1133449f9ceSAnna Dabrowska * @return string 114c2f8a3c4SAnna Dabrowska */ 115c2f8a3c4SAnna Dabrowska public function getStatus() 116c2f8a3c4SAnna Dabrowska { 117e394901aSAnna Dabrowska return $this->status; 118c2f8a3c4SAnna Dabrowska } 119c2f8a3c4SAnna Dabrowska 120c2f8a3c4SAnna Dabrowska /** 1213449f9ceSAnna Dabrowska * @param string $status 122c2f8a3c4SAnna Dabrowska */ 123c2f8a3c4SAnna Dabrowska public function setStatus($status): void 124c2f8a3c4SAnna Dabrowska { 125c2f8a3c4SAnna Dabrowska $this->status = $status; 126c2f8a3c4SAnna Dabrowska } 127c2f8a3c4SAnna Dabrowska 128c2f8a3c4SAnna Dabrowska /** 1293449f9ceSAnna Dabrowska * @return string 130c2f8a3c4SAnna Dabrowska */ 131c2f8a3c4SAnna Dabrowska public function getUser() 132c2f8a3c4SAnna Dabrowska { 133c2f8a3c4SAnna Dabrowska return $this->user; 134c2f8a3c4SAnna Dabrowska } 135c2f8a3c4SAnna Dabrowska 136c2f8a3c4SAnna Dabrowska /** 1373449f9ceSAnna Dabrowska * @param string $user 138c2f8a3c4SAnna Dabrowska */ 139c2f8a3c4SAnna Dabrowska public function setUser($user): void 140c2f8a3c4SAnna Dabrowska { 141c2f8a3c4SAnna Dabrowska $this->user = $user; 142c2f8a3c4SAnna Dabrowska } 1433449f9ceSAnna Dabrowska 144e394901aSAnna Dabrowska public function getDate() 145e394901aSAnna Dabrowska { 146e394901aSAnna Dabrowska return $this->date; 147e394901aSAnna Dabrowska } 148e394901aSAnna Dabrowska 149e394901aSAnna Dabrowska public function setDate($time) 150e394901aSAnna Dabrowska { 151e394901aSAnna Dabrowska $this->date = date('Y-m-d', $time); 152e394901aSAnna Dabrowska } 153e394901aSAnna Dabrowska 1543449f9ceSAnna Dabrowska /** 1553449f9ceSAnna Dabrowska * Update publish status in the core table 1563449f9ceSAnna Dabrowska */ 157e394901aSAnna Dabrowska protected function updateCoreData($pid, $rid = 0) 1583449f9ceSAnna Dabrowska { 159e394901aSAnna Dabrowska $data = [ 160e394901aSAnna Dabrowska 'status' => $this->status, 161e394901aSAnna Dabrowska 'user' => $this->user, 162e394901aSAnna Dabrowska 'date' => $this->date, 163e394901aSAnna Dabrowska 'revision' => $this->rev, 164e394901aSAnna Dabrowska 'version' => $this->version, 165e394901aSAnna Dabrowska ]; 1663231ebaeSAnna Dabrowska $schema = new Schema('structpublish', 0); 1673231ebaeSAnna Dabrowska $access = new AccessTableStructpublish($schema, $pid, 0, $rid); 1686a791fefSAnna Dabrowska $access->setPublished($this->published); 169e394901aSAnna Dabrowska $access->saveData($data); 170e394901aSAnna Dabrowska } 171e394901aSAnna Dabrowska 172e7259784SAnna Dabrowska public function getCoreData($andFilter = '') 173e394901aSAnna Dabrowska { 174e394901aSAnna Dabrowska $lines = [ 175e394901aSAnna Dabrowska 'schema: structpublish', 176e394901aSAnna Dabrowska 'cols: *', 177e394901aSAnna Dabrowska 'filter: %pageid% = $ID$' 178e394901aSAnna Dabrowska ]; 179e7259784SAnna Dabrowska 180e7259784SAnna Dabrowska if ($andFilter) { 181e7259784SAnna Dabrowska $lines[] = 'filter: ' . $andFilter; 182e7259784SAnna Dabrowska } 183e7259784SAnna Dabrowska 184e394901aSAnna Dabrowska $parser = new ConfigParser($lines); 185e394901aSAnna Dabrowska $config = $parser->getConfig(); 18640f4519bSAnna Dabrowska $search = new SearchConfig($config, $this->sqlite); 187e394901aSAnna Dabrowska $data = $search->execute(); 188e394901aSAnna Dabrowska if (!empty($data)) { 18951066f27SAnna Dabrowska // FIXME 190e394901aSAnna Dabrowska return $data[array_key_last($data)]; 191e394901aSAnna Dabrowska } 192e394901aSAnna Dabrowska return []; 1933449f9ceSAnna Dabrowska } 194e7259784SAnna Dabrowska 1958d2065f7SAnna Dabrowska /** 1968d2065f7SAnna Dabrowska * Get a property of the latest published revision associated with the current one 1978d2065f7SAnna Dabrowska * 1988d2065f7SAnna Dabrowska * @param string $key 1998d2065f7SAnna Dabrowska * @return string 2008d2065f7SAnna Dabrowska */ 2018d2065f7SAnna Dabrowska public function getLatestPublished($key) 202e7259784SAnna Dabrowska { 203*e31c94d7SAndreas Gohr $latestPublished = $this->getCoreData('status=' . Constants::STATUS_PUBLISHED); 204d00ea115SAnna Dabrowska if (!$latestPublished) return ''; 205d00ea115SAnna Dabrowska 2068d2065f7SAnna Dabrowska $data = [ 2078d2065f7SAnna Dabrowska 'status' => $latestPublished[$this->statusCol->getColref() - 1]->getRawValue(), 2088d2065f7SAnna Dabrowska 'user' => $latestPublished[$this->userCol->getColref() - 1]->getRawValue(), 2098d2065f7SAnna Dabrowska 'date' => $latestPublished[$this->dateCol->getColref() - 1]->getRawValue(), 2108d2065f7SAnna Dabrowska 'revision' => $latestPublished[$this->revisionCol->getColref() - 1]->getRawValue(), 2118d2065f7SAnna Dabrowska 'version' => $latestPublished[$this->versionCol->getColref() - 1]->getRawValue(), 2128d2065f7SAnna Dabrowska ]; 213e7259784SAnna Dabrowska 2148d2065f7SAnna Dabrowska return $data[$key] ?? ''; 215e7259784SAnna Dabrowska } 216c2f8a3c4SAnna Dabrowska} 217