Example #1
0
 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');
 }
Example #2
0
 /**
  * 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;
 }
Example #3
0
 /**
  * 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;
 }
Example #4
0
 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);
 }
Example #5
0
 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');
         }
     }
 }
Example #6
0
	/**
	 * 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;
 }
Example #11
0
 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'));
 }
Example #12
0
 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');
     }
 }
Example #15
0
 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'])));
 }
Example #16
0
 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'));
 }
Example #17
0
 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());
 }
Example #20
0
 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);
 }
Example #22
0
 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;
 }
Example #25
0
 /**
  * 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;
 }
Example #26
0
 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'));
 }
Example #29
0
 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;
	}