X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSpecialRecentchanges.php;h=7afd21f05b42216c3447239d3f0d1a68a4517076;hb=903732fd15bfbabf758abec8b15fd3d29df44241;hp=5553c18fdb31305dfbb3150af877cbad43c089d0;hpb=d5a2d6b7b66bf03ed8bbe5a88cac39b38049f472;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialRecentchanges.php b/includes/SpecialRecentchanges.php index 5553c18fdb..7afd21f05b 100644 --- a/includes/SpecialRecentchanges.php +++ b/includes/SpecialRecentchanges.php @@ -1,7 +1,7 @@ preferences > default */ $hideminor = $wgRequest->getBool( 'hideminor', $wgUser->getOption( 'hideminor') ? true : $defaults['hideminor'] ); - + # As a feed, use limited settings only if( $feedFormat ) { global $wgFeedLimit; @@ -87,7 +87,7 @@ function wfSpecialRecentchanges( $par, $specialPage ) { if ( is_numeric( $bit ) ) { $limit = $bit; } - + $m = array(); if ( preg_match( '/^limit=(\d+)$/', $bit, $m ) ) { $limit = $m[1]; @@ -102,11 +102,8 @@ function wfSpecialRecentchanges( $par, $specialPage ) { if ( $limit < 0 || $limit > 5000 ) $limit = $defaults['limit']; - # Database connection and caching $dbr = wfGetDB( DB_SLAVE ); - list( $recentchanges, $watchlist ) = $dbr->tableNamesN( 'recentchanges', 'watchlist' ); - $cutoff_unixtime = time() - ( $days * 86400 ); $cutoff_unixtime = $cutoff_unixtime - ($cutoff_unixtime % 86400); @@ -132,16 +129,25 @@ function wfSpecialRecentchanges( $par, $specialPage ) { # It makes no sense to hide both anons and logged-in users # Where this occurs, force anons to be shown - if( $hideanons && $hideliu ) - $hideanons = false; + $forcebot = false; + if( $hideanons && $hideliu ){ + # Check if the user wants to show bots only + if( $hidebots ){ + $hideanons = 0; + } else { + $forcebot = true; + $hidebots = 0; + } + } # Form WHERE fragments for all the options $hidem = $hideminor ? 'AND rc_minor = 0' : ''; $hidem .= $hidebots ? ' AND rc_bot = 0' : ''; - $hidem .= $hideliu ? ' AND rc_user = 0' : ''; - $hidem .= ( $wgUseRCPatrol && $hidepatrolled ) ? ' AND rc_patrolled = 0' : ''; - $hidem .= $hideanons ? ' AND rc_user != 0' : ''; - + $hidem .= $hideliu && !$forcebot ? ' AND rc_user = 0' : ''; + $hidem .= ($wgUser->useRCPatrol() && $hidepatrolled ) ? ' AND rc_patrolled = 0' : ''; + $hidem .= $hideanons && !$forcebot ? ' AND rc_user != 0' : ''; + $hidem .= $forcebot ? ' AND rc_bot = 1' : ''; + if( $hidemyself ) { if( $wgUser->getID() ) { $hidem .= ' AND rc_user != ' . $wgUser->getID(); @@ -150,22 +156,51 @@ function wfSpecialRecentchanges( $par, $specialPage ) { } } - # Namespace filtering - $hidem .= is_null( $namespace ) ? '' : ' AND rc_namespace' . ($invert ? '!=' : '=') . $namespace; - - // This is the big thing! - + // JOIN on watchlist for users $uid = $wgUser->getID(); - - // Perform query - $forceclause = $dbr->useIndexClause("rc_timestamp"); - $sql2 = "SELECT * FROM $recentchanges $forceclause". - ($uid ? "LEFT OUTER JOIN $watchlist ON wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace " : "") . - "WHERE rc_timestamp >= '{$cutoff}' {$hidem} " . - "ORDER BY rc_timestamp DESC"; - $sql2 = $dbr->limitResult($sql2, $limit, 0); - $res = $dbr->query( $sql2, $fname ); - + if( $uid ) { + $tables = array( 'recentchanges', 'watchlist' ); + $join_conds = array( 'watchlist' => array('LEFT JOIN',"wl_user={$uid} AND wl_title=rc_title AND wl_namespace=rc_namespace") ); + } else { + $tables = array( 'recentchanges' ); + $join_conds = array(); + } + + # Namespace filtering + $hidem .= is_null($namespace) ? '' : ' AND rc_namespace' . ($invert ? '!=' : '=') . $namespace; + + // Is there either one namespace selected or excluded? + // Also, if this is "all" or main namespace, just use timestamp index. + if( is_null($namespace) || $invert || $namespace == NS_MAIN ) { + $res = $dbr->select( $tables, '*', + array( "rc_timestamp >= '{$cutoff}' {$hidem}" ), + __METHOD__, + array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit, + 'USE INDEX' => array('recentchanges' => 'rc_timestamp') ), + $join_conds ); + // We have a new_namespace_time index! UNION over new=(0,1) and sort result set! + } else { + // New pages + $sqlNew = $dbr->selectSQLText( $tables, '*', + array( 'rc_new' => 1, + "rc_timestamp >= '{$cutoff}' {$hidem}" ), + __METHOD__, + array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit, + 'USE INDEX' => array('recentchanges' => 'new_name_timestamp') ), + $join_conds ); + // Old pages + $sqlOld = $dbr->selectSQLText( $tables, '*', + array( 'rc_new' => 0, + "rc_timestamp >= '{$cutoff}' {$hidem}" ), + __METHOD__, + array( 'ORDER BY' => 'rc_timestamp DESC', 'LIMIT' => $limit, + 'USE INDEX' => array('recentchanges' => 'new_name_timestamp') ), + $join_conds ); + # Join the two fast queries, and sort the result set + $sql = "($sqlNew) UNION ($sqlOld) ORDER BY rc_timestamp DESC LIMIT $limit"; + $res = $dbr->query( $sql, __METHOD__ ); + } + // Fetch results, prepare a batch link existence check query $rows = array(); $batch = new LinkBatch; @@ -217,9 +252,9 @@ function wfSpecialRecentchanges( $par, $specialPage ) { // And now for the content $wgOut->setSyndicated( true ); - + $list = ChangesList::newFromUser( $wgUser ); - + if ( $wgAllowCategorizedRecentChanges ) { $categories = trim ( $wgRequest->getVal ( 'categories' , "" ) ) ; $categories = str_replace ( "|" , "\n" , $categories ) ; @@ -278,7 +313,7 @@ function rcFilterByCategories ( &$rows , $categories , $any ) { if( empty( $categories ) ) { return; } - + # Filter categories $cats = array () ; foreach ( $categories AS $cat ) { @@ -286,12 +321,12 @@ function rcFilterByCategories ( &$rows , $categories , $any ) { if ( $cat == "" ) continue ; $cats[] = $cat ; } - + # Filter articles $articles = array () ; $a2r = array () ; foreach ( $rows AS $k => $r ) { - $nt = Title::makeTitle( $r->rc_title , $r->rc_namespace ); + $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 ) ) { @@ -302,16 +337,16 @@ function rcFilterByCategories ( &$rows , $categories , $any ) { } $a2r[$id][] = $k ; } - + # Shortcut? if ( count ( $articles ) == 0 OR count ( $cats ) == 0 ) return ; - + # Look up $c = new Categoryfinder ; $c->seed ( $articles , $cats , $any ? "OR" : "AND" ) ; $match = $c->run () ; - + # Filter $newrows = array () ; foreach ( $match AS $id ) { @@ -327,7 +362,7 @@ function rcOutputFeed( $rows, $feedFormat, $limit, $hideminor, $lastmod ) { global $messageMemc, $wgFeedCacheTimeout; global $wgFeedClasses, $wgTitle, $wgSitename, $wgContLanguageCode; global $wgFeed; - + if ( !$wgFeed ) { global $wgOut; $wgOut->addWikiMsg( 'feed-unavailable' ); @@ -442,24 +477,26 @@ function rcDoOutputFeed( $rows, &$feed ) { /** * */ -function rcCountLink( $lim, $d, $page='Recentchanges', $more='' ) { +function rcCountLink( $lim, $d, $page='Recentchanges', $more='', $active = false ) { global $wgUser, $wgLang, $wgContLang; $sk = $wgUser->getSkin(); $s = $sk->makeKnownLink( $wgContLang->specialPage( $page ), ($lim ? $wgLang->formatNum( "{$lim}" ) : wfMsg( 'recentchangesall' ) ), "{$more}" . - ($d ? "days={$d}&" : '') . 'limit='.$lim ); + ($d ? "days={$d}&" : '') . 'limit='.$lim, '', '', + $active ? 'style="font-weight: bold;"' : '' ); return $s; } /** * */ -function rcDaysLink( $lim, $d, $page='Recentchanges', $more='' ) { +function rcDaysLink( $lim, $d, $page='Recentchanges', $more='', $active = false ) { global $wgUser, $wgLang, $wgContLang; $sk = $wgUser->getSkin(); $s = $sk->makeKnownLink( $wgContLang->specialPage( $page ), ($d ? $wgLang->formatNum( "{$d}" ) : wfMsg( 'recentchangesall' ) ), $more.'days='.$d . - ($lim ? '&limit='.$lim : '') ); + ($lim ? '&limit='.$lim : ''), '', '', + $active ? 'style="font-weight: bold;"' : '' ); return $s; } @@ -468,25 +505,37 @@ function rcDaysLink( $lim, $d, $page='Recentchanges', $more='' ) { */ function rcDayLimitLinks( $days, $limit, $page='Recentchanges', $more='', $doall = false, $minorLink = '', $botLink = '', $liuLink = '', $patrLink = '', $myselfLink = '' ) { + global $wgRCLinkLimits, $wgRCLinkDays; if ($more != '') $more .= '&'; - $cl = rcCountLink( 50, $days, $page, $more ) . ' | ' . - rcCountLink( 100, $days, $page, $more ) . ' | ' . - rcCountLink( 250, $days, $page, $more ) . ' | ' . - rcCountLink( 500, $days, $page, $more ) . - ( $doall ? ( ' | ' . rcCountLink( 0, $days, $page, $more ) ) : '' ); - $dl = rcDaysLink( $limit, 1, $page, $more ) . ' | ' . - rcDaysLink( $limit, 3, $page, $more ) . ' | ' . - rcDaysLink( $limit, 7, $page, $more ) . ' | ' . - rcDaysLink( $limit, 14, $page, $more ) . ' | ' . - rcDaysLink( $limit, 30, $page, $more ) . - ( $doall ? ( ' | ' . rcDaysLink( $limit, 0, $page, $more ) ) : '' ); + + # Sort data for display and make sure it's unique after we've added user data. + $wgRCLinkLimits[] = $limit; + $wgRCLinkDays[] = $days; + sort($wgRCLinkLimits); + sort($wgRCLinkDays); + $wgRCLinkLimits = array_unique($wgRCLinkLimits); + $wgRCLinkDays = array_unique($wgRCLinkDays); + + $cl = array(); + foreach( $wgRCLinkLimits as $countLink ) { + $cl[] = rcCountLink( $countLink, $days, $page, $more, $countLink == $limit ); + } + if( $doall ) $cl[] = rcCountLink( 0, $days, $page, $more ); + $cl = implode( ' | ', $cl); + + $dl = array(); + foreach( $wgRCLinkDays as $daysLink ) { + $dl[] = rcDaysLink( $limit, $daysLink, $page, $more, $daysLink == $days ); + } + if( $doall ) $dl[] = rcDaysLink( $limit, 0, $page, $more ); + $dl = implode( ' | ', $dl); $linkParts = array( 'minorLink' => 'minor', 'botLink' => 'bots', 'liuLink' => 'liu', 'patrLink' => 'patr', 'myselfLink' => 'mine' ); foreach( $linkParts as $linkVar => $linkMsg ) { if( $$linkVar != '' ) $links[] = wfMsgHtml( 'rcshowhide' . $linkMsg, $$linkVar ); } - + $shm = implode( ' | ', $links ); $note = wfMsg( 'rclinks', $cl, $dl, $shm ); return $note; @@ -499,11 +548,12 @@ function rcDayLimitLinks( $days, $limit, $page='Recentchanges', $more='', $doall * @param $override * @param $options */ -function makeOptionsLink( $title, $override, $options ) { +function makeOptionsLink( $title, $override, $options, $active = false ) { global $wgUser, $wgContLang; $sk = $wgUser->getSkin(); return $sk->makeKnownLink( $wgContLang->specialPage( 'Recentchanges' ), - htmlspecialchars( $title ), wfArrayToCGI( $override, $options ) ); + htmlspecialchars( $title ), wfArrayToCGI( $override, $options ), '', '', + $active ? 'style="font-weight: bold;"' : '' ); } /** @@ -512,7 +562,7 @@ function makeOptionsLink( $title, $override, $options ) { * @param $nondefaults */ function rcOptionsPanel( $defaults, $nondefaults ) { - global $wgLang, $wgUseRCPatrol; + global $wgLang, $wgUser, $wgRCLinkLimits, $wgRCLinkDays; $options = $nondefaults + $defaults; @@ -526,19 +576,25 @@ function rcOptionsPanel( $defaults, $nondefaults ) { $wgLang->formatNum( $options['days'] ), $wgLang->timeAndDate( wfTimestampNow(), true ) ); + # Sort data for display and make sure it's unique after we've added user data. + $wgRCLinkLimits[] = $options['limit']; + $wgRCLinkDays[] = $options['days']; + sort($wgRCLinkLimits); + sort($wgRCLinkDays); + $wgRCLinkLimits = array_unique($wgRCLinkLimits); + $wgRCLinkDays = array_unique($wgRCLinkDays); + // limit links - $options_limit = array(50, 100, 250, 500); - foreach( $options_limit as $value ) { + foreach( $wgRCLinkLimits as $value ) { $cl[] = makeOptionsLink( $wgLang->formatNum( $value ), - array( 'limit' => $value ), $nondefaults) ; + array( 'limit' => $value ), $nondefaults, $value == $options['limit'] ) ; } $cl = implode( ' | ', $cl); // day links, reset 'from' to none - $options_days = array(1, 3, 7, 14, 30); - foreach( $options_days as $value ) { + foreach( $wgRCLinkDays as $value ) { $dl[] = makeOptionsLink( $wgLang->formatNum( $value ), - array( 'days' => $value, 'from' => '' ), $nondefaults) ; + array( 'days' => $value, 'from' => '' ), $nondefaults, $value == $options['days'] ) ; } $dl = implode( ' | ', $dl); @@ -557,16 +613,16 @@ function rcOptionsPanel( $defaults, $nondefaults ) { array( 'hidepatrolled' => 1-$options['hidepatrolled'] ), $nondefaults); $myselfLink = makeOptionsLink( $showhide[1-$options['hidemyself']], array( 'hidemyself' => 1-$options['hidemyself'] ), $nondefaults); - + $links[] = wfMsgHtml( 'rcshowhideminor', $minorLink ); $links[] = wfMsgHtml( 'rcshowhidebots', $botLink ); $links[] = wfMsgHtml( 'rcshowhideanons', $anonsLink ); $links[] = wfMsgHtml( 'rcshowhideliu', $liuLink ); - if( $wgUseRCPatrol ) + if( $wgUser->useRCPatrol() ) $links[] = wfMsgHtml( 'rcshowhidepatr', $patrLink ); $links[] = wfMsgHtml( 'rcshowhidemine', $myselfLink ); $hl = implode( ' | ', $links ); - + // show from this onward link $now = $wgLang->timeanddate( wfTimestampNow(), true ); $tl = makeOptionsLink( $now, array( 'from' => wfTimestampNow()), $nondefaults ); @@ -598,7 +654,7 @@ function rcNamespaceForm( $namespace, $invert, $nondefaults, $categories_any ) { $namespaceselect = HTMLnamespaceselector($namespace, ''); $submitbutton = '\n"; $invertbox = "'; - + if ( $wgAllowCategorizedRecentChanges ) { $categories = trim ( $wgRequest->getVal ( 'categories' , "" ) ) ; $cb_arr = array( 'type' => 'checkbox', 'name' => 'categories_any', 'value' => "1" ) ; @@ -612,7 +668,7 @@ function rcNamespaceForm( $namespace, $invert, $nondefaults, $categories_any ) { } else { $catbox = "" ; } - + $out = "
\n"; foreach ( $nondefaults as $key => $value ) { @@ -643,7 +699,7 @@ function rcFormatDiff( $row ) { if( $row->rc_deleted & LogPage::DELETED_ACTION ) { $actiontext = wfMsgHtml('rev-deleted-event'); } else { - $actiontext = LogPage::actionText( $row->rc_log_type, $row->rc_log_action, + $actiontext = LogPage::actionText( $row->rc_log_type, $row->rc_log_action, $titleObj, $wgUser->getSkin(), LogPage::extractParams($row->rc_params,true,true) ); } } @@ -684,7 +740,7 @@ function rcFormatDiffRow( $title, $oldid, $newid, $timestamp, $comment, $actiont wfMsg( 'previousrevision' ), // hack wfMsg( 'revisionasof', $wgContLang->timeanddate( $timestamp ) ) ); - + if ( strlen( $diffText ) > $wgFeedDiffCutoff ) { // Omit large diffs @@ -741,13 +797,11 @@ function rcApplyDiffStyle( $text ) { 'diff-context' => 'background: #eee; color:black; font-size: smaller;', 'diffchange' => 'color: red; font-weight: bold; text-decoration: none;', ); - + foreach( $styles as $class => $style ) { $text = preg_replace( "/(<[^>]+)class=(['\"])$class\\2([^>]*>)/", "\\1style=\"$style\"\\3", $text ); } - + return $text; } - -