public function __construct(FormOptions $opts, Title $title) { $this->opts = $opts; $this->title = $title; $this->userMode = $opts->getValue('mode') === SpecialAPC::MODE_USER_CACHE; $this->fieldKey = $this->userMode ? 'info' : (ini_get('apc.stat') ? 'inode' : 'filename'); }
/** * Generates feed's content * * @param ChannelFeed $feed ChannelFeed subclass object (generally the one returned * by getFeedObject()) * @param ResultWrapper $rows ResultWrapper object with rows in recentchanges table * @param int $lastmod Timestamp of the last item in the recentchanges table (only * used for the cache key) * @param FormOptions $opts As in SpecialRecentChanges::getDefaultOptions() * @return null|bool True or null */ public function execute($feed, $rows, $lastmod, $opts) { global $wgLang, $wgRenderHashAppend; if (!FeedUtils::checkFeedOutput($this->format)) { return null; } $optionsHash = md5(serialize($opts->getAllValues())) . $wgRenderHashAppend; $timekey = wfMemcKey($this->type, $this->format, $wgLang->getCode(), $optionsHash, 'timestamp'); $key = wfMemcKey($this->type, $this->format, $wgLang->getCode(), $optionsHash); FeedUtils::checkPurge($timekey, $key); /** * Bumping around loading up diffs can be pretty slow, so where * possible we want to cache the feed output so the next visitor * gets it quick too. */ $cachedFeed = $this->loadFromCache($lastmod, $timekey, $key); if (is_string($cachedFeed)) { wfDebug("RC: Outputting cached feed\n"); $feed->httpHeaders(); echo $cachedFeed; } else { wfDebug("RC: rendering new feed and caching it\n"); ob_start(); self::generateFeed($rows, $feed); $cachedFeed = ob_get_contents(); ob_end_flush(); $this->saveToCache($cachedFeed, $timekey, $key); } return true; }
/** * Get options from array, applying callback to extract key and value. * * fromArrayCallback([$a, $b, $c], function($x){ * return [$x->key, $x->value]; * }); **/ public static function fromArrayCallback(array $data, callable $callback) { $ret = new FormOptions(); foreach ($data as $item) { list($value, $text) = $callback($item); $ret->add($value, $text); } return $ret; }
protected function buildForm() { $formDescriptor = ['like' => ['type' => 'text', 'label-message' => 'newimages-label', 'name' => 'like'], 'showbots' => ['type' => 'check', 'label-message' => 'newimages-showbots', 'name' => 'showbots'], 'hidepatrolled' => ['type' => 'check', 'label-message' => 'newimages-hidepatrolled', 'name' => 'hidepatrolled'], 'limit' => ['type' => 'hidden', 'default' => $this->opts->getValue('limit'), 'name' => 'limit'], 'offset' => ['type' => 'hidden', 'default' => $this->opts->getValue('offset'), 'name' => 'offset']]; if ($this->getConfig()->get('MiserMode')) { unset($formDescriptor['like']); } if (!$this->getUser()->useFilePatrol()) { unset($formDescriptor['hidepatrolled']); } $form = HTMLForm::factory('ooui', $formDescriptor, $this->getContext())->setWrapperLegendMsg('newimages-legend')->setSubmitTextMsg('ilsubmit')->setMethod('get')->prepareForm()->displayForm(false); }
public function execute($par) { // Shortcut by using $par if ($par) { $this->getOutput()->redirect($this->getTitle()->getLinkURL(array('user' => $par))); return; } $this->setHeaders(); $this->outputHeader(); // Parse options $opt = new \FormOptions(); $opt->add('user', ''); $opt->add('delete', ''); $opt->add('reason', ''); $opt->fetchValuesFromRequest($this->getRequest()); // Parse user $user = $opt->getValue('user'); $userObj = \User::newFromName($user); $userExists = $userObj && $userObj->getId() !== 0; // If current task is delete and user is not allowed $canDoAdmin = $this->getUser()->isAllowed('avataradmin'); if ($opt->getValue('delete')) { if (!$canDoAdmin) { throw new \PermissionsError('avataradmin'); } // Delete avatar if the user exists if ($userExists) { if (Avatars::deleteAvatar($userObj)) { global $wgAvatarLogInRC; $logEntry = new \ManualLogEntry('avatar', 'delete'); $logEntry->setPerformer($this->getUser()); $logEntry->setTarget($userObj->getUserPage()); $logEntry->setComment($opt->getValue('reason')); $logId = $logEntry->insert(); $logEntry->publish($logId, $wgAvatarLogInRC ? 'rcandudp' : 'udp'); } } } $this->getOutput()->addModules(array('mediawiki.userSuggest')); $this->showForm($user); if ($userExists) { $haveAvatar = Avatars::hasAvatar($userObj); if ($haveAvatar) { $html = \Xml::tags('img', array('src' => Avatars::getLinkFor($user, 'original') . '&nocache&ver=' . dechex(time()), 'height' => 400), ''); $html = \Xml::tags('p', array(), $html); $this->getOutput()->addHTML($html); // Add a delete button if ($canDoAdmin) { $this->showDeleteForm($user); } } else { $this->getOutput()->addWikiMsg('viewavatar-noavatar'); } } else { if ($user) { $this->getOutput()->addWikiMsg('viewavatar-nouser'); } } }
/** * Output a subscription feed listing recent edits to this page. * * @param $type String */ protected function feed( $type ) { global $wgFeed, $wgFeedClasses, $wgFeedLimit; if ( !$wgFeed ) { $this->getOutput()->addWikiMsg( 'feed-unavailable' ); return; } if ( !isset( $wgFeedClasses[$type] ) ) { $this->getOutput()->addWikiMsg( 'feed-invalid' ); return; } $feed = new $wgFeedClasses[$type]( $this->feedTitle(), $this->msg( 'tagline' )->text(), $this->getTitle()->getFullURL() ); $pager = new NewPagesPager( $this, $this->opts ); $limit = $this->opts->getValue( 'limit' ); $pager->mLimit = min( $limit, $wgFeedLimit ); $feed->outHeader(); if ( $pager->getNumRows() > 0 ) { foreach ( $pager->mResult as $row ) { $feed->outItem( $this->feedItem( $row ) ); } } $feed->outFooter(); }
function getPageHeader() { global $wgScript; $self = $this->getTitle(); $limit = $this->mLimit ? Html::hidden( 'limit', $this->mLimit ) : ''; $out = Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) ); # Form tag $out .= Xml::fieldset( $this->msg( 'activeusers' )->text() ) . "\n"; $out .= Html::hidden( 'title', $self->getPrefixedDBkey() ) . $limit . "\n"; $out .= Xml::inputLabel( $this->msg( 'activeusers-from' )->text(), 'username', 'offset', 20, $this->requestedUser, array( 'tabindex' => 1 ) ) . '<br />';# Username field $out .= Xml::checkLabel( $this->msg( 'activeusers-hidebots' )->text(), 'hidebots', 'hidebots', $this->opts->getValue( 'hidebots' ), array( 'tabindex' => 2 ) ); $out .= Xml::checkLabel( $this->msg( 'activeusers-hidesysops' )->text(), 'hidesysops', 'hidesysops', $this->opts->getValue( 'hidesysops' ), array( 'tabindex' => 3 ) ) . '<br />'; $out .= Xml::submitButton( $this->msg( 'allpagessubmit' )->text(), array( 'tabindex' => 4 ) ) . "\n";# Submit button and form bottom $out .= Xml::closeElement( 'fieldset' ); $out .= Xml::closeElement( 'form' ); return $out; }
function formatRevisionRow($row) { $rev = new Revision($row); $stxt = ''; $last = $this->msg('last')->escaped(); $ts = wfTimestamp(TS_MW, $row->rev_timestamp); $checkBox = Xml::radio('mergepoint', $ts, $this->mOpts->getValue('mergepoint') === $ts); $user = $this->getUser(); $pageLink = Linker::linkKnown($rev->getTitle(), htmlspecialchars($this->getLanguage()->userTimeAndDate($ts, $user)), [], ['oldid' => $rev->getId()]); if ($rev->isDeleted(Revision::DELETED_TEXT)) { $pageLink = '<span class="history-deleted">' . $pageLink . '</span>'; } # Last link if (!$rev->userCan(Revision::DELETED_TEXT, $user)) { $last = $this->msg('last')->escaped(); } elseif (isset($this->prevId[$row->rev_id])) { $last = Linker::linkKnown($rev->getTitle(), $this->msg('last')->escaped(), [], ['diff' => $row->rev_id, 'oldid' => $this->prevId[$row->rev_id]]); } $userLink = Linker::revUserTools($rev); $size = $row->rev_len; if (!is_null($size)) { $stxt = Linker::formatRevisionSize($size); } $comment = Linker::revComment($rev); return Html::rawElement('li', [], $this->msg('mergehistory-revisionrow')->rawParams($checkBox, $last, $pageLink, $userLink, $stxt, $comment)->escaped()); }
/** * @param IContextSource $context * @param FormOptions $opts */ function __construct(IContextSource $context = null, FormOptions $opts) { parent::__construct($context); $this->RCMaxAge = $this->getConfig()->get('ActiveUserDays'); $this->requestedUser = ''; $un = $opts->getValue('username'); if ($un != '') { $username = Title::makeTitleSafe(NS_USER, $un); if (!is_null($username)) { $this->requestedUser = $username->getText(); } } if ($opts->getValue('hidebots') == 1) { $this->hideRights[] = 'bot'; } if ($opts->getValue('hidesysops') == 1) { $this->hideGroups[] = 'sysop'; } }
protected function getSearchInput($query) { $attribs = array('placeholder' => $this->msg('tux-sst-search-ph'), 'class' => 'searchinputbox', 'dir' => $this->getLanguage()->getDir()); $title = Html::hidden('title', $this->getPageTitle()->getPrefixedText()); $input = Xml::input('query', false, $query, $attribs); $submit = Xml::submitButton($this->msg('tux-sst-search'), array('class' => 'button')); $nondefaults = $this->opts->getChangedValues(); $checkLabel = Xml::checkLabel($this->msg('tux-sst-case-sensitive')->text(), 'case', 'tux-case-sensitive', isset($nondefaults['case'])); $checkLabel = Html::openElement('div', array('class' => 'tux-search-operators')) . $checkLabel . Html::closeElement('div'); $lang = $this->getRequest()->getVal('language'); $language = is_null($lang) ? '' : Html::hidden('language', $lang); $form = Html::rawElement('form', array('action' => wfScript(), 'name' => 'searchform'), $title . $input . $submit . $checkLabel . $language); return $form; }
protected function doPage() { global $wgOut; $wgOut->addHTML(Xml::openElement('div', array('class' => 'mw-apc-content'))); switch ($this->opts->getValue('mode')) { case self::MODE_STATS: $this->doObHostStats(); break; case self::MODE_SYSTEM_CACHE: case self::MODE_USER_CACHE: $mode = new APCCacheMode($this->opts, $this->title); $mode->cacheView(); break; case self::MODE_VERSION_CHECK: $this->versionCheck(); break; } $wgOut->addHTML(Xml::closeElement('div')); }
function getPageHeader() { $self = $this->getTitle(); $limit = $this->mLimit ? Html::hidden('limit', $this->mLimit) : ''; # Form tag $out = Xml::openElement('form', array('method' => 'get', 'action' => wfScript())); $out .= Xml::fieldset($this->msg('activeusers')->text()) . "\n"; $out .= Html::hidden('title', $self->getPrefixedDBkey()) . $limit . "\n"; # Username field (with autocompletion support) $this->getOutput()->addModules('mediawiki.userSuggest'); $out .= Xml::inputLabel($this->msg('activeusers-from')->text(), 'username', 'offset', 20, $this->requestedUser, array('class' => 'mw-ui-input-inline mw-autocomplete-user', 'tabindex' => 1, 'autofocus' => $this->requestedUser === '')) . '<br />'; $out .= Xml::checkLabel($this->msg('activeusers-hidebots')->text(), 'hidebots', 'hidebots', $this->opts->getValue('hidebots'), array('tabindex' => 2)); $out .= Xml::checkLabel($this->msg('activeusers-hidesysops')->text(), 'hidesysops', 'hidesysops', $this->opts->getValue('hidesysops'), array('tabindex' => 3)) . '<br />'; # Submit button and form bottom $out .= Xml::submitButton($this->msg('activeusers-submit')->text(), array('tabindex' => 4)) . "\n"; $out .= Xml::closeElement('fieldset'); $out .= Xml::closeElement('form'); return $out; }
/** * Create filter panel * * @return string HTML fieldset and filter panel with the show/hide links */ function getFilterPanel() { $show = wfMsgHtml('show'); $hide = wfMsgHtml('hide'); $changed = $this->opts->getChangedValues(); unset($changed['target']); // Already in the request title $links = array(); $types = array('hidetrans', 'hidelinks', 'hideredirs'); if ($this->target->getNamespace() == NS_FILE) { $types[] = 'hideimages'; } // Combined message keys: 'whatlinkshere-hideredirs', 'whatlinkshere-hidetrans', 'whatlinkshere-hidelinks', 'whatlinkshere-hideimages' // To be sure they will be find by grep foreach ($types as $type) { $chosen = $this->opts->getValue($type); $msg = $chosen ? $show : $hide; $overrides = array($type => !$chosen); $links[] = wfMsgHtml("whatlinkshere-{$type}", $this->makeSelfLink($msg, array_merge($changed, $overrides))); } return Xml::fieldset(wfMsg('whatlinkshere-filters'), $this->getLanguage()->pipeList($links)); }
/** * Show the special page * * @param string $par Parameter passed to the page or null */ public function execute($par) { $out = $this->getOutput(); $this->setHeaders(); $this->outputHeader(); $opts = new FormOptions(); $opts->add('username', ''); $opts->add('hidebots', false, FormOptions::BOOL); $opts->add('hidesysops', false, FormOptions::BOOL); $opts->fetchValuesFromRequest($this->getRequest()); if ($par !== null) { $opts->setValue('username', $par); } // Mention the level of cache staleness... $cacheText = ''; $dbr = wfGetDB(DB_SLAVE, 'recentchanges'); $rcMax = $dbr->selectField('recentchanges', 'MAX(rc_timestamp)', '', __METHOD__); if ($rcMax) { $cTime = $dbr->selectField('querycache_info', 'qci_timestamp', ['qci_type' => 'activeusers'], __METHOD__); if ($cTime) { $secondsOld = wfTimestamp(TS_UNIX, $rcMax) - wfTimestamp(TS_UNIX, $cTime); } else { $rcMin = $dbr->selectField('recentchanges', 'MIN(rc_timestamp)'); $secondsOld = time() - wfTimestamp(TS_UNIX, $rcMin); } if ($secondsOld > 0) { $cacheTxt = '<br>' . $this->msg('cachedspecial-viewing-cached-ttl')->durationParams($secondsOld); } } $pager = new ActiveUsersPager($this->getContext(), $opts); $usersBody = $pager->getBody(); $days = $this->getConfig()->get('ActiveUserDays'); $formDescriptor = ['username' => ['type' => 'user', 'name' => 'username', 'label-message' => 'activeusers-from'], 'hidebots' => ['type' => 'check', 'name' => 'hidebots', 'label-message' => 'activeusers-hidebots', 'default' => false], 'hidesysops' => ['type' => 'check', 'name' => 'hidesysops', 'label-message' => 'activeusers-hidesysops', 'default' => false]]; $htmlForm = HTMLForm::factory('ooui', $formDescriptor, $this->getContext())->setIntro($this->msg('activeusers-intro')->numParams($days) . $cacheText)->setWrapperLegendMsg('activeusers')->setSubmitTextMsg('activeusers-submit')->setMethod('get')->prepareForm()->displayForm(false); if ($usersBody) { $out->addHTML($pager->getNavigationBar() . Html::rawElement('ul', [], $usersBody) . $pager->getNavigationBar()); } else { $out->addWikiMsg('activeusers-noresult'); } }
public function execute($par) { $user = $this->getUser(); if (!$this->userCanExecute($user)) { throw new \PermissionsError('commentadmin-restricted'); } // Parse request $opt = new \FormOptions(); $opt->add('user', ''); $opt->add('page', ''); $opt->add('filter', 'all'); $opt->add('keyword', ''); $opt->add('offset', '0'); $opt->add('limit', '20'); $opt->add('dir', ''); $opt->fetchValuesFromRequest($this->getRequest()); // Reset filter to all if it cannot be recognized $filter = $opt->getValue('filter'); if (!in_array($filter, $this->getPossibleFilters())) { $filter = 'all'; } $this->filter = $filter; // Set local variable $this->page = $opt->getValue('page'); $this->user = $opt->getValue('user'); $this->keyword = $opt->getValue('keyword'); $this->offset = intval($opt->getValue('offset')); $this->limit = intval($opt->getValue('limit')); $this->revDir = $opt->getValue('dir') === 'prev'; // Limit the max limit if ($this->limit >= 500) { $this->limit = 500; } global $wgScript; $this->setHeaders(); $this->outputHeader(); $output = $this->getOutput(); $output->addModules('mediawiki.userSuggest'); # This is used for user input field $output->addModules('ext.flowthread.manage'); $this->showForm(); $json = array(); $res = $this->queryDatabase(); $count = 0; foreach ($res as $row) { if ($count === $this->limit) { $this->haveMore = true; break; } else { $count++; } $post = Post::newFromDatabaseRow($row); $title = \Title::newFromId($row->flowthread_pageid); $json[] = array('id' => $post->id->getHex(), 'userid' => $post->userid, 'username' => $post->username, 'title' => $title ? $title->getPrefixedText() : null, 'text' => $post->text, 'timestamp' => $post->id->getTimestamp(), 'parentid' => $post->parentid ? $post->parentid->getHex() : '', 'like' => $post->getFavorCount(), 'report' => $post->getReportCount()); } // Pager can only be generated after query $output->addHTML($this->getPager()); $output->addJsConfigVars(array('commentfilter' => $this->filter, 'commentjson' => $json)); if ($this->getUser()->isAllowed('commentadmin')) { $output->addJsConfigVars(array('commentadmin' => '')); } global $wgFlowThreadConfig; $output->addJsConfigVars(array('wgFlowThreadConfig' => array('Avatar' => $wgFlowThreadConfig['Avatar'], 'AnonymousAvatar' => $wgFlowThreadConfig['AnonymousAvatar']))); }
public function setup() { global $wgRequest; $opts = new FormOptions(); // Bind to the member variable $this->opts = $opts; $opts->add('mode', self::MODE_STATS); $opts->add('image', APCImages::IMG_NONE); $opts->add('clearcache', false); $opts->add('limit', 20); $opts->add('offset', 0); $opts->add('display', ''); $opts->add('delete', ''); $opts->add('sort', 'hits'); $opts->add('sortdir', 0); $opts->add('scope', 'active'); $opts->add('searchi', ''); // MediaWiki captures search, ARGH! $opts->fetchValuesFromRequest($wgRequest); $opts->validateIntBounds('limit', 0, 5000); $opts->validateIntBounds('sortdir', 0, 1); $this->opts->consumeValues(array('display', 'clearcache', 'image')); }
protected function setup($par) { global $wgRequest, $wgUser; // Options $opts = new FormOptions(); $this->opts = $opts; // bind $opts->add('page1', ''); $opts->add('page2', ''); $opts->add('rev1', ''); $opts->add('rev2', ''); $opts->add('action', ''); // Set values $opts->fetchValuesFromRequest($wgRequest); $title1 = Title::newFromText($opts->getValue('page1')); $title2 = Title::newFromText($opts->getValue('page2')); if ($title1 && $title1->exists() && $opts->getValue('rev1') == '') { $pda = new Article($title1); $pdi = $pda->getID(); $pdLastRevision = Revision::loadFromPageId(wfGetDB(DB_SLAVE), $pdi); $opts->setValue('rev1', $pdLastRevision->getId()); } elseif ($opts->getValue('rev1') != '') { $pdrev = Revision::newFromId($opts->getValue('rev1')); if ($pdrev) { $opts->setValue('page1', $pdrev->getTitle()->getPrefixedText()); } } if ($title2 && $title2->exists() && $opts->getValue('rev2') == '') { $pda = new Article($title2); $pdi = $pda->getID(); $pdLastRevision = Revision::loadFromPageId(wfGetDB(DB_SLAVE), $pdi); $opts->setValue('rev2', $pdLastRevision->getId()); } elseif ($opts->getValue('rev2') != '') { $pdrev = Revision::newFromId($opts->getValue('rev2')); if ($pdrev) { $opts->setValue('page2', $pdrev->getTitle()->getPrefixedText()); } } // Store some objects $this->skin = $wgUser->getSkin(); }
/** * Adds raw image data of the graph to the output. * @param $opts FormOptions */ public function draw( FormOptions $opts ) { global $wgTranslatePHPlotFont, $wgLang; $width = $opts->getValue( 'width' ); $height = $opts->getValue( 'height' ); // Define the object $plot = new PHPlot( $width, $height ); list( $legend, $resData ) = $this->getData( $opts ); $count = count( $resData ); $skip = intval( $count / ( $width / 60 ) - 1 ); $i = $count; foreach ( $resData as $date => $edits ) { if ( $skip > 0 ) { if ( ( $count - $i ) % $skip !== 0 ) $date = ''; } if ( strpos( $date, ';' ) !== false ) { list( , $date ) = explode( ';', $date, 2 ); } array_unshift( $edits, $date ); $data[] = $edits; $i--; } $font = FCFontFinder::find( $wgLang->getCode() ); if ( $font ) { $plot->SetDefaultTTFont( $font ); } else { $plot->SetDefaultTTFont( $wgTranslatePHPlotFont ); } $plot->SetDataValues( $data ); if ( $legend !== null ) { $plot->SetLegend( $legend ); } $numberFont = FCFontFinder::find( 'en' ); $plot->setFont( 'x_label', $numberFont, 8 ); $plot->setFont( 'y_label', $numberFont, 8 ); $yTitle = wfMsg( 'translate-stats-' . $opts['count'] ); // Turn off X axis ticks and labels because they get in the way: $plot->SetYTitle( $yTitle ); $plot->SetXTickLabelPos( 'none' ); $plot->SetXTickPos( 'none' ); $plot->SetXLabelAngle( 45 ); $max = max( array_map( 'max', $resData ) ); $max = self::roundToSignificant( $max, 1 ); $max = round( $max, intval( -log( $max, 10 ) ) ); $yTick = 10; while ( $max / $yTick > $height / 20 ) { $yTick *= 2; } // If we have very small case, ensure that there is at least one tick $yTick = min( $max, $yTick ); $yTick = self::roundToSignificant( $yTick ); $plot->SetYTickIncrement( $yTick ); $plot->SetPlotAreaWorld( null, 0, null, $max ); $plot->SetTransparentColor( 'white' ); $plot->SetBackgroundColor( 'white' ); // Draw it $plot->DrawGraph(); }
public function testAddIntegers() { $this->object->add('one', 1); $this->object->add('negone', -1); $this->assertEquals(array('negone' => array('default' => -1, 'value' => null, 'consumed' => false, 'type' => FormOptions::INT), 'one' => array('default' => 1, 'value' => null, 'consumed' => false, 'type' => FormOptions::INT)), $this->object->getOptions()); }
protected function setup($par) { global $wgRequest, $wgUser, $wgEnableNewpagesUserFilter; // Options $opts = new FormOptions(); $this->opts = $opts; // bind $opts->add('hideliu', false); $opts->add('hidepatrolled', false); $opts->add('hidebots', false); $opts->add('hideredirs', true); $opts->add('limit', (int) $wgUser->getOption('rclimit')); $opts->add('offset', ''); $opts->add('namespace', '0'); $opts->add('username', ''); $opts->add('feed', ''); // Set values $opts->fetchValuesFromRequest($wgRequest); if ($par) { $this->parseParams($par); } // Validate $opts->validateIntBounds('limit', 0, 5000); if (!$wgEnableNewpagesUserFilter) { $opts->setValue('username', ''); } // Store some objects $this->skin = $wgUser->getSkin(); }
/** * @expectedException MWException */ public function testGuessTypeOnNullThrowException() { $this->object->guessType(null); }
function setTopText(FormOptions $opts) { $nondefaults = $opts->getChangedValues(); $form = ""; $user = $this->getUser(); $dbr = $this->getDB(); $numItems = $this->countItems($dbr); $showUpdatedMarker = $this->getConfig()->get('ShowUpdatedMarker'); // Show watchlist header $form .= "<p>"; if ($numItems == 0) { $form .= $this->msg('nowatchlist')->parse() . "\n"; } else { $form .= $this->msg('watchlist-details')->numParams($numItems)->parse() . "\n"; if ($this->getConfig()->get('EnotifWatchlist') && $user->getOption('enotifwatchlistpages')) { $form .= $this->msg('wlheader-enotif')->parse() . "\n"; } if ($showUpdatedMarker) { $form .= $this->msg('wlheader-showupdated')->parse() . "\n"; } } $form .= "</p>"; if ($numItems > 0 && $showUpdatedMarker) { $form .= Xml::openElement('form', array('method' => 'post', 'action' => $this->getPageTitle()->getLocalURL(), 'id' => 'mw-watchlist-resetbutton')) . "\n" . Xml::submitButton($this->msg('enotif_reset')->text(), array('name' => 'dummy')) . "\n" . Html::hidden('reset', 'all') . "\n"; foreach ($nondefaults as $key => $value) { $form .= Html::hidden($key, $value) . "\n"; } $form .= Xml::closeElement('form') . "\n"; } $form .= Xml::openElement('form', array('method' => 'get', 'action' => $this->getPageTitle()->getLocalURL(), 'id' => 'mw-watchlist-form')); $form .= Xml::fieldset($this->msg('watchlist-options')->text(), false, array('id' => 'mw-watchlist-options')); $form .= $this->makeLegend(); $this->getOutput()->addHTML($form); }
/** * Return an array of conditions depending of options set in $opts * * @param $opts FormOptions * @return array */ public function buildMainQueryConds(FormOptions $opts) { global $wgUser; $dbr = wfGetDB(DB_SLAVE); $conds = array(); # It makes no sense to hide both anons and logged-in users # Where this occurs, force anons to be shown $forcebot = false; if ($opts['hideanons'] && $opts['hideliu']) { # Check if the user wants to show bots only if ($opts['hidebots']) { $opts['hideanons'] = false; } else { $forcebot = true; $opts['hidebots'] = false; } } // Calculate cutoff $cutoff_unixtime = time() - $opts['days'] * 86400; $cutoff_unixtime = $cutoff_unixtime - $cutoff_unixtime % 86400; $cutoff = $dbr->timestamp($cutoff_unixtime); $fromValid = preg_match('/^[0-9]{14}$/', $opts['from']); if ($fromValid && $opts['from'] > wfTimestamp(TS_MW, $cutoff)) { $cutoff = $dbr->timestamp($opts['from']); } else { $opts->reset('from'); } $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes($cutoff); // Selected product changes $product = addslashes(isset($_GET['product']) ? $_GET['product'] : PonyDocsProduct::GetSelectedProduct()); $conds[] = 'rc_title LIKE "' . $product . '%"'; $hidePatrol = $wgUser->useRCPatrol() && $opts['hidepatrolled']; $hideLoggedInUsers = $opts['hideliu'] && !$forcebot; $hideAnonymousUsers = $opts['hideanons'] && !$forcebot; if ($opts['hideminor']) { $conds['rc_minor'] = 0; } if ($opts['hidebots']) { $conds['rc_bot'] = 0; } if ($hidePatrol) { $conds['rc_patrolled'] = 0; } if ($forcebot) { $conds['rc_bot'] = 1; } if ($hideLoggedInUsers) { $conds[] = 'rc_user = 0'; } if ($hideAnonymousUsers) { $conds[] = 'rc_user != 0'; } if ($opts['hidemyself']) { if ($wgUser->getId()) { $conds[] = 'rc_user != ' . $dbr->addQuotes($wgUser->getId()); } else { $conds[] = 'rc_user_text != ' . $dbr->addQuotes($wgUser->getName()); } } # Namespace filtering if ($opts['namespace'] !== '') { if (!$opts['invert']) { $conds[] = 'rc_namespace = ' . $dbr->addQuotes($opts['namespace']); } else { $conds[] = 'rc_namespace != ' . $dbr->addQuotes($opts['namespace']); } } return $conds; }
/** * Return an array of conditions depending of options set in $opts * * @param FormOptions $opts * @return array */ public function buildMainQueryConds(FormOptions $opts) { $dbr = wfGetDB(DB_SLAVE); $conds = array(); # It makes no sense to hide both anons and logged-in users # Where this occurs, force anons to be shown $forcebot = false; if ($opts['hideanons'] && $opts['hideliu']) { # Check if the user wants to show bots only if ($opts['hidebots']) { $opts['hideanons'] = false; } else { $forcebot = true; $opts['hidebots'] = false; } } // Calculate cutoff $cutoff_unixtime = time() - $opts['days'] * 86400; $cutoff_unixtime = $cutoff_unixtime - $cutoff_unixtime % 86400; $cutoff = $dbr->timestamp($cutoff_unixtime); $fromValid = preg_match('/^[0-9]{14}$/', $opts['from']); if ($fromValid && $opts['from'] > wfTimestamp(TS_MW, $cutoff)) { $cutoff = $dbr->timestamp($opts['from']); } else { $opts->reset('from'); } $conds[] = 'rc_timestamp >= ' . $dbr->addQuotes($cutoff); $hidePatrol = $this->getUser()->useRCPatrol() && $opts['hidepatrolled']; $hideLoggedInUsers = $opts['hideliu'] && !$forcebot; $hideAnonymousUsers = $opts['hideanons'] && !$forcebot; if ($opts['hideminor']) { $conds['rc_minor'] = 0; } if ($opts['hidebots']) { $conds['rc_bot'] = 0; } if ($hidePatrol) { $conds['rc_patrolled'] = 0; } if ($forcebot) { $conds['rc_bot'] = 1; } if ($hideLoggedInUsers) { $conds[] = 'rc_user = 0'; } if ($hideAnonymousUsers) { $conds[] = 'rc_user != 0'; } if ($opts['hidemyself']) { if ($this->getUser()->getId()) { $conds[] = 'rc_user != ' . $dbr->addQuotes($this->getUser()->getId()); } else { $conds[] = 'rc_user_text != ' . $dbr->addQuotes($this->getUser()->getName()); } } # Namespace filtering if ($opts['namespace'] !== '') { $selectedNS = $dbr->addQuotes($opts['namespace']); $operator = $opts['invert'] ? '!=' : '='; $boolean = $opts['invert'] ? 'AND' : 'OR'; # namespace association (bug 2429) if (!$opts['associated']) { $condition = "rc_namespace {$operator} {$selectedNS}"; } else { # Also add the associated namespace $associatedNS = $dbr->addQuotes(MWNamespace::getAssociated($opts['namespace'])); $condition = "(rc_namespace {$operator} {$selectedNS} " . $boolean . " rc_namespace {$operator} {$associatedNS})"; } $conds[] = $condition; } return $conds; }
/** * Get options to be displayed in a form * * @param FormOptions $opts * @return array */ function getExtraOptions($opts) { $opts->consumeValues(array('namespace', 'invert', 'associated', 'tagfilter', 'categories', 'categories_any')); $extraOpts = array(); $extraOpts['namespace'] = $this->namespaceFilterForm($opts); if ($this->getConfig()->get('AllowCategorizedRecentChanges')) { $extraOpts['category'] = $this->categoryFilterForm($opts); } $tagFilter = ChangeTags::buildTagFilterSelector($opts['tagfilter']); if (count($tagFilter)) { $extraOpts['tagfilter'] = $tagFilter; } // Don't fire the hook for subclasses. (Or should we?) if ($this->getName() === 'Recentchanges') { Hooks::run('SpecialRecentChangesPanel', array(&$extraOpts, $opts)); } return $extraOpts; }
private function show(FormOptions $opts, array $extraConds) { # Create a LogPager item to get the results and a LogEventsList item to format them... $loglist = new LogEventsList($this->getContext(), null, LogEventsList::USE_REVDEL_CHECKBOXES); $pager = new LogPager($loglist, $opts->getValue('type'), $opts->getValue('user'), $opts->getValue('page'), $opts->getValue('pattern'), $extraConds, $opts->getValue('year'), $opts->getValue('month'), $opts->getValue('tagfilter')); $this->addHeader($opts->getValue('type')); # Set relevant user if ($pager->getPerformer()) { $this->getSkin()->setRelevantUser(User::newFromName($pager->getPerformer())); } # Show form options $loglist->showOptions($pager->getType(), $opts->getValue('user'), $pager->getPage(), $pager->getPattern(), $pager->getYear(), $pager->getMonth(), $pager->getFilterParams(), $opts->getValue('tagfilter')); # Insert list $logBody = $pager->getBody(); if ($logBody) { $this->getOutput()->addHTML($pager->getNavigationBar() . $this->getRevisionButton($loglist->beginLogEventsList() . $logBody . $loglist->endLogEventsList()) . $pager->getNavigationBar()); } else { $this->getOutput()->addWikiMsg('logempty'); } }
/** * Fetch values for a FormOptions object from the WebRequest associated with this instance. * * Intended for subclassing, e.g. to add a backwards-compatibility layer. * * @param FormOptions $opts * @return FormOptions */ protected function fetchOptionsFromRequest($opts) { $opts->fetchValuesFromRequest($this->getRequest()); return $opts; }
function execute() { global $wgOut; $opts = new FormOptions(); $opts->add('target', ''); $opts->add('namespace', '', FormOptions::INTNULL); $opts->add('limit', 50); $opts->add('from', 0); $opts->add('back', 0); $opts->add('hideredirs', false); $opts->add('hidetrans', false); $opts->add('hidelinks', false); $opts->add('hideimages', false); $opts->fetchValuesFromRequest($this->request); $opts->validateIntBounds('limit', 0, 5000); // Give precedence to subpage syntax if (isset($this->par)) { $opts->setValue('target', $this->par); } // Bind to member variable $this->opts = $opts; $this->target = Title::newFromURL($opts->getValue('target')); if (!$this->target) { $wgOut->addHTML($this->whatlinkshereForm()); return; } $this->selfTitle = SpecialPage::getTitleFor('Whatlinkshere', $this->target->getPrefixedDBkey()); $wgOut->setPageTitle(wfMsg('whatlinkshere-title', $this->target->getPrefixedText())); $wgOut->setSubtitle(wfMsg('whatlinkshere-backlink', $this->skin->link($this->target, $this->target->getPrefixedText(), array(), array('redirect' => 'no')))); $this->showIndirectLinks(0, $this->target, $opts->getValue('limit'), $opts->getValue('from'), $opts->getValue('back')); }
private function show(FormOptions $opts, array $extraConds) { global $wgOut; # Create a LogPager item to get the results and a LogEventsList item to format them... $loglist = new LogEventsList($this->getSkin(), $wgOut, 0); $pager = new LogPager($loglist, $opts->getValue('type'), $opts->getValue('user'), $opts->getValue('page'), $opts->getValue('pattern'), $extraConds, $opts->getValue('year'), $opts->getValue('month'), $opts->getValue('tagfilter')); # Set title and add header $loglist->showHeader($pager->getType()); # Set relevant user if ($pager->getUser()) { $this->getSkin()->setRelevantUser(User::newFromName($pager->getUser())); } # Show form options $loglist->showOptions($pager->getType(), $pager->getUser(), $pager->getPage(), $pager->getPattern(), $pager->getYear(), $pager->getMonth(), $pager->getFilterParams(), $opts->getValue('tagfilter')); # Insert list $logBody = $pager->getBody(); if ($logBody) { $wgOut->addHTML($pager->getNavigationBar() . $loglist->beginLogEventsList() . $logBody . $loglist->endLogEventsList() . $pager->getNavigationBar()); } else { $wgOut->addWikiMsg('logempty'); } }
/** * Returns query form fields. * @param $opts Form options. * @return Array of form fields. */ protected static function getQueryFormFields( FormOptions $opts ) { global $wgWikilogEnableTags; $fields = array(); $fields['wikilog'] = Xml::inputLabelSep( wfMsg( 'wikilog-form-wikilog' ), 'wikilog', 'wl-wikilog', 40, str_replace( '_', ' ', $opts->consumeValue( 'wikilog' ) ) ); $fields['category'] = Xml::inputLabelSep( wfMsg( 'wikilog-form-category' ), 'category', 'wl-category', 40, str_replace( '_', ' ', $opts->consumeValue( 'category' ) ) ); $fields['author'] = Xml::inputLabelSep( wfMsg( 'wikilog-form-author' ), 'author', 'wl-author', 40, str_replace( '_', ' ', $opts->consumeValue( 'author' ) ) ); if ( $wgWikilogEnableTags ) { $fields['tag'] = Xml::inputLabelSep( wfMsg( 'wikilog-form-tag' ), 'tag', 'wl-tag', 40, str_replace( '_', ' ', $opts->consumeValue( 'tag' ) ) ); } $fields['date'] = array( Xml::label( wfMsg( 'wikilog-form-date' ), 'wl-month' ), Xml::monthSelector( $opts->consumeValue( 'month' ), '', 'wl-month' ) . " " . Xml::input( 'year', 4, $opts->consumeValue( 'year' ), array( 'maxlength' => 4 ) ) ); $opts->consumeValue( 'day' ); // ignore day, not really useful $statusSelect = new XmlSelect( 'show', 'wl-status', $opts->consumeValue( 'show' ) ); $statusSelect->addOption( wfMsg( 'wikilog-show-all' ), 'all' ); $statusSelect->addOption( wfMsg( 'wikilog-show-published' ), 'published' ); $statusSelect->addOption( wfMsg( 'wikilog-show-drafts' ), 'drafts' ); $fields['status'] = array( Xml::label( wfMsg( 'wikilog-form-status' ), 'wl-status' ), $statusSelect->getHTML() ); $fields['submit'] = Xml::submitbutton( wfMsg( 'allpagessubmit' ) ); return $fields; }