diff options
Diffstat (limited to 'includes/specials/SpecialWhatlinkshere.php')
-rw-r--r-- | includes/specials/SpecialWhatlinkshere.php | 53 |
1 files changed, 42 insertions, 11 deletions
diff --git a/includes/specials/SpecialWhatlinkshere.php b/includes/specials/SpecialWhatlinkshere.php index 0b3175a6..39980d29 100644 --- a/includes/specials/SpecialWhatlinkshere.php +++ b/includes/specials/SpecialWhatlinkshere.php @@ -46,6 +46,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { $this->setHeaders(); $this->outputHeader(); + $this->addHelpLink( 'Help:What links here' ); $opts = new FormOptions(); @@ -154,7 +155,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { $conds['pagelinks'][] = 'rd_from is NOT NULL'; } - $queryFunc = function ( $dbr, $table, $fromCol ) use ( + $queryFunc = function ( IDatabase $dbr, $table, $fromCol ) use ( $conds, $target, $limit, $useLinkNamespaceDBFields ) { // Read an extra row as an at-end check @@ -169,11 +170,12 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { } // Inner LIMIT is 2X in case of stale backlinks with wrong namespaces $subQuery = $dbr->selectSqlText( - array( $table, 'page', 'redirect' ), + array( $table, 'redirect', 'page' ), array( $fromCol, 'rd_from' ), $conds[$table], __CLASS__ . '::showIndirectLinks', - array( 'ORDER BY' => $fromCol, 'LIMIT' => 2 * $queryLimit ), + // Force JOIN order per T106682 to avoid large filesorts + array( 'ORDER BY' => $fromCol, 'LIMIT' => 2 * $queryLimit, 'STRAIGHT_JOIN' ), array( 'page' => array( 'INNER JOIN', "$fromCol = page_id" ), 'redirect' => array( 'LEFT JOIN', $on ) @@ -266,6 +268,14 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { } $prevId = $from; + // use LinkBatch to make sure, that all required data (associated with Titles) + // is loaded in one query + $lb = new LinkBatch(); + foreach ( $rows as $row ) { + $lb->add( $row->page_namespace, $row->page_title ); + } + $lb->execute(); + if ( $level == 0 ) { if ( !$this->including() ) { $out->addHTML( $this->whatlinkshereForm() ); @@ -313,7 +323,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { static $msgcache = null; if ( $msgcache === null ) { static $msgs = array( 'isredirect', 'istemplate', 'semicolon-separator', - 'whatlinkshere-links', 'isimage' ); + 'whatlinkshere-links', 'isimage', 'editlink' ); $msgcache = array(); foreach ( $msgs as $msg ) { $msgcache[$msg] = $this->msg( $msg )->escaped(); @@ -354,7 +364,7 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { } # Space for utilities links, with a what-links-here link provided - $wlhLink = $this->wlhLink( $nt, $msgcache['whatlinkshere-links'] ); + $wlhLink = $this->wlhLink( $nt, $msgcache['whatlinkshere-links'], $msgcache['editlink'] ); $wlh = Xml::wrapClass( $this->msg( 'parentheses' )->rawParams( $wlhLink )->escaped(), 'mw-whatlinkshere-tools' @@ -369,18 +379,39 @@ class SpecialWhatLinksHere extends IncludableSpecialPage { return Xml::closeElement( 'ul' ); } - protected function wlhLink( Title $target, $text ) { + protected function wlhLink( Title $target, $text, $editText ) { static $title = null; if ( $title === null ) { $title = $this->getPageTitle(); } - return Linker::linkKnown( - $title, - $text, - array(), - array( 'target' => $target->getPrefixedText() ) + // always show a "<- Links" link + $links = array( + 'links' => Linker::linkKnown( + $title, + $text, + array(), + array( 'target' => $target->getPrefixedText() ) + ), ); + + // if the page is editable, add an edit link + if ( + // check user permissions + $this->getUser()->isAllowed( 'edit' ) && + // check, if the content model is editable through action=edit + ContentHandler::getForTitle( $target )->supportsDirectEditing() + ) { + $links['edit'] = Linker::linkKnown( + $target, + $editText, + array(), + array( 'action' => 'edit' ) + ); + } + + // build the links html + return $this->getLanguage()->pipeList( $links ); } function makeSelfLink( $text, $query ) { |