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

' . 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) { $objRevInfo = $this->getObjRevInfo($recent); $class = ($recent['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor': ''; $form->addTagOpen('li')->addClass($class); $form->addTagOpen('div')->addClass('li'); $html = implode(' ', [ $objRevInfo->itemIcon(), // filetype icon $objRevInfo->editDate(), // edit date and time $objRevInfo->difflink(), // link to diffview icon $objRevInfo->revisionlink(), // linkto revisions icon $objRevInfo->itemName(), // name of page or media $objRevInfo->editSummary(), // edit summary $objRevInfo->editor(), // editor info html_sizechange($recent['sizechange']), // 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 pagenated recent list (of pages and/or media files) $form->addHTML($this->htmlNavigation($first, $hasNext)); // emit HTML_CRECENTFORM_OUTPUT event Event::createAndTrigger('HTML_RECENTFORM_OUTPUT', $form, null, false); print $form->toHTML(); } /** * Get recent items, and set correct pagenation parameters (first, hasNext) * * @param int $first * @param bool $hasNext * @return array recent items to be shown in a pagenated 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; } /** * Navigation buttons for Pagenation (prev/next) * * @param int $first * @param bool $hasNext * @return array 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 = array( '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'); } /** * Returns instance of objRevInfo * @param array $info Revision info structure of page or media * @return objRevInfo object (anonymous class) */ protected function getObjRevInfo(array $info) { return new class ($info) // anonymous class (objRevInfo) { protected $info; public function __construct(array $info) { $this->info = $info; } // fileicon of the page or media file public function itemIcon() { $id = $this->info['id']; if (isset($this->info['media'])) { $html = media_printicon($id); } else { $html = ''.$id.''; } return $html; } // edit date and time of the page or media file public function editDate() { $date = $this->info['date']; $html = ''. dformat($date) .''; return $html; } // icon difflink public function difflink() { global $lang; $id = $this->info['id']; $diff = false; if (isset($this->info['media'])) { $revs = (new MediaChangeLog($id))->getRevisions(0, 1); $diff = (count($revs) && file_exists(mediaFN($id))); if ($diff) { $href = media_managerURL( ['tab_details'=>'history', 'mediado'=>'diff', 'image'=> $id, 'ns'=> getNS($id)], '&' ); } } else { $href = wl($id, "do=diff", false, '&'); } if (isset($this->info['media']) && !$diff) { $html = ''; } else { $html = '' . ''.$lang['diff'].'' . ''; } return $html; } // icon revision link public function revisionlink() { global $lang; $id = $this->info['id']; if (isset($this->info['media'])) { $href = media_managerURL(['tab_details'=>'history', 'image'=> $id, 'ns'=> getNS($id)], '&'); } else { $href = wl($id, "do=revisions", false, '&'); } $html = '' . ''.$lang['btn_revs'].'' . ''; return $html; } // name of the page or media file public function itemName() { $id = $this->info['id']; if (isset($this->info['media'])) { $href = media_managerURL(['tab_details'=>'view', 'image'=> $id, 'ns'=> getNS($id)], '&'); $class = file_exists(mediaFN($id)) ? 'wikilink1' : 'wikilink2'; $html = ''.$id.''; } else { $html = html_wikilink(':'.$id, (useHeading('navigation') ? null : $id)); } return $html; } // edit summary public function editSummary() { $html = ''; $html.= ' – '. hsc($this->info['sum']); $html.= ''; return $html; } // editor of the page or media file public function editor() { $html = ''; if ($this->info['user']) { $html.= ''. editorinfo($this->info['user']) .''; if (auth_ismanager()) $html.= ' ('. $this->info['ip'] .')'; } else { $html.= ''. $this->info['ip'] .''; } $html.= ''; return $html; } }; // end of anonymous class (objRevInfo) } }