X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSpecialWhatlinkshere.php;h=b0ae19c30a6c356b93c7424168fc7c1720740a26;hb=38c54a4528b60b3bfe24c11d8631bf899586730c;hp=8d1c4ba55626bad9af5cd1847a3788942d1b40a6;hpb=65ddd4bd1d7f2accc6c60532930ea557fe3de374;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialWhatlinkshere.php b/includes/SpecialWhatlinkshere.php index 8d1c4ba556..b0ae19c30a 100644 --- a/includes/SpecialWhatlinkshere.php +++ b/includes/SpecialWhatlinkshere.php @@ -1,113 +1,322 @@ -execute(); +} - if($par) { - $target = $par; - } else { - $target = wfCleanQueryVar( $_REQUEST['target'] ); - } - if ( "" == $target ) { - $wgOut->errorpage( "notargettitle", "notargettext" ); - return; +/** + * implements Special:Whatlinkshere + * @addtogroup SpecialPage + */ +class WhatLinksHerePage { + var $request, $par; + var $limit, $from, $back, $target; + var $selfTitle, $skin; + + private $namespace; + + function WhatLinksHerePage( &$request, $par = null ) { + global $wgUser; + $this->request =& $request; + $this->skin = $wgUser->getSkin(); + $this->par = $par; } - $nt = Title::newFromURL( $target ); - if( !$nt ) { - $wgOut->errorpage( "notargettitle", "notargettext" ); - return; + + function execute() { + global $wgOut; + + $this->limit = min( $this->request->getInt( 'limit', 50 ), 5000 ); + if ( $this->limit <= 0 ) { + $this->limit = 50; + } + $this->from = $this->request->getInt( 'from' ); + $this->back = $this->request->getInt( 'back' ); + + $targetString = isset($this->par) ? $this->par : $this->request->getVal( 'target' ); + + if ( is_null( $targetString ) ) { + $wgOut->addHTML( $this->whatlinkshereForm() ); + return; + } + + $this->target = Title::newFromURL( $targetString ); + if( !$this->target ) { + $wgOut->addHTML( $this->whatlinkshereForm() ); + return; + } + $this->selfTitle = Title::makeTitleSafe( NS_SPECIAL, + 'Whatlinkshere/' . $this->target->getPrefixedDBkey() ); + + $wgOut->setPageTitle( wfMsg( 'whatlinkshere-title', $this->target->getPrefixedText() ) ); + $wgOut->setSubtitle( wfMsg( 'linklistsub' ) ); + + $wgOut->addHTML( wfMsgExt( 'whatlinkshere-barrow', array( 'escapenoentities') ) . ' ' .$this->skin->makeLinkObj($this->target, '', 'redirect=no' )."
\n"); + + $this->showIndirectLinks( 0, $this->target, $this->limit, $this->from, $this->back ); } - $wgOut->setPagetitle( $nt->getPrefixedText() ); - $wgOut->setSubtitle( wfMsg( "linklistsub" ) ); - $id = $nt->getArticleID(); - $sk = $wgUser->getSkin(); - $isredir = " (" . wfMsg( "isredirect" ) . ")\n"; + /** + * @param int $level Recursion level + * @param Title $target Target title + * @param int $limit Number of entries to display + * @param Title $from Display from this article ID + * @param Title $back Display from this article ID at backwards scrolling + * @private + */ + function showIndirectLinks( $level, $target, $limit, $from = 0, $back = 0 ) { + global $wgOut; + $fname = 'WhatLinksHerePage::showIndirectLinks'; + $dbr = wfGetDB( DB_READ ); + $options = array(); + + $ns = $this->request->getIntOrNull( 'namespace' ); + if ( isset( $ns ) ) { + $options['namespace'] = $ns; + $this->setNamespace( $options['namespace'] ); + } else { + $options['namespace'] = ''; + } + + // Make the query + $plConds = array( + 'page_id=pl_from', + 'pl_namespace' => $target->getNamespace(), + 'pl_title' => $target->getDBkey(), + ); - if ( 0 == $id ) { - $sql = "SELECT DISTINCT bl_from FROM brokenlinks WHERE bl_to='" . - wfStrencode( $nt->getPrefixedDBkey() ) . "' LIMIT 500"; - $res = wfQuery( $sql, DB_READ, $fname ); + $tlConds = array( + 'page_id=tl_from', + 'tl_namespace' => $target->getNamespace(), + 'tl_title' => $target->getDBkey(), + ); - if ( 0 == wfNumRows( $res ) ) { - $wgOut->addHTML( wfMsg( "nolinkshere" ) ); + if ( $this->namespace !== null ){ + $plConds['page_namespace'] = (int)$this->namespace; + $tlConds['page_namespace'] = (int)$this->namespace; + } + + if ( $from ) { + $from = (int)$from; // just in case + $tlConds[] = "tl_from >= $from"; + $plConds[] = "pl_from >= $from"; + } + + // Read an extra row as an at-end check + $queryLimit = $limit + 1; + + // enforce join order, sometimes namespace selector may + // trigger filesorts which are far less efficient than scanning many entries + $options[] = 'STRAIGHT_JOIN'; + + $options['LIMIT'] = $queryLimit; + $fields = array( 'page_id', 'page_namespace', 'page_title', 'page_is_redirect' ); + + $options['ORDER BY'] = 'pl_from'; + $plRes = $dbr->select( array( 'pagelinks', 'page' ), $fields, + $plConds, $fname, $options ); + + $options['ORDER BY'] = 'tl_from'; + $tlRes = $dbr->select( array( 'templatelinks', 'page' ), $fields, + $tlConds, $fname, $options ); + + if ( !$dbr->numRows( $plRes ) && !$dbr->numRows( $tlRes ) ) { + if ( 0 == $level ) { + $options = array(); // reinitialize for a further namespace search + // really no links to here + $options['namespace'] = $this->namespace; + $options['target'] = $this->target->getPrefixedText(); + list( $options['limit'], $options['offset']) = wfCheckLimits(); + $wgOut->addHTML( $this->whatlinkshereForm( $options ) ); + $errMsg = isset( $this->namespace ) ? 'nolinkshere-ns' : 'nolinkshere'; + $wgOut->addWikiText( wfMsg( $errMsg, $this->target->getPrefixedText() ) ); + } + return; + } + + $options = array(); + list( $options['limit'], $options['offset']) = wfCheckLimits(); + if ( ( $ns = $this->request->getVal( 'namespace', null ) ) !== null && $ns !== '' && ctype_digit($ns) ) { + $options['namespace'] = intval( $ns ); + $this->setNamespace( $options['namespace'] ); } else { - $wgOut->addHTML( wfMsg( "linkshere" ) ); - $wgOut->addHTML( "\n\n" ); + + if( $level == 0 ) { + $wgOut->addHTML( $prevnext ); } - } else { - wfShowIndirectLinks( 0, $id ); } -} -function wfShowIndirectLinks( $level, $lid ) -{ - global $wgOut, $wgUser; - $fname = "wfShowIndirectLinks"; + function makeSelfLink( $text, $query ) { + return $this->skin->makeKnownLinkObj( $this->selfTitle, $text, $query ); + } + + function getPrevNext( $limit, $prevId, $nextId ) { + global $wgLang; + $fmtLimit = $wgLang->formatNum( $limit ); + $prev = wfMsgExt( 'whatlinkshere-prev', array( 'parsemag', 'escape' ), $fmtLimit ); + $next = wfMsgExt( 'whatlinkshere-next', array( 'parsemag', 'escape' ), $fmtLimit ); - $sql = "SELECT DISTINCT l_from FROM links WHERE l_to={$lid} LIMIT 500"; - $res = wfQuery( $sql, DB_READ, $fname ); + $nsText = ''; + if( is_int($this->namespace) ) { + $nsText = "&namespace={$this->namespace}"; + } - if ( 0 == wfNumRows( $res ) ) { - if ( 0 == $level ) { - $wgOut->addHTML( wfMsg( "nolinkshere" ) ); + if ( 0 != $prevId ) { + $prevLink = $this->makeSelfLink( $prev, "limit={$limit}&from={$this->back}{$nsText}" ); + } else { + $prevLink = $prev; + } + if ( 0 != $nextId ) { + $nextLink = $this->makeSelfLink( $next, "limit={$limit}&from={$nextId}&back={$prevId}{$nsText}" ); + } else { + $nextLink = $next; } - return; + $nums = $this->numLink( 20, $prevId ) . ' | ' . + $this->numLink( 50, $prevId ) . ' | ' . + $this->numLink( 100, $prevId ) . ' | ' . + $this->numLink( 250, $prevId ) . ' | ' . + $this->numLink( 500, $prevId ); + + return wfMsgHtml( 'viewprevnext', $prevLink, $nextLink, $nums ); } - if ( 0 == $level ) { - $wgOut->addHTML( wfMsg( "linkshere" ) ); + + function numLink( $limit, $from, $ns = null ) { + global $wgLang; + $query = "limit={$limit}&from={$from}"; + if( is_int($this->namespace) ) { $query .= "&namespace={$this->namespace}";} + $fmtLimit = $wgLang->formatNum( $limit ); + return $this->makeSelfLink( $fmtLimit, $query ); } - $sk = $wgUser->getSkin(); - $isredir = " (" . wfMsg( "isredirect" ) . ")\n"; - - $wgOut->addHTML( "\n" ); -} -?> +}