16c9fde82SSatoshi Sahara<?php 26c9fde82SSatoshi Sahara 36c9fde82SSatoshi Saharanamespace dokuwiki\Ui; 46c9fde82SSatoshi Sahara 590c7493eSSatoshi Saharause dokuwiki\ChangeLog\ChangeLog; 690c7493eSSatoshi Sahara 76c9fde82SSatoshi Sahara/** 89e316641SSatoshi Sahara * DokuWiki Revisions Interface 9ae5d2354SSatoshi Sahara * parent class of PageRevisions and MediaRevisions 106c9fde82SSatoshi Sahara * 116c9fde82SSatoshi Sahara * @package dokuwiki\Ui 126c9fde82SSatoshi Sahara */ 13ae5d2354SSatoshi Saharaabstract class Revisions extends Ui 146c9fde82SSatoshi Sahara{ 15ae5d2354SSatoshi Sahara /* @var string */ 16e71e09a6SSatoshi Sahara protected $id; // page id or media id 17e71e09a6SSatoshi Sahara 18e71e09a6SSatoshi Sahara /* @var ChangeLog */ 19e71e09a6SSatoshi Sahara protected $changelog; // PageChangeLog or MediaChangeLog object 209e316641SSatoshi Sahara 219e316641SSatoshi Sahara /** 229e316641SSatoshi Sahara * Revisions Ui constructor 239e316641SSatoshi Sahara * 24e71e09a6SSatoshi Sahara * @param string $id page id or media id 259e316641SSatoshi Sahara */ 26ae5d2354SSatoshi Sahara public function __construct($id) 279e316641SSatoshi Sahara { 28ae5d2354SSatoshi Sahara $this->id = $id; 29e71e09a6SSatoshi Sahara $this->setChangeLog(); 30e71e09a6SSatoshi Sahara } 31e71e09a6SSatoshi Sahara 32e71e09a6SSatoshi Sahara /** 33e71e09a6SSatoshi Sahara * set class property changelog 34e71e09a6SSatoshi Sahara */ 35e71e09a6SSatoshi Sahara abstract protected function setChangeLog(); 36e71e09a6SSatoshi Sahara 37e71e09a6SSatoshi Sahara /** 38ad088cbcSSatoshi Sahara * Get revisions, and set correct pagination parameters (first, hasNext) 3967ef3e88SSatoshi Sahara * 4067ef3e88SSatoshi Sahara * @param int $first 4167ef3e88SSatoshi Sahara * @param bool $hasNext 42*eeda7adaSGerrit Uitslag * @return array revisions to be shown in a paginated list 435525369fSSatoshi Sahara * @see also https://www.dokuwiki.org/devel:changelog 4467ef3e88SSatoshi Sahara */ 45e71e09a6SSatoshi Sahara protected function getRevisions(&$first, &$hasNext) 46e71e09a6SSatoshi Sahara { 47e71e09a6SSatoshi Sahara global $conf; 48e71e09a6SSatoshi Sahara 49e71e09a6SSatoshi Sahara $changelog =& $this->changelog; 5090c7493eSSatoshi Sahara $revisions = []; 51e71e09a6SSatoshi Sahara 52ad088cbcSSatoshi Sahara $currentRevInfo = $changelog->getCurrentRevisionInfo(); 53ad088cbcSSatoshi Sahara if (!$currentRevInfo) return $revisions; 54e71e09a6SSatoshi Sahara 5590c7493eSSatoshi Sahara $num = $conf['recent']; 5690c7493eSSatoshi Sahara if ($first == 0) { 57*eeda7adaSGerrit Uitslag // add external or existing last revision that is excluded from $changelog->getRevisions() 58dbf582ddSSatoshi Sahara if (array_key_exists('timestamp', $currentRevInfo) || ( 59dbf582ddSSatoshi Sahara $currentRevInfo['type'] != DOKU_CHANGE_TYPE_DELETE && 60dbf582ddSSatoshi Sahara $currentRevInfo['date'] == $changelog->lastRevision() ) 61dbf582ddSSatoshi Sahara ) { 62ad088cbcSSatoshi Sahara $revisions[] = $currentRevInfo; 63ad088cbcSSatoshi Sahara $num = $num - 1; 6490c7493eSSatoshi Sahara } 65dbf582ddSSatoshi Sahara } 66ad088cbcSSatoshi Sahara /* we need to get one additional log entry to be able to 67ad088cbcSSatoshi Sahara * decide if this is the last page or is there another one. 68ad088cbcSSatoshi Sahara * see also Ui\Recent::getRecents() 69ad088cbcSSatoshi Sahara */ 70ad088cbcSSatoshi Sahara $revlist = $changelog->getRevisions($first, $num + 1); 71ad088cbcSSatoshi Sahara if (count($revlist) == 0 && $first > 0) { 72ad088cbcSSatoshi Sahara // resets to zero if $first requested a too high number 73e71e09a6SSatoshi Sahara $first = 0; 74ad088cbcSSatoshi Sahara return $this->getRevisions($first, $hasNext); 75e71e09a6SSatoshi Sahara } 76e71e09a6SSatoshi Sahara 77e71e09a6SSatoshi Sahara // decide if this is the last page or is there another one 78e71e09a6SSatoshi Sahara $hasNext = false; 7990c7493eSSatoshi Sahara if (count($revlist) > $num) { 80e71e09a6SSatoshi Sahara $hasNext = true; 81e71e09a6SSatoshi Sahara array_pop($revlist); // remove one additional log entry 82e71e09a6SSatoshi Sahara } 83e71e09a6SSatoshi Sahara 84*eeda7adaSGerrit Uitslag // append each revision info array to the revisions 85e71e09a6SSatoshi Sahara foreach ($revlist as $rev) { 86ad088cbcSSatoshi Sahara $revisions[] = $changelog->getRevisionInfo($rev); 87e71e09a6SSatoshi Sahara } 88e71e09a6SSatoshi Sahara return $revisions; 89e71e09a6SSatoshi Sahara } 9067ef3e88SSatoshi Sahara 9167ef3e88SSatoshi Sahara /** 92*eeda7adaSGerrit Uitslag * Navigation buttons for Pagination (prev/next) 9367ef3e88SSatoshi Sahara * 9467ef3e88SSatoshi Sahara * @param int $first 9567ef3e88SSatoshi Sahara * @param bool $hasNext 96ae5d2354SSatoshi Sahara * @param callable $callback returns array of hidden fields for the form button 9790c7493eSSatoshi Sahara * @return string html 9867ef3e88SSatoshi Sahara */ 99ae5d2354SSatoshi Sahara protected function navigation($first, $hasNext, $callback) 10067ef3e88SSatoshi Sahara { 10167ef3e88SSatoshi Sahara global $conf; 10267ef3e88SSatoshi Sahara 10367ef3e88SSatoshi Sahara $html = '<div class="pagenav">'; 1046c9fde82SSatoshi Sahara $last = $first + $conf['recent']; 1056c9fde82SSatoshi Sahara if ($first > 0) { 10667ef3e88SSatoshi Sahara $first = max($first - $conf['recent'], 0); 10767ef3e88SSatoshi Sahara $html.= '<div class="pagenav-prev">'; 108ae5d2354SSatoshi Sahara $html.= html_btn('newer', $this->id, "p", $callback($first)); 10967ef3e88SSatoshi Sahara $html.= '</div>'; 1106c9fde82SSatoshi Sahara } 1116c9fde82SSatoshi Sahara if ($hasNext) { 11267ef3e88SSatoshi Sahara $html.= '<div class="pagenav-next">'; 113ae5d2354SSatoshi Sahara $html.= html_btn('older', $this->id, "n", $callback($last)); 11467ef3e88SSatoshi Sahara $html.= '</div>'; 1156c9fde82SSatoshi Sahara } 11667ef3e88SSatoshi Sahara $html.= '</div>'; 11767ef3e88SSatoshi Sahara return $html; 11867ef3e88SSatoshi Sahara } 1196c9fde82SSatoshi Sahara 1206c9fde82SSatoshi Sahara} 121