summaryrefslogtreecommitdiff
path: root/includes/specials/SpecialWhatlinkshere.php
diff options
context:
space:
mode:
Diffstat (limited to 'includes/specials/SpecialWhatlinkshere.php')
-rw-r--r--includes/specials/SpecialWhatlinkshere.php53
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 ) {