1b370ebcdSSatoshi Sahara<?php 2b370ebcdSSatoshi Sahara 3b370ebcdSSatoshi Saharanamespace dokuwiki\Ui; 4b370ebcdSSatoshi Sahara 5b370ebcdSSatoshi Saharause dokuwiki\ChangeLog\PageChangeLog; 6b370ebcdSSatoshi Saharause dokuwiki\Form\Form; 7b370ebcdSSatoshi Sahara 8b370ebcdSSatoshi Sahara/** 9b370ebcdSSatoshi Sahara * DokuWiki PageRevisions Interface 10b370ebcdSSatoshi Sahara * 11b370ebcdSSatoshi Sahara * @package dokuwiki\Ui 12b370ebcdSSatoshi Sahara */ 13ae5d2354SSatoshi Saharaclass PageRevisions extends Revisions 14b370ebcdSSatoshi Sahara{ 15b370ebcdSSatoshi Sahara /** 16b370ebcdSSatoshi Sahara * PageRevisions Ui constructor 17b370ebcdSSatoshi Sahara * 18b370ebcdSSatoshi Sahara * @param string $id id of page 19b370ebcdSSatoshi Sahara */ 20b370ebcdSSatoshi Sahara public function __construct($id) 21b370ebcdSSatoshi Sahara { 22*3244a325SSatoshi Sahara global $INFO; 23b370ebcdSSatoshi Sahara if (!$id) $id = $INFO['id']; 24ae5d2354SSatoshi Sahara parent::__construct($id); 25b370ebcdSSatoshi Sahara } 26b370ebcdSSatoshi Sahara 27b370ebcdSSatoshi Sahara /** 28b370ebcdSSatoshi Sahara * Display list of old revisions of the page 29b370ebcdSSatoshi Sahara * 30b370ebcdSSatoshi Sahara * @author Andreas Gohr <andi@splitbrain.org> 31b370ebcdSSatoshi Sahara * @author Ben Coburn <btcoburn@silicodon.net> 32b370ebcdSSatoshi Sahara * @author Kate Arzamastseva <pshns@ukr.net> 33b370ebcdSSatoshi Sahara * @author Satoshi Sahara <sahara.satoshi@gmail.com> 34b370ebcdSSatoshi Sahara * 35b370ebcdSSatoshi Sahara * @param int $first skip the first n changelog lines 36b370ebcdSSatoshi Sahara * @return void 37b370ebcdSSatoshi Sahara */ 38b370ebcdSSatoshi Sahara public function show($first = 0) 39b370ebcdSSatoshi Sahara { 403c18288cSSatoshi Sahara global $lang, $REV; 41b370ebcdSSatoshi Sahara 42b370ebcdSSatoshi Sahara // get revisions, and set correct pagenation parameters (first, hasNext) 43b370ebcdSSatoshi Sahara if ($first === null) $first = 0; 44b370ebcdSSatoshi Sahara $hasNext = false; 45b370ebcdSSatoshi Sahara $revisions = $this->getRevisions($first, $hasNext); 46b370ebcdSSatoshi Sahara 47b370ebcdSSatoshi Sahara // print intro 48b370ebcdSSatoshi Sahara print p_locale_xhtml('revisions'); 49b370ebcdSSatoshi Sahara 50b370ebcdSSatoshi Sahara // create the form 51b370ebcdSSatoshi Sahara $form = new Form([ 52b370ebcdSSatoshi Sahara 'id' => 'page__revisions', 53b370ebcdSSatoshi Sahara 'class' => 'changes', 54b370ebcdSSatoshi Sahara ]); 55b370ebcdSSatoshi Sahara $form->addTagOpen('div')->addClass('no'); 56b370ebcdSSatoshi Sahara 57b370ebcdSSatoshi Sahara // start listing 58b370ebcdSSatoshi Sahara $form->addTagOpen('ul'); 59b370ebcdSSatoshi Sahara foreach ($revisions as $info) { 60b370ebcdSSatoshi Sahara $rev = $info['date']; 61b370ebcdSSatoshi Sahara $class = ($info['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor' : ''; 62b370ebcdSSatoshi Sahara $form->addTagOpen('li')->addClass($class); 63b370ebcdSSatoshi Sahara $form->addTagOpen('div')->addClass('li'); 64b370ebcdSSatoshi Sahara 653c18288cSSatoshi Sahara if (isset($info['current'])) { 663c18288cSSatoshi Sahara $form->addCheckbox('rev2[]')->val('current'); 673c18288cSSatoshi Sahara } elseif ($rev == $REV) { 683c18288cSSatoshi Sahara $form->addCheckbox('rev2[]')->val($rev)->attr('checked','checked'); 693c18288cSSatoshi Sahara } elseif (page_exists($this->id, $rev)) { 70b370ebcdSSatoshi Sahara $form->addCheckbox('rev2[]')->val($rev); 71b370ebcdSSatoshi Sahara } else { 72b370ebcdSSatoshi Sahara $form->addCheckbox('')->val($rev)->attr('disabled','disabled'); 73b370ebcdSSatoshi Sahara } 74b370ebcdSSatoshi Sahara $form->addHTML(' '); 75b370ebcdSSatoshi Sahara 76b370ebcdSSatoshi Sahara $objRevInfo = $this->getObjRevInfo($info); 77b370ebcdSSatoshi Sahara $html = implode(' ', [ 78b370ebcdSSatoshi Sahara $objRevInfo->editDate(), // edit date and time 79b370ebcdSSatoshi Sahara $objRevInfo->difflink(), // link to diffview icon 80b370ebcdSSatoshi Sahara $objRevInfo->itemName(), // name of page or media 81b370ebcdSSatoshi Sahara $objRevInfo->editSummary(), // edit summary 82b370ebcdSSatoshi Sahara $objRevInfo->editor(), // editor info 83b370ebcdSSatoshi Sahara $objRevInfo->sizechange(), // size change indicator 84b370ebcdSSatoshi Sahara $objRevInfo->currentIndicator(), // current indicator (only when k=1) 85b370ebcdSSatoshi Sahara ]); 86b370ebcdSSatoshi Sahara $form->addHTML($html); 87b370ebcdSSatoshi Sahara $form->addTagClose('div'); 88b370ebcdSSatoshi Sahara $form->addTagClose('li'); 89b370ebcdSSatoshi Sahara } 90b370ebcdSSatoshi Sahara $form->addTagClose('ul'); // end of revision list 91b370ebcdSSatoshi Sahara 92b370ebcdSSatoshi Sahara // show button for diff view 93b370ebcdSSatoshi Sahara $form->addButton('do[diff]', $lang['diff2'])->attr('type', 'submit'); 94b370ebcdSSatoshi Sahara 95b370ebcdSSatoshi Sahara $form->addTagClose('div'); // close div class=no 96b370ebcdSSatoshi Sahara 97b370ebcdSSatoshi Sahara print $form->toHTML('Revisions'); 98b370ebcdSSatoshi Sahara 99b370ebcdSSatoshi Sahara // provide navigation for pagenated revision list (of pages and/or media files) 100ae5d2354SSatoshi Sahara print $this->navigation($first, $hasNext, function ($n) { 101ae5d2354SSatoshi Sahara return array('do' => 'revisions', 'first' => $n); 102ae5d2354SSatoshi Sahara }); 103b370ebcdSSatoshi Sahara } 104b370ebcdSSatoshi Sahara 105b370ebcdSSatoshi Sahara /** 106b370ebcdSSatoshi Sahara * Get revisions, and set correct pagenation parameters (first, hasNext) 107b370ebcdSSatoshi Sahara * 108b370ebcdSSatoshi Sahara * @param int $first 109b370ebcdSSatoshi Sahara * @param bool $hasNext 110b370ebcdSSatoshi Sahara * @return array revisions to be shown in a pagenated list 111b370ebcdSSatoshi Sahara * @see also https://www.dokuwiki.org/devel:changelog 112b370ebcdSSatoshi Sahara */ 113b370ebcdSSatoshi Sahara protected function getRevisions(&$first, &$hasNext) 114b370ebcdSSatoshi Sahara { 115b370ebcdSSatoshi Sahara global $INFO, $conf; 116b370ebcdSSatoshi Sahara 117*3244a325SSatoshi Sahara $changelog = new PageChangeLog($this->id); 118b370ebcdSSatoshi Sahara 119b370ebcdSSatoshi Sahara $revisions = []; 120b370ebcdSSatoshi Sahara 121b370ebcdSSatoshi Sahara /* we need to get one additional log entry to be able to 122b370ebcdSSatoshi Sahara * decide if this is the last page or is there another one. 123b370ebcdSSatoshi Sahara * see also Ui\Recent::getRecents() 124b370ebcdSSatoshi Sahara */ 125b370ebcdSSatoshi Sahara $revlist = $changelog->getRevisions($first, $conf['recent'] +1); 126b370ebcdSSatoshi Sahara if (count($revlist) == 0 && $first != 0) { 127b370ebcdSSatoshi Sahara $first = 0; 128b370ebcdSSatoshi Sahara $revlist = $changelog->getRevisions($first, $conf['recent'] +1); 129b370ebcdSSatoshi Sahara } 130*3244a325SSatoshi Sahara if ($this->id == $INFO['id']) { 131b370ebcdSSatoshi Sahara $exists = $INFO['exists']; 132*3244a325SSatoshi Sahara if ($first == 0 && $exists) { 133b370ebcdSSatoshi Sahara // add current page as revision[0] 134b370ebcdSSatoshi Sahara $revisions[] = array( 135b370ebcdSSatoshi Sahara 'date' => $INFO['lastmod'], 136b370ebcdSSatoshi Sahara 'ip' => null, 137b370ebcdSSatoshi Sahara 'type' => $INFO['meta']['last_change']['type'], 138b370ebcdSSatoshi Sahara 'id' => $INFO['id'], 139b370ebcdSSatoshi Sahara 'user' => $INFO['editor'], 140b370ebcdSSatoshi Sahara 'sum' => $INFO['sum'], 141b370ebcdSSatoshi Sahara 'extra' => null, 142b370ebcdSSatoshi Sahara 'sizechange' => $INFO['meta']['last_change']['sizechange'], 143b370ebcdSSatoshi Sahara 'current' => true, 144b370ebcdSSatoshi Sahara ); 145b370ebcdSSatoshi Sahara } 146*3244a325SSatoshi Sahara } else { 147*3244a325SSatoshi Sahara $exists = file_exists(wikiFN($this->id)); 148*3244a325SSatoshi Sahara if ($first == 0 && $exists) { 149*3244a325SSatoshi Sahara // add current page as revision[0] 150*3244a325SSatoshi Sahara $rev = filemtime(fullpath(wikiFN($this->id))); 151*3244a325SSatoshi Sahara $revinfo = $changelog->getRevisionInfo($rev) ?: array( 152*3244a325SSatoshi Sahara 'date' => $rev, 153*3244a325SSatoshi Sahara 'ip' => null, 154*3244a325SSatoshi Sahara 'type' => null, 155*3244a325SSatoshi Sahara 'id' => $this->id, 156*3244a325SSatoshi Sahara 'user' => null, 157*3244a325SSatoshi Sahara 'sum' => null, 158*3244a325SSatoshi Sahara 'extra' => null, 159*3244a325SSatoshi Sahara 'sizechange' => null, 160*3244a325SSatoshi Sahara ); 161*3244a325SSatoshi Sahara $revisions[] = $revinfo + array( 162*3244a325SSatoshi Sahara 'current' => true, 163*3244a325SSatoshi Sahara ); 164*3244a325SSatoshi Sahara } 165*3244a325SSatoshi Sahara } 166b370ebcdSSatoshi Sahara 167b370ebcdSSatoshi Sahara // decide if this is the last page or is there another one 168b370ebcdSSatoshi Sahara $hasNext = false; 169b370ebcdSSatoshi Sahara if (count($revlist) > $conf['recent']) { 170b370ebcdSSatoshi Sahara $hasNext = true; 171b370ebcdSSatoshi Sahara array_pop($revlist); // remove one additional log entry 172b370ebcdSSatoshi Sahara } 173b370ebcdSSatoshi Sahara 174b370ebcdSSatoshi Sahara // append each revison info array to the revisions 175b370ebcdSSatoshi Sahara foreach ($revlist as $rev) { 176b370ebcdSSatoshi Sahara $revisions[] = $changelog->getRevisionInfo($rev); 177b370ebcdSSatoshi Sahara } 178b370ebcdSSatoshi Sahara return $revisions; 179b370ebcdSSatoshi Sahara } 180b370ebcdSSatoshi Sahara 181b370ebcdSSatoshi Sahara} 182