2004-02-18 02:15:00 +00:00
|
|
|
<?php
|
2003-04-14 23:10:40 +00:00
|
|
|
|
2007-04-20 08:55:14 +00:00
|
|
|
/**
|
|
|
|
|
* Implements Special:Allpages
|
WARNING: HUGE COMMIT
Doxygen documentation update:
* Changed alls @addtogroup to @ingroup. @addtogroup adds the comment to the group description, but doesn't add the file, class, function, ... to the group like @ingroup does. See for example http://svn.wikimedia.org/doc/group__SpecialPage.html where it's impossible to see related files, classes, ... that should belong to that group.
* Added @file to file description, it seems that it should be explicitely decalred for file descriptions, otherwise doxygen will think that the comment document the first class, variabled, function, ... that is in that file.
* Removed some empty comments
* Removed some ?>
Added following groups:
* ExternalStorage
* JobQueue
* MaintenanceLanguage
One more thing: there are still a lot of warnings when generating the doc.
2008-05-20 17:13:28 +00:00
|
|
|
* @ingroup SpecialPage
|
2007-04-20 08:55:14 +00:00
|
|
|
*/
|
2008-08-23 20:32:46 +00:00
|
|
|
class SpecialAllpages extends IncludableSpecialPage {
|
|
|
|
|
|
2007-12-24 11:21:37 +00:00
|
|
|
/**
|
2008-08-20 16:13:49 +00:00
|
|
|
* Maximum number of pages to show on single subpage.
|
2008-08-17 00:39:46 +00:00
|
|
|
*/
|
2008-08-20 17:50:13 +00:00
|
|
|
protected $maxPerPage = 345;
|
|
|
|
|
|
2009-01-01 22:31:50 +00:00
|
|
|
/**
|
|
|
|
|
* Maximum number of pages to show on single index subpage.
|
|
|
|
|
*/
|
2009-06-01 19:32:11 +00:00
|
|
|
protected $maxLineCount = 100;
|
2008-08-20 17:50:13 +00:00
|
|
|
|
2009-01-01 22:31:50 +00:00
|
|
|
/**
|
|
|
|
|
* Maximum number of chars to show for an entry.
|
|
|
|
|
*/
|
|
|
|
|
protected $maxPageLength = 70;
|
2007-12-24 11:21:37 +00:00
|
|
|
|
|
|
|
|
/**
|
2008-08-23 20:32:46 +00:00
|
|
|
* Determines, which message describes the input field 'nsfrom'.
|
2007-12-24 11:21:37 +00:00
|
|
|
*/
|
2008-08-23 20:32:46 +00:00
|
|
|
protected $nsfromMsg = 'allpagesfrom';
|
|
|
|
|
|
|
|
|
|
function __construct( $name = 'Allpages' ){
|
2009-02-20 16:13:40 +00:00
|
|
|
parent::__construct( $name );
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
2007-12-24 11:21:37 +00:00
|
|
|
|
2008-08-20 16:13:49 +00:00
|
|
|
/**
|
2008-08-23 20:32:46 +00:00
|
|
|
* Entry point : initialise variables and call subfunctions.
|
|
|
|
|
* @param $par String: becomes "FOO" when called like Special:Allpages/FOO (default NULL)
|
|
|
|
|
* @param $specialPage See the SpecialPage object.
|
2008-08-20 16:13:49 +00:00
|
|
|
*/
|
2008-08-23 20:32:46 +00:00
|
|
|
function execute( $par ) {
|
|
|
|
|
global $wgRequest, $wgOut, $wgContLang;
|
2008-08-20 16:13:49 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
$this->setHeaders();
|
|
|
|
|
$this->outputHeader();
|
2004-08-13 07:46:33 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
# GET values
|
|
|
|
|
$from = $wgRequest->getVal( 'from', null );
|
|
|
|
|
$to = $wgRequest->getVal( 'to', null );
|
|
|
|
|
$namespace = $wgRequest->getInt( 'namespace' );
|
2005-08-02 20:59:00 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
$namespaces = $wgContLang->getNamespaces();
|
|
|
|
|
|
2009-06-01 19:32:11 +00:00
|
|
|
$wgOut->setPagetitle(
|
|
|
|
|
( $namespace > 0 && in_array( $namespace, array_keys( $namespaces) ) ) ?
|
2008-08-23 20:32:46 +00:00
|
|
|
wfMsg( 'allinnamespace', str_replace( '_', ' ', $namespaces[$namespace] ) ) :
|
|
|
|
|
wfMsg( 'allarticles' )
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if( isset($par) ) {
|
|
|
|
|
$this->showChunk( $namespace, $par, $to );
|
|
|
|
|
} elseif( isset($from) && !isset($to) ) {
|
|
|
|
|
$this->showChunk( $namespace, $from, $to );
|
|
|
|
|
} else {
|
|
|
|
|
$this->showToplevel( $namespace, $from, $to );
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* HTML for the top form
|
|
|
|
|
* @param integer $namespace A namespace constant (default NS_MAIN).
|
|
|
|
|
* @param string $from dbKey we are starting listing at.
|
|
|
|
|
* @param string $to dbKey we are ending listing at.
|
|
|
|
|
*/
|
|
|
|
|
function namespaceForm( $namespace = NS_MAIN, $from = '', $to = '' ) {
|
2009-06-07 18:45:52 +00:00
|
|
|
global $wgScript;
|
|
|
|
|
$t = $this->getTitle();
|
|
|
|
|
|
|
|
|
|
$out = Xml::openElement( 'div', array( 'class' => 'namespaceoptions' ) );
|
|
|
|
|
$out .= Xml::openElement( 'form', array( 'method' => 'get', 'action' => $wgScript ) );
|
|
|
|
|
$out .= Xml::hidden( 'title', $t->getPrefixedText() );
|
|
|
|
|
$out .= Xml::openElement( 'fieldset' );
|
|
|
|
|
$out .= Xml::element( 'legend', null, wfMsg( 'allpages' ) );
|
|
|
|
|
$out .= Xml::openElement( 'table', array( 'id' => 'nsselect', 'class' => 'allpages' ) );
|
|
|
|
|
$out .= "<tr>
|
|
|
|
|
<td class='mw-label'>" .
|
|
|
|
|
Xml::label( wfMsg( 'allpagesfrom' ), 'nsfrom' ) .
|
|
|
|
|
" </td>
|
|
|
|
|
<td class='mw-input'>" .
|
|
|
|
|
Xml::input( 'from', 30, str_replace('_',' ',$from), array( 'id' => 'nsfrom' ) ) .
|
|
|
|
|
" </td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td class='mw-label'>" .
|
|
|
|
|
Xml::label( wfMsg( 'allpagesto' ), 'nsto' ) .
|
|
|
|
|
" </td>
|
|
|
|
|
<td class='mw-input'>" .
|
|
|
|
|
Xml::input( 'to', 30, str_replace('_',' ',$to), array( 'id' => 'nsto' ) ) .
|
|
|
|
|
" </td>
|
|
|
|
|
</tr>
|
|
|
|
|
<tr>
|
|
|
|
|
<td class='mw-label'>" .
|
|
|
|
|
Xml::label( wfMsg( 'namespace' ), 'namespace' ) .
|
|
|
|
|
" </td>
|
|
|
|
|
<td class='mw-input'>" .
|
|
|
|
|
Xml::namespaceSelector( $namespace, null ) . ' ' .
|
|
|
|
|
Xml::submitButton( wfMsg( 'allpagessubmit' ) ) .
|
|
|
|
|
" </td>
|
|
|
|
|
</tr>";
|
|
|
|
|
$out .= Xml::closeElement( 'table' );
|
|
|
|
|
$out .= Xml::closeElement( 'fieldset' );
|
|
|
|
|
$out .= Xml::closeElement( 'form' );
|
|
|
|
|
$out .= Xml::closeElement( 'div' );
|
|
|
|
|
return $out;
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param integer $namespace (default NS_MAIN)
|
|
|
|
|
*/
|
|
|
|
|
function showToplevel( $namespace = NS_MAIN, $from = '', $to = '' ) {
|
2009-04-15 09:36:53 +00:00
|
|
|
global $wgOut;
|
2008-08-23 20:32:46 +00:00
|
|
|
|
|
|
|
|
# TODO: Either make this *much* faster or cache the title index points
|
|
|
|
|
# in the querycache table.
|
|
|
|
|
|
|
|
|
|
$dbr = wfGetDB( DB_SLAVE );
|
|
|
|
|
$out = "";
|
|
|
|
|
$where = array( 'page_namespace' => $namespace );
|
|
|
|
|
|
|
|
|
|
$from = Title::makeTitleSafe( $namespace, $from );
|
|
|
|
|
$to = Title::makeTitleSafe( $namespace, $to );
|
2009-05-24 08:29:10 +00:00
|
|
|
$from = ( $from && $from->isLocal() ) ? $from->getDBkey() : null;
|
|
|
|
|
$to = ( $to && $to->isLocal() ) ? $to->getDBkey() : null;
|
2008-08-23 20:32:46 +00:00
|
|
|
|
|
|
|
|
if( isset($from) )
|
|
|
|
|
$where[] = 'page_title >= '.$dbr->addQuotes( $from );
|
|
|
|
|
if( isset($to) )
|
|
|
|
|
$where[] = 'page_title <= '.$dbr->addQuotes( $to );
|
|
|
|
|
|
|
|
|
|
global $wgMemc;
|
|
|
|
|
$key = wfMemcKey( 'allpages', 'ns', $namespace, $from, $to );
|
2008-08-23 20:35:23 +00:00
|
|
|
$lines = $wgMemc->get( $key );
|
2008-08-23 20:32:46 +00:00
|
|
|
|
|
|
|
|
$count = $dbr->estimateRowCount( 'page', '*', $where, __METHOD__ );
|
|
|
|
|
$maxPerSubpage = intval($count/$this->maxLineCount);
|
|
|
|
|
$maxPerSubpage = max($maxPerSubpage,$this->maxPerPage);
|
|
|
|
|
|
|
|
|
|
if( !is_array( $lines ) ) {
|
|
|
|
|
$options = array( 'LIMIT' => 1 );
|
|
|
|
|
$options['ORDER BY'] = 'page_title ASC';
|
|
|
|
|
$firstTitle = $dbr->selectField( 'page', 'page_title', $where, __METHOD__, $options );
|
|
|
|
|
$lastTitle = $firstTitle;
|
|
|
|
|
# This array is going to hold the page_titles in order.
|
|
|
|
|
$lines = array( $firstTitle );
|
|
|
|
|
# If we are going to show n rows, we need n+1 queries to find the relevant titles.
|
|
|
|
|
$done = false;
|
|
|
|
|
while( !$done ) {
|
|
|
|
|
// Fetch the last title of this chunk and the first of the next
|
2008-10-10 18:15:53 +00:00
|
|
|
$chunk = ( $lastTitle === false )
|
|
|
|
|
? array()
|
|
|
|
|
: array( 'page_title >= ' . $dbr->addQuotes( $lastTitle ) );
|
2008-08-23 20:32:46 +00:00
|
|
|
$res = $dbr->select( 'page', /* FROM */
|
|
|
|
|
'page_title', /* WHAT */
|
|
|
|
|
array_merge($where,$chunk),
|
|
|
|
|
__METHOD__,
|
|
|
|
|
array ('LIMIT' => 2, 'OFFSET' => $maxPerSubpage - 1, 'ORDER BY' => 'page_title ASC')
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
if( $s = $dbr->fetchObject( $res ) ) {
|
|
|
|
|
array_push( $lines, $s->page_title );
|
|
|
|
|
} else {
|
|
|
|
|
// Final chunk, but ended prematurely. Go back and find the end.
|
|
|
|
|
$endTitle = $dbr->selectField( 'page', 'MAX(page_title)',
|
|
|
|
|
array_merge($where,$chunk),
|
|
|
|
|
__METHOD__ );
|
|
|
|
|
array_push( $lines, $endTitle );
|
|
|
|
|
$done = true;
|
|
|
|
|
}
|
|
|
|
|
if( $s = $res->fetchObject() ) {
|
|
|
|
|
array_push( $lines, $s->page_title );
|
|
|
|
|
$lastTitle = $s->page_title;
|
|
|
|
|
} else {
|
|
|
|
|
// This was a final chunk and ended exactly at the limit.
|
|
|
|
|
// Rare but convenient!
|
|
|
|
|
$done = true;
|
|
|
|
|
}
|
|
|
|
|
$res->free();
|
2005-07-18 22:15:05 +00:00
|
|
|
}
|
2008-08-23 20:32:46 +00:00
|
|
|
$wgMemc->add( $key, $lines, 3600 );
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If there are only two or less sections, don't even display them.
|
|
|
|
|
// Instead, display the first section directly.
|
|
|
|
|
if( count( $lines ) <= 2 ) {
|
|
|
|
|
if( !empty($lines) ) {
|
2009-06-01 19:32:11 +00:00
|
|
|
$this->showChunk( $namespace, $from, $to );
|
2005-07-18 22:15:05 +00:00
|
|
|
} else {
|
2008-11-06 22:20:29 +00:00
|
|
|
$wgOut->addHTML( $this->namespaceForm( $namespace, $from, $to ) );
|
2005-04-25 15:35:02 +00:00
|
|
|
}
|
2008-08-23 20:32:46 +00:00
|
|
|
return;
|
2004-08-13 07:46:33 +00:00
|
|
|
}
|
2006-01-07 13:31:29 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
# At this point, $lines should contain an even number of elements.
|
2009-04-15 09:36:53 +00:00
|
|
|
$out .= Xml::openElement( 'table', array( 'class' => 'allpageslist' ) );
|
2008-08-23 20:32:46 +00:00
|
|
|
while( count ( $lines ) > 0 ) {
|
|
|
|
|
$inpoint = array_shift( $lines );
|
|
|
|
|
$outpoint = array_shift( $lines );
|
|
|
|
|
$out .= $this->showline( $inpoint, $outpoint, $namespace );
|
2008-08-20 17:50:13 +00:00
|
|
|
}
|
2009-04-15 09:36:53 +00:00
|
|
|
$out .= Xml::closeElement( 'table' );
|
2008-08-23 20:32:46 +00:00
|
|
|
$nsForm = $this->namespaceForm( $namespace, $from, $to );
|
2004-07-08 16:50:22 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
# Is there more?
|
|
|
|
|
if( $this->including() ) {
|
|
|
|
|
$out2 = '';
|
2005-05-28 11:09:22 +00:00
|
|
|
} else {
|
2008-08-23 20:32:46 +00:00
|
|
|
if( isset($from) || isset($to) ) {
|
|
|
|
|
global $wgUser;
|
2009-04-15 09:36:53 +00:00
|
|
|
$out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
|
|
|
|
|
'<tr>
|
|
|
|
|
<td>' .
|
|
|
|
|
$nsForm .
|
|
|
|
|
'</td>
|
|
|
|
|
<td class="mw-allpages-nav">' .
|
|
|
|
|
$wgUser->getSkin()->link( $this->getTitle(), wfMsgHtml ( 'allpages' ),
|
|
|
|
|
array(), array(), 'known' ) .
|
|
|
|
|
"</td>
|
|
|
|
|
</tr>" .
|
|
|
|
|
Xml::closeElement( 'table' );
|
2008-08-23 20:32:46 +00:00
|
|
|
} else {
|
2009-01-07 16:40:44 +00:00
|
|
|
$out2 = $nsForm;
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
2005-05-28 11:09:22 +00:00
|
|
|
}
|
2008-11-06 22:20:29 +00:00
|
|
|
$wgOut->addHTML( $out2 . $out );
|
2004-08-13 07:46:33 +00:00
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
/**
|
2008-10-06 15:31:03 +00:00
|
|
|
* Show a line of "ABC to DEF" ranges of articles
|
|
|
|
|
* @param string $inpoint Lower limit of pagenames
|
|
|
|
|
* @param string $outpout Upper limit of pagenames
|
2008-08-23 20:32:46 +00:00
|
|
|
* @param integer $namespace (Default NS_MAIN)
|
|
|
|
|
*/
|
|
|
|
|
function showline( $inpoint, $outpoint, $namespace = NS_MAIN ) {
|
|
|
|
|
global $wgContLang;
|
|
|
|
|
$inpointf = htmlspecialchars( str_replace( '_', ' ', $inpoint ) );
|
|
|
|
|
$outpointf = htmlspecialchars( str_replace( '_', ' ', $outpoint ) );
|
|
|
|
|
// Don't let the length runaway
|
2009-02-13 19:13:48 +00:00
|
|
|
$inpointf = $wgContLang->truncate( $inpointf, $this->maxPageLength );
|
|
|
|
|
$outpointf = $wgContLang->truncate( $outpointf, $this->maxPageLength );
|
2008-08-23 20:32:46 +00:00
|
|
|
|
|
|
|
|
$queryparams = $namespace ? "namespace=$namespace&" : '';
|
|
|
|
|
$special = $this->getTitle();
|
|
|
|
|
$link = $special->escapeLocalUrl( $queryparams . 'from=' . urlencode($inpoint) . '&to=' . urlencode($outpoint) );
|
|
|
|
|
|
|
|
|
|
$out = wfMsgHtml( 'alphaindexline',
|
|
|
|
|
"<a href=\"$link\">$inpointf</a></td><td>",
|
|
|
|
|
"</td><td><a href=\"$link\">$outpointf</a>"
|
|
|
|
|
);
|
2009-04-15 09:43:02 +00:00
|
|
|
return '<tr><td class="mw-allpages-alphaindexline">' . $out . '</td></tr>';
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
2003-04-14 23:10:40 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
/**
|
|
|
|
|
* @param integer $namespace (Default NS_MAIN)
|
|
|
|
|
* @param string $from list all pages from this name (default FALSE)
|
|
|
|
|
* @param string $to list all pages to this name (default FALSE)
|
|
|
|
|
*/
|
|
|
|
|
function showChunk( $namespace = NS_MAIN, $from = false, $to = false ) {
|
2009-02-09 17:48:41 +00:00
|
|
|
global $wgOut, $wgUser, $wgContLang, $wgLang;
|
2004-07-08 16:50:22 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
$sk = $wgUser->getSkin();
|
2006-11-08 07:12:03 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
$fromList = $this->getNamespaceKeyAndText($namespace, $from);
|
|
|
|
|
$toList = $this->getNamespaceKeyAndText( $namespace, $to );
|
|
|
|
|
$namespaces = $wgContLang->getNamespaces();
|
|
|
|
|
$n = 0;
|
2007-06-26 07:21:28 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
if ( !$fromList || !$toList ) {
|
|
|
|
|
$out = wfMsgWikiHtml( 'allpagesbadtitle' );
|
|
|
|
|
} elseif ( !in_array( $namespace, array_keys( $namespaces ) ) ) {
|
|
|
|
|
// Show errormessage and reset to NS_MAIN
|
|
|
|
|
$out = wfMsgExt( 'allpages-bad-ns', array( 'parseinline' ), $namespace );
|
|
|
|
|
$namespace = NS_MAIN;
|
|
|
|
|
} else {
|
|
|
|
|
list( $namespace, $fromKey, $from ) = $fromList;
|
2008-08-27 20:28:12 +00:00
|
|
|
list( $namespace2, $toKey, $to ) = $toList;
|
2006-07-02 14:39:47 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
$dbr = wfGetDB( DB_SLAVE );
|
|
|
|
|
$conds = array(
|
|
|
|
|
'page_namespace' => $namespace,
|
|
|
|
|
'page_title >= ' . $dbr->addQuotes( $fromKey )
|
|
|
|
|
);
|
|
|
|
|
if( $toKey !== "" ) {
|
|
|
|
|
$conds[] = 'page_title <= ' . $dbr->addQuotes( $toKey );
|
|
|
|
|
}
|
2008-08-20 17:50:13 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
$res = $dbr->select( 'page',
|
|
|
|
|
array( 'page_namespace', 'page_title', 'page_is_redirect' ),
|
|
|
|
|
$conds,
|
|
|
|
|
__METHOD__,
|
|
|
|
|
array(
|
|
|
|
|
'ORDER BY' => 'page_title',
|
|
|
|
|
'LIMIT' => $this->maxPerPage + 1,
|
|
|
|
|
'USE INDEX' => 'name_title',
|
|
|
|
|
)
|
|
|
|
|
);
|
2003-04-14 23:10:40 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
if( $res->numRows() > 0 ) {
|
2009-04-15 09:36:53 +00:00
|
|
|
$out = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-chunk' ) );
|
2008-08-23 20:32:46 +00:00
|
|
|
while( ( $n < $this->maxPerPage ) && ( $s = $res->fetchObject() ) ) {
|
|
|
|
|
$t = Title::makeTitle( $s->page_namespace, $s->page_title );
|
|
|
|
|
if( $t ) {
|
|
|
|
|
$link = ( $s->page_is_redirect ? '<div class="allpagesredirect">' : '' ) .
|
2009-06-07 18:45:52 +00:00
|
|
|
$sk->linkKnown( $t, htmlspecialchars( $t->getText() ) ) .
|
2008-08-23 20:32:46 +00:00
|
|
|
($s->page_is_redirect ? '</div>' : '' );
|
|
|
|
|
} else {
|
|
|
|
|
$link = '[[' . htmlspecialchars( $s->page_title ) . ']]';
|
|
|
|
|
}
|
|
|
|
|
if( $n % 3 == 0 ) {
|
|
|
|
|
$out .= '<tr>';
|
|
|
|
|
}
|
|
|
|
|
$out .= "<td width=\"33%\">$link</td>";
|
|
|
|
|
$n++;
|
|
|
|
|
if( $n % 3 == 0 ) {
|
2009-04-15 09:36:53 +00:00
|
|
|
$out .= "</tr>\n";
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
2008-05-01 22:07:24 +00:00
|
|
|
}
|
2008-08-23 20:32:46 +00:00
|
|
|
if( ($n % 3) != 0 ) {
|
2009-04-15 09:36:53 +00:00
|
|
|
$out .= "</tr>\n";
|
2008-05-01 22:07:24 +00:00
|
|
|
}
|
2009-04-15 09:36:53 +00:00
|
|
|
$out .= Xml::closeElement( 'table' );
|
2008-08-23 20:32:46 +00:00
|
|
|
} else {
|
|
|
|
|
$out = '';
|
2006-07-02 14:39:47 +00:00
|
|
|
}
|
2004-04-09 08:27:00 +00:00
|
|
|
}
|
2005-09-25 12:19:51 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
if ( $this->including() ) {
|
|
|
|
|
$out2 = '';
|
2008-08-20 16:13:49 +00:00
|
|
|
} else {
|
2008-08-23 20:32:46 +00:00
|
|
|
if( $from == '' ) {
|
|
|
|
|
// First chunk; no previous link.
|
|
|
|
|
$prevTitle = null;
|
2008-08-20 16:13:49 +00:00
|
|
|
} else {
|
2008-08-23 20:32:46 +00:00
|
|
|
# Get the last title from previous chunk
|
|
|
|
|
$dbr = wfGetDB( DB_SLAVE );
|
|
|
|
|
$res_prev = $dbr->select(
|
|
|
|
|
'page',
|
|
|
|
|
'page_title',
|
|
|
|
|
array( 'page_namespace' => $namespace, 'page_title < '.$dbr->addQuotes($from) ),
|
|
|
|
|
__METHOD__,
|
2009-06-01 19:32:11 +00:00
|
|
|
array( 'ORDER BY' => 'page_title DESC',
|
|
|
|
|
'LIMIT' => $this->maxPerPage, 'OFFSET' => ($this->maxPerPage - 1 )
|
|
|
|
|
)
|
2008-08-23 20:32:46 +00:00
|
|
|
);
|
|
|
|
|
|
|
|
|
|
# Get first title of previous complete chunk
|
|
|
|
|
if( $dbr->numrows( $res_prev ) >= $this->maxPerPage ) {
|
|
|
|
|
$pt = $dbr->fetchObject( $res_prev );
|
|
|
|
|
$prevTitle = Title::makeTitle( $namespace, $pt->page_title );
|
2008-08-20 16:13:49 +00:00
|
|
|
} else {
|
2008-08-23 20:32:46 +00:00
|
|
|
# The previous chunk is not complete, need to link to the very first title
|
|
|
|
|
# available in the database
|
|
|
|
|
$options = array( 'LIMIT' => 1 );
|
|
|
|
|
if ( ! $dbr->implicitOrderby() ) {
|
|
|
|
|
$options['ORDER BY'] = 'page_title';
|
|
|
|
|
}
|
|
|
|
|
$reallyFirstPage_title = $dbr->selectField( 'page', 'page_title',
|
|
|
|
|
array( 'page_namespace' => $namespace ), __METHOD__, $options );
|
|
|
|
|
# Show the previous link if it s not the current requested chunk
|
|
|
|
|
if( $from != $reallyFirstPage_title ) {
|
|
|
|
|
$prevTitle = Title::makeTitle( $namespace, $reallyFirstPage_title );
|
|
|
|
|
} else {
|
|
|
|
|
$prevTitle = null;
|
|
|
|
|
}
|
2008-08-20 16:13:49 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
$self = $this->getTitle();
|
2008-08-20 16:13:49 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
$nsForm = $this->namespaceForm( $namespace, $from, $to );
|
2009-04-15 09:36:53 +00:00
|
|
|
$out2 = Xml::openElement( 'table', array( 'class' => 'mw-allpages-table-form' ) ).
|
|
|
|
|
'<tr>
|
|
|
|
|
<td>' .
|
|
|
|
|
$nsForm .
|
|
|
|
|
'</td>
|
|
|
|
|
<td class="mw-allpages-nav">' .
|
|
|
|
|
$sk->link( $self, wfMsgHtml ( 'allpages' ), array(), array(), 'known' );
|
2008-08-23 20:32:46 +00:00
|
|
|
|
|
|
|
|
# Do we put a previous link ?
|
|
|
|
|
if( isset( $prevTitle ) && $pt = $prevTitle->getText() ) {
|
2009-06-15 12:32:59 +00:00
|
|
|
$query = array( 'from' => $prevTitle->getText() );
|
2009-06-07 18:45:52 +00:00
|
|
|
|
|
|
|
|
if( $namespace )
|
|
|
|
|
$query['namespace'] = $namespace;
|
|
|
|
|
|
|
|
|
|
$prevLink = $sk->linkKnown(
|
|
|
|
|
$self,
|
2009-07-13 10:34:31 +00:00
|
|
|
htmlspecialchars( wfMsg( 'prevpage', $pt ) ),
|
2009-06-07 18:45:52 +00:00
|
|
|
array(),
|
|
|
|
|
$query
|
|
|
|
|
);
|
2009-02-09 17:48:41 +00:00
|
|
|
$out2 = $wgLang->pipeList( array( $out2, $prevLink ) );
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
2004-07-08 16:50:22 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
if( $n == $this->maxPerPage && $s = $res->fetchObject() ) {
|
|
|
|
|
# $s is the first link of the next chunk
|
|
|
|
|
$t = Title::MakeTitle($namespace, $s->page_title);
|
2009-06-15 12:32:59 +00:00
|
|
|
$query = array( 'from' => $t->getText() );
|
2009-06-07 18:45:52 +00:00
|
|
|
|
|
|
|
|
if( $namespace )
|
|
|
|
|
$query['namespace'] = $namespace;
|
|
|
|
|
|
|
|
|
|
$nextLink = $sk->linkKnown(
|
|
|
|
|
$self,
|
2009-07-13 10:34:31 +00:00
|
|
|
htmlspecialchars( wfMsg( 'nextpage', $t->getText() ) ),
|
2009-06-07 18:45:52 +00:00
|
|
|
array(),
|
|
|
|
|
$query
|
|
|
|
|
);
|
2009-02-09 17:48:41 +00:00
|
|
|
$out2 = $wgLang->pipeList( array( $out2, $nextLink ) );
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
2009-01-07 16:40:44 +00:00
|
|
|
$out2 .= "</td></tr></table>";
|
2008-08-20 16:13:49 +00:00
|
|
|
}
|
|
|
|
|
|
2008-11-06 22:20:29 +00:00
|
|
|
$wgOut->addHTML( $out2 . $out );
|
2008-08-23 20:32:46 +00:00
|
|
|
if( isset($prevLink) or isset($nextLink) ) {
|
2009-04-15 09:36:53 +00:00
|
|
|
$wgOut->addHTML( '<hr /><p class="mw-allpages-nav">' );
|
2008-08-23 20:32:46 +00:00
|
|
|
if( isset( $prevLink ) ) {
|
|
|
|
|
$wgOut->addHTML( $prevLink );
|
|
|
|
|
}
|
|
|
|
|
if( isset( $prevLink ) && isset( $nextLink ) ) {
|
2009-02-09 17:48:41 +00:00
|
|
|
$wgOut->addHTML( wfMsgExt( 'pipe-separator' , 'escapenoentities' ) );
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
|
|
|
|
if( isset( $nextLink ) ) {
|
|
|
|
|
$wgOut->addHTML( $nextLink );
|
|
|
|
|
}
|
|
|
|
|
$wgOut->addHTML( '</p>' );
|
2008-08-20 16:13:49 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
2008-04-14 07:45:50 +00:00
|
|
|
|
2006-11-23 08:25:56 +00:00
|
|
|
}
|
2006-07-02 14:39:47 +00:00
|
|
|
|
2008-08-23 20:32:46 +00:00
|
|
|
/**
|
|
|
|
|
* @param int $ns the namespace of the article
|
|
|
|
|
* @param string $text the name of the article
|
|
|
|
|
* @return array( int namespace, string dbkey, string pagename ) or NULL on error
|
|
|
|
|
* @static (sort of)
|
|
|
|
|
* @access private
|
|
|
|
|
*/
|
|
|
|
|
function getNamespaceKeyAndText($ns, $text) {
|
|
|
|
|
if ( $text == '' )
|
|
|
|
|
return array( $ns, '', '' ); # shortcut for common case
|
|
|
|
|
|
|
|
|
|
$t = Title::makeTitleSafe($ns, $text);
|
|
|
|
|
if ( $t && $t->isLocal() ) {
|
|
|
|
|
return array( $t->getNamespace(), $t->getDBkey(), $t->getText() );
|
|
|
|
|
} else if ( $t ) {
|
2009-12-11 21:07:27 +00:00
|
|
|
return null;
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
# try again, in case the problem was an empty pagename
|
|
|
|
|
$text = preg_replace('/(#|$)/', 'X$1', $text);
|
|
|
|
|
$t = Title::makeTitleSafe($ns, $text);
|
|
|
|
|
if ( $t && $t->isLocal() ) {
|
|
|
|
|
return array( $t->getNamespace(), '', '' );
|
|
|
|
|
} else {
|
2009-12-11 21:07:27 +00:00
|
|
|
return null;
|
2008-08-23 20:32:46 +00:00
|
|
|
}
|
2006-11-23 08:25:56 +00:00
|
|
|
}
|
2006-07-02 14:39:47 +00:00
|
|
|
}
|