xref: /dokuwiki/inc/Ui/Revisions.php (revision 8c7c53b0321a3cd3116b8d3b2ad27863a38dece7)
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