X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/mediawiki.git/blobdiff_plain/19e297c21b10b1b8a3acad5e73fc71dcb35db44a..6932310fd58ebef145fa01eb76edf7150284d8ea:/includes/specials/SpecialUnwatchedpages.php diff --git a/includes/specials/SpecialUnwatchedpages.php b/includes/specials/SpecialUnwatchedpages.php index ecd62cb7..fea7e216 100644 --- a/includes/specials/SpecialUnwatchedpages.php +++ b/includes/specials/SpecialUnwatchedpages.php @@ -24,6 +24,9 @@ * @author Ævar Arnfjörð Bjarmason */ +use Wikimedia\Rdbms\ResultWrapper; +use Wikimedia\Rdbms\IDatabase; + /** * A special page that displays a list of pages that are not on anyones watchlist. * @@ -31,62 +34,105 @@ */ class UnwatchedpagesPage extends QueryPage { - function getName() { return 'Unwatchedpages'; } - function isExpensive() { return true; } - function isSyndicated() { return false; } - - function getSQL() { - $dbr = wfGetDB( DB_SLAVE ); - list( $page, $watchlist ) = $dbr->tableNamesN( 'page', 'watchlist' ); - $mwns = NS_MEDIAWIKI; - return - " - SELECT - 'Unwatchedpages' as type, - page_namespace as namespace, - page_title as title, - page_namespace as value - FROM $page - LEFT JOIN $watchlist ON wl_namespace = page_namespace AND page_title = wl_title - WHERE wl_title IS NULL AND page_is_redirect = 0 AND page_namespace<>$mwns - "; + function __construct( $name = 'Unwatchedpages' ) { + parent::__construct( $name, 'unwatchedpages' ); + } + + public function isExpensive() { + return true; + } + + function isSyndicated() { + return false; + } + + /** + * Pre-cache page existence to speed up link generation + * + * @param IDatabase $db + * @param ResultWrapper $res + */ + public function preprocessResults( $db, $res ) { + if ( !$res->numRows() ) { + return; + } + + $batch = new LinkBatch(); + foreach ( $res as $row ) { + $batch->add( $row->namespace, $row->title ); + } + $batch->execute(); + + $res->seek( 0 ); + } + + public function getQueryInfo() { + $dbr = wfGetDB( DB_REPLICA ); + return [ + 'tables' => [ 'page', 'watchlist' ], + 'fields' => [ + 'namespace' => 'page_namespace', + 'title' => 'page_title', + 'value' => 'page_namespace' + ], + 'conds' => [ + 'wl_title IS NULL', + 'page_is_redirect' => 0, + 'page_namespace != ' . $dbr->addQuotes( NS_MEDIAWIKI ), + ], + 'join_conds' => [ 'watchlist' => [ + 'LEFT JOIN', [ 'wl_title = page_title', + 'wl_namespace = page_namespace' ] ] ] + ]; + } + + function sortDescending() { + return false; + } + + function getOrderFields() { + return [ 'page_namespace', 'page_title' ]; } - function sortDescending() { return false; } + /** + * Add the JS + * @param string|null $par + */ + public function execute( $par ) { + parent::execute( $par ); + $this->getOutput()->addModules( 'mediawiki.special.unwatchedPages' ); + } + /** + * @param Skin $skin + * @param object $result Result row + * @return string + */ function formatResult( $skin, $result ) { global $wgContLang; - $nt = Title::makeTitle( $result->namespace, $result->title ); + $nt = Title::makeTitleSafe( $result->namespace, $result->title ); + if ( !$nt ) { + return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ], + Linker::getInvalidTitleDescription( $this->getContext(), $result->namespace, $result->title ) ); + } + $text = $wgContLang->convert( $nt->getPrefixedText() ); - $plink = $skin->linkKnown( - $nt, - htmlspecialchars( $text ) - ); - $wlink = $skin->linkKnown( + $linkRenderer = $this->getLinkRenderer(); + + $plink = $linkRenderer->makeKnownLink( $nt, $text ); + $wlink = $linkRenderer->makeKnownLink( $nt, - wfMsgHtml( 'watch' ), - array(), - array( 'action' => 'watch' ) + $this->msg( 'watch' )->text(), + [ 'class' => 'mw-watch-link' ], + [ 'action' => 'watch' ] ); - return wfSpecialList( $plink, $wlink ); + return $this->getLanguage()->specialList( $plink, $wlink ); } -} -/** - * constructor - */ -function wfSpecialUnwatchedpages() { - global $wgUser, $wgOut; - - if ( ! $wgUser->isAllowed( 'unwatchedpages' ) ) - return $wgOut->permissionRequired( 'unwatchedpages' ); - - list( $limit, $offset ) = wfCheckLimits(); - - $wpp = new UnwatchedpagesPage(); - - $wpp->doQuery( $offset, $limit ); + protected function getGroupName() { + return 'maintenance'; + } }