diff options
Diffstat (limited to 'includes/specials/SpecialRecentchanges.php')
-rw-r--r-- | includes/specials/SpecialRecentchanges.php | 113 |
1 files changed, 71 insertions, 42 deletions
diff --git a/includes/specials/SpecialRecentchanges.php b/includes/specials/SpecialRecentchanges.php index 283eeaf4..c012beca 100644 --- a/includes/specials/SpecialRecentchanges.php +++ b/includes/specials/SpecialRecentchanges.php @@ -1,15 +1,36 @@ <?php - /** * Implements Special:Recentchanges + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + * http://www.gnu.org/copyleft/gpl.html + * + * @file * @ingroup SpecialPage */ -class SpecialRecentChanges extends SpecialPage { + +/** + * A special page that lists last changes made to the wiki + * + * @ingroup SpecialPage + */ +class SpecialRecentChanges extends IncludableSpecialPage { var $rcOptions, $rcSubpage; - public function __construct() { - parent::__construct( 'Recentchanges' ); - $this->includable( true ); + public function __construct( $name = 'Recentchanges' ) { + parent::__construct( $name ); } /** @@ -91,7 +112,7 @@ class SpecialRecentChanges extends SpecialPage { /** * Main execution point * - * @param $subpage string + * @param $subpage String */ public function execute( $subpage ) { global $wgRequest, $wgOut; @@ -142,7 +163,7 @@ class SpecialRecentChanges extends SpecialPage { /** * Return an array with a ChangesFeed object and ChannelFeed object * - * @return array + * @return Array */ public function getFeedObject( $feedFormat ){ $changesFeed = new ChangesFeed( $feedFormat, 'rcfeed' ); @@ -186,7 +207,7 @@ class SpecialRecentChanges extends SpecialPage { * update the timestamp * * @param $feedFormat String - * @return string or false + * @return String or false */ public function checkLastModified( $feedFormat ) { global $wgUseRCPatrol, $wgOut; @@ -275,7 +296,7 @@ class SpecialRecentChanges extends SpecialPage { /** * Process the query * - * @param $conds array + * @param $conds Array * @param $opts FormOptions * @return database result or false (for Recentchangeslinked only) */ @@ -290,6 +311,7 @@ class SpecialRecentChanges extends SpecialPage { $dbr = wfGetDB( DB_SLAVE ); $limit = $opts['limit']; $namespace = $opts['namespace']; + $select = '*'; $invert = $opts['invert']; // JOIN on watchlist for users @@ -302,14 +324,17 @@ class SpecialRecentChanges extends SpecialPage { $tables[] = 'page'; $join_conds['page'] = array('LEFT JOIN', 'rc_cur_id=page_id'); } - // Tag stuff. - $fields = array(); - // Fields are * in this case, so let the function modify an empty array to keep it happy. - ChangeTags::modifyDisplayQuery( - $tables, $fields, $conds, $join_conds, $query_options, $opts['tagfilter'] - ); + if ( !$this->including() ) { + // Tag stuff. + // Doesn't work when transcluding. See bug 23293 + $fields = array(); + // Fields are * in this case, so let the function modify an empty array to keep it happy. + ChangeTags::modifyDisplayQuery( + $tables, $fields, $conds, $join_conds, $query_options, $opts['tagfilter'] + ); + } - if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options ) ) ) + if ( !wfRunHooks( 'SpecialRecentChangesQuery', array( &$conds, &$tables, &$join_conds, $opts, &$query_options, &$select ) ) ) return false; // Don't use the new_namespace_time timestamp index if: @@ -317,8 +342,8 @@ class SpecialRecentChanges extends SpecialPage { // (b) We want all pages NOT in a certain namespaces (inverted) // (c) There is a tag to filter on (use tag index instead) // (d) UNION + sort/limit is not an option for the DBMS - if( is_null($namespace) - || $invert + if( is_null( $namespace ) + || ( $invert && !is_null( $namespace ) ) || $opts['tagfilter'] != '' || !$dbr->unionSupportsOrderAndLimit() ) { @@ -329,7 +354,7 @@ class SpecialRecentChanges extends SpecialPage { // We have a new_namespace_time index! UNION over new=(0,1) and sort result set! } else { // New pages - $sqlNew = $dbr->selectSQLText( $tables, '*', + $sqlNew = $dbr->selectSQLText( $tables, $select, array( 'rc_new' => 1 ) + $conds, __METHOD__, array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit, @@ -354,7 +379,7 @@ class SpecialRecentChanges extends SpecialPage { /** * Send output to $wgOut, only called if not used feeds * - * @param $rows array of database rows + * @param $rows Array of database rows * @param $opts FormOptions */ public function webOutput( $rows, $opts ) { @@ -437,7 +462,8 @@ class SpecialRecentChanges extends SpecialPage { $defaults = $opts->getAllValues(); $nondefaults = $opts->getChangedValues(); - $opts->consumeValues( array( 'namespace', 'invert', 'tagfilter' ) ); + $opts->consumeValues( array( 'namespace', 'invert', 'tagfilter', + 'categories', 'categories_any' ) ); $panel = array(); $panel[] = $this->optionsPanel( $defaults, $nondefaults ); @@ -467,11 +493,11 @@ class SpecialRecentChanges extends SpecialPage { $unconsumed = $opts->getUnconsumedValues(); foreach( $unconsumed as $key => $value ) { - $out .= Xml::hidden( $key, $value ); + $out .= Html::hidden( $key, $value ); } $t = $this->getTitle(); - $out .= Xml::hidden( 'title', $t->getPrefixedText() ); + $out .= Html::hidden( 'title', $t->getPrefixedText() ); $form = Xml::tags( 'form', array( 'action' => $wgScript ), $out ); $panel[] = $form; $panelString = implode( "\n", $panel ); @@ -480,8 +506,6 @@ class SpecialRecentChanges extends SpecialPage { Xml::fieldset( wfMsg( 'recentchanges-legend' ), $panelString, array( 'class' => 'rcoptions' ) ) ); - $wgOut->addHTML( ChangesList::flagLegend() ); - $this->setBottomText( $wgOut, $opts ); } @@ -489,7 +513,7 @@ class SpecialRecentChanges extends SpecialPage { * Get options to be displayed in a form * * @param $opts FormOptions - * @return array + * @return Array */ function getExtraOptions( $opts ){ $extraOpts = array(); @@ -531,7 +555,7 @@ class SpecialRecentChanges extends SpecialPage { * Creates the choose namespace selection * * @param $opts FormOptions - * @return string + * @return String */ protected function namespaceFilterForm( FormOptions $opts ) { $nsSelect = Xml::namespaceSelector( $opts['namespace'], '' ); @@ -544,7 +568,7 @@ class SpecialRecentChanges extends SpecialPage { * Create a input to filter changes by categories * * @param $opts FormOptions - * @return array + * @return Array */ protected function categoryFilterForm( FormOptions $opts ) { list( $label, $input ) = Xml::inputLabelSep( wfMsg('rc_categories'), @@ -559,13 +583,13 @@ class SpecialRecentChanges extends SpecialPage { /** * Filter $rows by categories set in $opts * - * @param $rows array of database rows + * @param $rows Array of database rows * @param $opts FormOptions */ function filterByCategories( &$rows, FormOptions $opts ) { - $categories = array_map( 'trim', explode( "|" , $opts['categories'] ) ); + $categories = array_map( 'trim', explode( '|' , $opts['categories'] ) ); - if( empty($categories) ) { + if( !count( $categories ) ) { return; } @@ -573,32 +597,34 @@ class SpecialRecentChanges extends SpecialPage { $cats = array(); foreach( $categories as $cat ) { $cat = trim( $cat ); - if( $cat == "" ) continue; + if( $cat == '' ) continue; $cats[] = $cat; } # Filter articles $articles = array(); $a2r = array(); + $rowsarr = array(); foreach( $rows AS $k => $r ) { $nt = Title::makeTitle( $r->rc_namespace, $r->rc_title ); $id = $nt->getArticleID(); if( $id == 0 ) continue; # Page might have been deleted... - if( !in_array($id, $articles) ) { + if( !in_array( $id, $articles ) ) { $articles[] = $id; } - if( !isset($a2r[$id]) ) { + if( !isset( $a2r[$id] ) ) { $a2r[$id] = array(); } $a2r[$id][] = $k; + $rowsarr[$k] = $r; } # Shortcut? - if( !count($articles) || !count($cats) ) + if( !count( $articles ) || !count( $cats ) ) return ; # Look up - $c = new Categoryfinder ; + $c = new Categoryfinder; $c->seed( $articles, $cats, $opts['categories_any'] ? "OR" : "AND" ) ; $match = $c->run(); @@ -607,7 +633,7 @@ class SpecialRecentChanges extends SpecialPage { foreach( $match AS $id ) { foreach( $a2r[$id] AS $rev ) { $k = $rev; - $newrows[$k] = $rows[$k]; + $newrows[$k] = $rowsarr[$k]; } } $rows = $newrows; @@ -615,9 +641,11 @@ class SpecialRecentChanges extends SpecialPage { /** * Makes change an option link which carries all the other options - * @param $title see Title - * @param $override - * @param $options + * + * @param $title Title + * @param $override Array: options to override + * @param $options Array: current options + * @param $active Boolean: whether to show the link in bold */ function makeOptionsLink( $title, $override, $options, $active = false ) { global $wgUser; @@ -633,8 +661,9 @@ class SpecialRecentChanges extends SpecialPage { /** * Creates the options panel. - * @param $defaults array - * @param $nondefaults array + * + * @param $defaults Array + * @param $nondefaults Array */ function optionsPanel( $defaults, $nondefaults ) { global $wgLang, $wgUser, $wgRCLinkLimits, $wgRCLinkDays; |