[ Index ]

PHP Cross Reference of DokuWiki

title

Body

[close]

/inc/Ui/ -> Revisions.php (source)

   1  <?php
   2  
   3  namespace dokuwiki\Ui;
   4  
   5  use dokuwiki\ChangeLog\ChangeLog;
   6  
   7  /**
   8   * DokuWiki Revisions Interface
   9   * parent class of PageRevisions and MediaRevisions
  10   *
  11   * Note: navigation starts from -1, not 0. This is because our Revision management starts old revisions at 0 and
  12   * will return the current revision only if the revisions starting at -1 are requested.
  13   *
  14   * @package dokuwiki\Ui
  15   */
  16  abstract class Revisions extends Ui
  17  {
  18      /* @var string */
  19      protected $id;   // page id or media id
  20  
  21      /* @var ChangeLog */
  22      protected $changelog; // PageChangeLog or MediaChangeLog object
  23  
  24      /**
  25       * Revisions Ui constructor
  26       *
  27       * @param string $id page id or media id
  28       */
  29      public function __construct($id)
  30      {
  31          $this->id = $id;
  32          $this->setChangeLog();
  33      }
  34  
  35      /**
  36       * set class property changelog
  37       */
  38      abstract protected function setChangeLog();
  39  
  40      /**
  41       * Get revisions, and set correct pagination parameters (first, hasNext)
  42       *
  43       * @param int $first
  44       * @param bool $hasNext
  45       * @return array  revisions to be shown in a paginated list
  46       * @see also https://www.dokuwiki.org/devel:changelog
  47       */
  48      protected function getRevisions(&$first, &$hasNext)
  49      {
  50          global $conf;
  51  
  52          $changelog =& $this->changelog;
  53          $revisions = [];
  54  
  55          $currentRevInfo = $changelog->getCurrentRevisionInfo();
  56          if (!$currentRevInfo) return $revisions;
  57  
  58          $num = $conf['recent'];
  59  
  60          /* we need to get one additional log entry to be able to
  61           * decide if this is the last page or is there another one.
  62           * see also Ui\Recent::getRecents()
  63           */
  64          $revlist = $changelog->getRevisions($first, $num + 1);
  65          if (count($revlist) == 0 && $first > -1) {
  66              // resets to zero if $first requested a too high number
  67              $first = -1;
  68              return $this->getRevisions($first, $hasNext);
  69          }
  70  
  71          // decide if this is the last page or is there another one
  72          $hasNext = false;
  73          if (count($revlist) > $num) {
  74              $hasNext = true;
  75              array_pop($revlist); // remove one additional log entry
  76          }
  77  
  78          // append each revision info array to the revisions
  79          foreach ($revlist as $rev) {
  80              $revisions[] = $changelog->getRevisionInfo($rev);
  81          }
  82          return $revisions;
  83      }
  84  
  85      /**
  86       * Navigation buttons for Pagination (prev/next)
  87       *
  88       * @param int $first
  89       * @param bool $hasNext
  90       * @param callable $callback returns array of hidden fields for the form button
  91       * @return string html
  92       */
  93      protected function navigation($first, $hasNext, $callback)
  94      {
  95          global $conf;
  96  
  97          $html = '<div class="pagenav">';
  98          $last = $first + $conf['recent'];
  99          if ($first > -1) {
 100              $first = max($first - $conf['recent'], -1);
 101              $html .= '<div class="pagenav-prev">';
 102              $html .= html_btn('newer', $this->id, "p", $callback($first));
 103              $html .= '</div>';
 104          }
 105          if ($hasNext) {
 106              $html .= '<div class="pagenav-next">';
 107              $html .= html_btn('older', $this->id, "n", $callback($last));
 108              $html .= '</div>';
 109          }
 110          $html .= '</div>';
 111          return $html;
 112      }
 113  }