115 lines
3.2 KiB
PHP
115 lines
3.2 KiB
PHP
<?php
|
|
|
|
namespace dokuwiki\Ui;
|
|
|
|
use dokuwiki\ChangeLog\ChangeLog;
|
|
|
|
/**
|
|
* DokuWiki Revisions Interface
|
|
* parent class of PageRevisions and MediaRevisions
|
|
*
|
|
* Note: navigation starts from -1, not 0. This is because our Revision management starts old revisions at 0 and
|
|
* will return the current revision only if the revisions starting at -1 are requested.
|
|
*
|
|
* @package dokuwiki\Ui
|
|
*/
|
|
abstract class Revisions extends Ui
|
|
{
|
|
/* @var string */
|
|
protected $id; // page id or media id
|
|
|
|
/* @var ChangeLog */
|
|
protected $changelog; // PageChangeLog or MediaChangeLog object
|
|
|
|
/**
|
|
* Revisions Ui constructor
|
|
*
|
|
* @param string $id page id or media id
|
|
*/
|
|
public function __construct($id)
|
|
{
|
|
$this->id = $id;
|
|
$this->setChangeLog();
|
|
}
|
|
|
|
/**
|
|
* set class property changelog
|
|
*/
|
|
abstract protected function setChangeLog();
|
|
|
|
/**
|
|
* Get revisions, and set correct pagination parameters (first, hasNext)
|
|
*
|
|
* @param int $first
|
|
* @param bool $hasNext
|
|
* @return array revisions to be shown in a paginated list
|
|
* @see also https://www.dokuwiki.org/devel:changelog
|
|
*/
|
|
protected function getRevisions(&$first, &$hasNext)
|
|
{
|
|
global $conf;
|
|
|
|
$changelog =& $this->changelog;
|
|
$revisions = [];
|
|
|
|
$currentRevInfo = $changelog->getCurrentRevisionInfo();
|
|
if (!$currentRevInfo) return $revisions;
|
|
|
|
$num = $conf['recent'];
|
|
|
|
/* we need to get one additional log entry to be able to
|
|
* decide if this is the last page or is there another one.
|
|
* see also Ui\Recent::getRecents()
|
|
*/
|
|
$revlist = $changelog->getRevisions($first, $num + 1);
|
|
if (count($revlist) == 0 && $first > -1) {
|
|
// resets to zero if $first requested a too high number
|
|
$first = -1;
|
|
return $this->getRevisions($first, $hasNext);
|
|
}
|
|
|
|
// decide if this is the last page or is there another one
|
|
$hasNext = false;
|
|
if (count($revlist) > $num) {
|
|
$hasNext = true;
|
|
array_pop($revlist); // remove one additional log entry
|
|
}
|
|
|
|
// append each revision info array to the revisions
|
|
foreach ($revlist as $rev) {
|
|
$revisions[] = $changelog->getRevisionInfo($rev);
|
|
}
|
|
return $revisions;
|
|
}
|
|
|
|
/**
|
|
* Navigation buttons for Pagination (prev/next)
|
|
*
|
|
* @param int $first
|
|
* @param bool $hasNext
|
|
* @param callable $callback returns array of hidden fields for the form button
|
|
* @return string html
|
|
*/
|
|
protected function navigation($first, $hasNext, $callback)
|
|
{
|
|
global $conf;
|
|
|
|
$html = '<div class="pagenav">';
|
|
$last = $first + $conf['recent'];
|
|
if ($first > -1) {
|
|
$first = max($first - $conf['recent'], -1);
|
|
$html .= '<div class="pagenav-prev">';
|
|
$html .= html_btn('newer', $this->id, "p", $callback($first));
|
|
$html .= '</div>';
|
|
}
|
|
if ($hasNext) {
|
|
$html .= '<div class="pagenav-next">';
|
|
$html .= html_btn('older', $this->id, "n", $callback($last));
|
|
$html .= '</div>';
|
|
}
|
|
$html .= '</div>';
|
|
return $html;
|
|
}
|
|
|
|
}
|