X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;ds=sidebyside;f=includes%2FSpecialWhatlinkshere.php;h=bed783f84a13eb6f6510f7e822b40b7c93254422;hb=a474761d9a03ccb7a7736c97b897268c7efe0e29;hp=8b363b83397b79c35cc4e248b857ac781b838346;hpb=b9e0a04c7d019e86caffa04e3aa12e5942fd0b2c;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialWhatlinkshere.php b/includes/SpecialWhatlinkshere.php index 8b363b8339..bed783f84a 100644 --- a/includes/SpecialWhatlinkshere.php +++ b/includes/SpecialWhatlinkshere.php @@ -10,131 +10,264 @@ * @param string $par An article name ?? */ function wfSpecialWhatlinkshere($par = NULL) { - global $wgUser, $wgOut, $wgRequest; - $fname = 'wfSpecialWhatlinkshere'; + global $wgRequest; + $page = new WhatLinksHerePage( $wgRequest, $par ); + $page->execute(); +} - $target = $wgRequest->getVal( 'target' ); - list( $limit, $offset ) = $wgRequest->getLimitOffset(); +class WhatLinksHerePage { + var $request, $par; + var $limit, $from, $dir, $target; + var $selfTitle, $skin; - if(!empty($par)) { - $target = $par; - } else if ( is_null( $target ) ) { - $wgOut->errorpage( 'notargettitle', 'notargettext' ); - return; + 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->dir = $this->request->getText( 'dir', 'next' ); + if ( $this->dir != 'prev' ) { + $this->dir = 'next'; + } + + $targetString = isset($this->par) ? $this->par : $this->request->getVal( 'target' ); + + if (is_null($targetString)) { + $wgOut->showErrorPage( 'notargettitle', 'notargettext' ); + return; + } + + $this->target = Title::newFromURL( $targetString ); + if( !$this->target ) { + $wgOut->showErrorPage( 'notargettitle', 'notargettext' ); + return; + } + $this->selfTitle = Title::makeTitleSafe( NS_SPECIAL, + 'Whatlinkshere/' . $this->target->getPrefixedDBkey() ); + $wgOut->setPagetitle( $this->target->getPrefixedText() ); + $wgOut->setSubtitle( wfMsg( 'linklistsub' ) ); + + $wgOut->addHTML( wfMsg( 'whatlinkshere-barrow' ) . ' ' .$this->skin->makeLinkObj($this->target, '', 'redirect=no' )."
\n"); + + $this->showIndirectLinks( 0, $this->target, $this->limit, $this->from, $this->dir ); } - $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 string $dir 'next' or 'prev', whether $fromTitle is the start or end of the list + * @private + */ + function showIndirectLinks( $level, $target, $limit, $from = 0, $dir = 'next' ) { + global $wgOut; + $fname = 'WhatLinksHerePage::showIndirectLinks'; - $wgOut->addHTML('< '.$sk->makeKnownLinkObj($nt, '', 'redirect=no' )."
\n"); + $dbr =& wfGetDB( DB_READ ); - $specialTitle = Title::makeTitle( NS_SPECIAL, 'Whatlinkshere' ); - $wgOut->addHTML( wfViewPrevNext( $offset, $limit, $specialTitle, 'target=' . urlencode( $target ) ) ); + // Some extra validation + $from = intval( $from ); + if ( !$from && $dir == 'prev' ) { + // Before start? No make sense + $dir = 'next'; + } - $dbr =& wfGetDB( DB_SLAVE ); - extract( $dbr->tableNames( 'page', 'brokenlinks', 'links' ) ); + // Make the query + $plConds = array( + 'page_id=pl_from', + 'pl_namespace' => $target->getNamespace(), + 'pl_title' => $target->getDBkey(), + ); - if ( 0 == $id ) { - $sql = "SELECT page_id,page_namespace,page_title,page_is_redirect FROM $brokenlinks,$page WHERE bl_to='" . - $dbr->strencode( $nt->getPrefixedDBkey() ) . "' AND bl_from=page_id " . - $dbr->limitResult( $limit, $offset ); - $res = $dbr->query( $sql, $fname ); + $tlConds = array( + 'page_id=tl_from', + 'tl_namespace' => $target->getNamespace(), + 'tl_title' => $target->getDBkey(), + ); - if ( 0 == $dbr->numRows( $res ) ) { - $wgOut->addHTML( wfMsg( 'nolinkshere' ) ); + if ( $from ) { + if ( 'prev' == $dir ) { + $offsetCond = "page_id < $from"; + $options = array( 'ORDER BY page_id DESC' ); + } else { + $offsetCond = "page_id >= $from"; + $options = array( 'ORDER BY page_id' ); + } } else { - $wgOut->addHTML( wfMsg( 'linkshere' ) ); - $wgOut->addHTML( "\n\n" ); - $dbr->freeResult( $res ); + return; } - } else { - wfShowIndirectLinks( 0, $id, $limit, $offset ); - } - $wgOut->addHTML( wfViewPrevNext( $offset, $limit, $specialTitle, 'target=' . urlencode( $target ) ) ); -} -/** - * - */ -function wfShowIndirectLinks( $level, $lid, $limit, $offset = 0 ) { - global $wgOut, $wgUser; - $fname = 'wfShowIndirectLinks'; - - $dbr =& wfGetDB( DB_READ ); - extract( $dbr->tableNames( 'links','page' ) ); - - if ( $level == 0 ) { - $limitSql = $dbr->limitResult( $limit, $offset ); - } else { - $limitSql = "LIMIT $limit"; - } + // Read the rows into an array and remove duplicates + // templatelinks comes second so that the templatelinks row overwrites the + // pagelinks row, so we get (inclusion) rather than nothing + while ( $row = $dbr->fetchObject( $plRes ) ) { + $row->is_template = 0; + $rows[$row->page_id] = $row; + } + $dbr->freeResult( $plRes ); + while ( $row = $dbr->fetchObject( $tlRes ) ) { + $row->is_template = 1; + $rows[$row->page_id] = $row; + } + $dbr->freeResult( $tlRes ); - $sql = "SELECT page_id,page_namespace,page_title,page_is_redirect FROM $links,$page WHERE l_to={$lid} AND l_from=page_id $limitSql"; - $res = $dbr->query( $sql, $fname ); + // Sort by key and then change the keys to 0-based indices + ksort( $rows ); + $rows = array_values( $rows ); + + $numRows = count( $rows ); + + // Work out the start and end IDs, for prev/next links + if ( $dir == 'prev' ) { + // Descending order + if ( $numRows > $limit ) { + // More rows available before these ones + // Get the ID from the next row past the end of the displayed set + $prevId = $rows[$limit]->page_id; + // Remove undisplayed rows + $rows = array_slice( $rows, 0, $limit ); + } else { + // No more rows available before + $prevId = 0; + } + // Assume that the ID specified in $from exists, so there must be another page + $nextId = $from; + + // Reverse order ready for display + $rows = array_reverse( $rows ); + } else { + // Ascending + if ( $numRows > $limit ) { + // More rows available after these ones + // Get the ID from the last row in the result set + $nextId = $rows[$limit]->page_id; + // Remove undisplayed rows + $rows = array_slice( $rows, 0, $limit ); + } else { + // No more rows after + $nextId = false; + } + $prevId = $from; + } - if ( 0 == $dbr->numRows( $res ) ) { if ( 0 == $level ) { - $wgOut->addHTML( wfMsg( 'nolinkshere' ) ); + $wgOut->addWikiText( wfMsg( 'linkshere', $this->target->getPrefixedText() ) ); + } + $isredir = wfMsg( 'isredirect' ); + $istemplate = wfMsg( 'istemplate' ); + + if( $level == 0 ) { + $prevnext = $this->getPrevNext( $limit, $prevId, $nextId ); + $wgOut->addHTML( $prevnext ); + } + + $wgOut->addHTML( '\n" ); + + if( $level == 0 ) { + $wgOut->addHTML( $prevnext ); } - return; } - if ( 0 == $level ) { - $wgOut->addHTML( wfMsg( 'linkshere' ) ); + + function makeSelfLink( $text, $query ) { + return $this->skin->makeKnownLinkObj( $this->selfTitle, $text, $query ); } - $sk = $wgUser->getSkin(); - $isredir = ' (' . wfMsg( 'isredirect' ) . ")\n"; - $wgOut->addHTML( '\n" ); } ?>