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 * 11*a46cc3dcSAndreas Gohr * Note: navigation starts from -1, not 0. This is because our Revision management starts old revisions at 0 and 12*a46cc3dcSAndreas Gohr * will return the current revision only if the revisions starting at -1 are requested. 13*a46cc3dcSAndreas Gohr * 146c9fde82SSatoshi Sahara * @package dokuwiki\Ui 156c9fde82SSatoshi Sahara */ 16ae5d2354SSatoshi Saharaabstract class Revisions extends Ui 176c9fde82SSatoshi Sahara{ 18ae5d2354SSatoshi Sahara /* @var string */ 19e71e09a6SSatoshi Sahara protected $id; // page id or media id 20e71e09a6SSatoshi Sahara 21e71e09a6SSatoshi Sahara /* @var ChangeLog */ 22e71e09a6SSatoshi Sahara protected $changelog; // PageChangeLog or MediaChangeLog object 239e316641SSatoshi Sahara 249e316641SSatoshi Sahara /** 259e316641SSatoshi Sahara * Revisions Ui constructor 269e316641SSatoshi Sahara * 27e71e09a6SSatoshi Sahara * @param string $id page id or media id 289e316641SSatoshi Sahara */ 29ae5d2354SSatoshi Sahara public function __construct($id) 309e316641SSatoshi Sahara { 31ae5d2354SSatoshi Sahara $this->id = $id; 32e71e09a6SSatoshi Sahara $this->setChangeLog(); 33e71e09a6SSatoshi Sahara } 34e71e09a6SSatoshi Sahara 35e71e09a6SSatoshi Sahara /** 36e71e09a6SSatoshi Sahara * set class property changelog 37e71e09a6SSatoshi Sahara */ 38e71e09a6SSatoshi Sahara abstract protected function setChangeLog(); 39e71e09a6SSatoshi Sahara 40e71e09a6SSatoshi Sahara /** 41ad088cbcSSatoshi Sahara * Get revisions, and set correct pagination parameters (first, hasNext) 4267ef3e88SSatoshi Sahara * 4367ef3e88SSatoshi Sahara * @param int $first 4467ef3e88SSatoshi Sahara * @param bool $hasNext 45eeda7adaSGerrit Uitslag * @return array revisions to be shown in a paginated list 465525369fSSatoshi Sahara * @see also https://www.dokuwiki.org/devel:changelog 4767ef3e88SSatoshi Sahara */ 48e71e09a6SSatoshi Sahara protected function getRevisions(&$first, &$hasNext) 49e71e09a6SSatoshi Sahara { 50e71e09a6SSatoshi Sahara global $conf; 51e71e09a6SSatoshi Sahara 52e71e09a6SSatoshi Sahara $changelog =& $this->changelog; 5390c7493eSSatoshi Sahara $revisions = []; 54e71e09a6SSatoshi Sahara 55ad088cbcSSatoshi Sahara $currentRevInfo = $changelog->getCurrentRevisionInfo(); 56ad088cbcSSatoshi Sahara if (!$currentRevInfo) return $revisions; 57e71e09a6SSatoshi Sahara 5890c7493eSSatoshi Sahara $num = $conf['recent']; 59*a46cc3dcSAndreas Gohr 60ad088cbcSSatoshi Sahara /* we need to get one additional log entry to be able to 61ad088cbcSSatoshi Sahara * decide if this is the last page or is there another one. 62ad088cbcSSatoshi Sahara * see also Ui\Recent::getRecents() 63ad088cbcSSatoshi Sahara */ 64ad088cbcSSatoshi Sahara $revlist = $changelog->getRevisions($first, $num + 1); 65*a46cc3dcSAndreas Gohr if (count($revlist) == 0 && $first > -1) { 66ad088cbcSSatoshi Sahara // resets to zero if $first requested a too high number 67*a46cc3dcSAndreas Gohr $first = -1; 68ad088cbcSSatoshi Sahara return $this->getRevisions($first, $hasNext); 69e71e09a6SSatoshi Sahara } 70e71e09a6SSatoshi Sahara 71e71e09a6SSatoshi Sahara // decide if this is the last page or is there another one 72e71e09a6SSatoshi Sahara $hasNext = false; 7390c7493eSSatoshi Sahara if (count($revlist) > $num) { 74e71e09a6SSatoshi Sahara $hasNext = true; 75e71e09a6SSatoshi Sahara array_pop($revlist); // remove one additional log entry 76e71e09a6SSatoshi Sahara } 77e71e09a6SSatoshi Sahara 78eeda7adaSGerrit Uitslag // append each revision info array to the revisions 79e71e09a6SSatoshi Sahara foreach ($revlist as $rev) { 80ad088cbcSSatoshi Sahara $revisions[] = $changelog->getRevisionInfo($rev); 81e71e09a6SSatoshi Sahara } 82e71e09a6SSatoshi Sahara return $revisions; 83e71e09a6SSatoshi Sahara } 8467ef3e88SSatoshi Sahara 8567ef3e88SSatoshi Sahara /** 86eeda7adaSGerrit Uitslag * Navigation buttons for Pagination (prev/next) 8767ef3e88SSatoshi Sahara * 8867ef3e88SSatoshi Sahara * @param int $first 8967ef3e88SSatoshi Sahara * @param bool $hasNext 90ae5d2354SSatoshi Sahara * @param callable $callback returns array of hidden fields for the form button 9190c7493eSSatoshi Sahara * @return string html 9267ef3e88SSatoshi Sahara */ 93ae5d2354SSatoshi Sahara protected function navigation($first, $hasNext, $callback) 9467ef3e88SSatoshi Sahara { 9567ef3e88SSatoshi Sahara global $conf; 9667ef3e88SSatoshi Sahara 9767ef3e88SSatoshi Sahara $html = '<div class="pagenav">'; 986c9fde82SSatoshi Sahara $last = $first + $conf['recent']; 99*a46cc3dcSAndreas Gohr if ($first > -1) { 100*a46cc3dcSAndreas Gohr $first = max($first - $conf['recent'], -1); 10167ef3e88SSatoshi Sahara $html .= '<div class="pagenav-prev">'; 102ae5d2354SSatoshi Sahara $html .= html_btn('newer', $this->id, "p", $callback($first)); 10367ef3e88SSatoshi Sahara $html .= '</div>'; 1046c9fde82SSatoshi Sahara } 1056c9fde82SSatoshi Sahara if ($hasNext) { 10667ef3e88SSatoshi Sahara $html .= '<div class="pagenav-next">'; 107ae5d2354SSatoshi Sahara $html .= html_btn('older', $this->id, "n", $callback($last)); 10867ef3e88SSatoshi Sahara $html .= '</div>'; 1096c9fde82SSatoshi Sahara } 11067ef3e88SSatoshi Sahara $html .= '</div>'; 11167ef3e88SSatoshi Sahara return $html; 11267ef3e88SSatoshi Sahara } 1136c9fde82SSatoshi Sahara} 114