first = $first; $this->show_changes = $show_changes; } /** * Display recent changes * * @return void * @author Matthias Grimm * @author Ben Coburn * @author Kate Arzamastseva * @author Satoshi Sahara * * @author Andreas Gohr */ public function show() { global $conf, $lang; global $ID; // get recent items, and set correct pagination parameters (first, hasNext) $first = $this->first; $hasNext = false; $recents = $this->getRecents($first, $hasNext); // print intro echo p_locale_xhtml('recent'); if (getNS($ID) != '') { echo '

' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '

'; } // create the form $form = new Form(['id' => 'dw__recent', 'method' => 'GET', 'action' => wl($ID), 'class' => 'changes']); $form->addTagOpen('div')->addClass('no'); $form->setHiddenField('sectok', null); $form->setHiddenField('do', 'recent'); $form->setHiddenField('id', $ID); // show dropdown selector, whether include not only recent pages but also recent media files? if ($conf['mediarevisions']) { $this->addRecentItemSelector($form); } // start listing of recent items $form->addTagOpen('ul'); foreach ($recents as $recent) { // check possible external edition for current page or media $this->checkCurrentRevision($recent); $RevInfo = new RevisionInfo($recent); $RevInfo->isCurrent(true); $class = ($RevInfo->val('type') === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor' : ''; $form->addTagOpen('li')->addClass($class); $form->addTagOpen('div')->addClass('li'); $html = implode(' ', [ $RevInfo->showFileIcon(), // filetype icon $RevInfo->showEditDate(), // edit date and time $RevInfo->showIconCompareWithPrevious(), // link to diff view icon $RevInfo->showIconRevisions(), // link to revisions icon $RevInfo->showFileName(), // name of page or media $RevInfo->showEditSummary(), // edit summary $RevInfo->showEditor(), // editor info $RevInfo->showSizechange(), // size change indicator ]); $form->addHTML($html); $form->addTagClose('div'); $form->addTagClose('li'); } $form->addTagClose('ul'); $form->addTagClose('div'); // close div class=no // provide navigation for paginated recent list (of pages and/or media files) $form->addHTML($this->htmlNavigation($first, $hasNext)); echo $form->toHTML('Recent'); } /** * Get recent items, and set correct pagination parameters (first, hasNext) * * @param int $first * @param bool $hasNext * @return array recent items to be shown in a paginated list * * @see also dokuwiki\Changelog::getRevisionInfo() */ protected function getRecents(&$first, &$hasNext) { global $ID, $conf; $flags = 0; if ($this->show_changes == 'mediafiles' && $conf['mediarevisions']) { $flags = RECENTS_MEDIA_CHANGES; } elseif ($this->show_changes == 'pages') { $flags = 0; } elseif ($conf['mediarevisions']) { $flags = RECENTS_MEDIA_PAGES_MIXED; } /* we need to get one additionally log entry to be able to * decide if this is the last page or is there another one. * This is the cheapest solution to get this information. */ $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags); if (count($recents) == 0 && $first != 0) { $first = 0; $recents = getRecents($first, $conf['recent'] + 1, getNS($ID), $flags); } $hasNext = false; if (count($recents) > $conf['recent']) { $hasNext = true; array_pop($recents); // remove extra log entry } return $recents; } /** * Check possible external deletion for current page or media * * To keep sort order in the recent list, we ignore externally modification. * It is not possible to know when external deletion had happened, * $info['date'] is to be incremented 1 second when such deletion detected. */ protected function checkCurrentRevision(array &$info) { if ($info['mode'] == RevisionInfo::MODE_PAGE) { $changelog = new PageChangelog($info['id']); } else { $changelog = new MediaChangelog($info['id']); } if (!$changelog->isCurrentRevision($info['date'])) { $currentRevInfo = $changelog->getCurrentRevisionInfo(); if ($currentRevInfo['type'] == DOKU_CHANGE_TYPE_DELETE) { // the page or media file was externally deleted, updated info because the link is already red // externally created and edited not updated because sorting by date is not worth so much changes $info = array_merge($info, $currentRevInfo); } } unset($changelog); } /** * Navigation buttons for Pagination (prev/next) * * @param int $first * @param bool $hasNext * @return string html */ protected function htmlNavigation($first, $hasNext) { global $conf, $lang; $last = $first + $conf['recent']; $html = ''; return $html; } /** * Add dropdown selector of item types to the form instance * * @param Form $form * @return void */ protected function addRecentItemSelector(Form $form) { global $lang; $form->addTagOpen('div')->addClass('changeType'); $options = [ 'pages' => $lang['pages_changes'], 'mediafiles' => $lang['media_changes'], 'both' => $lang['both_changes'] ]; $form->addDropdown('show_changes', $options, $lang['changes_type']) ->val($this->show_changes)->addClass('quickselect'); $form->addButton('do[recent]', $lang['btn_apply'])->attr('type', 'submit'); $form->addTagClose('div'); } }