50 parent::__construct( $name );
64 $out->allowClickjacking();
67 $from = $request->getVal(
'from',
null );
68 $to = $request->getVal(
'to',
null );
69 $namespace = $request->getInt(
'namespace' );
71 $miserMode = (bool)$this->
getConfig()->get(
'MiserMode' );
74 $hideredirects = $request->getBool(
'hideredirects',
false ) && !$miserMode;
76 $namespaces = $this->
getLanguage()->getNamespaces();
79 ( $namespace > 0 && array_key_exists( $namespace, $namespaces ) ) ?
80 $this->
msg(
'allinnamespace', str_replace(
'_',
' ', $namespaces[$namespace] ) ) :
81 $this->
msg(
'allarticles' )
83 $out->addModuleStyles(
'mediawiki.special' );
85 if ( $par !==
null ) {
86 $this->
showChunk( $namespace, $par, $to, $hideredirects );
87 } elseif ( $from !==
null && $to ===
null ) {
88 $this->
showChunk( $namespace, $from, $to, $hideredirects );
90 $this->
showToplevel( $namespace, $from, $to, $hideredirects );
103 $from =
'', $to =
'', $hideRedirects =
false
105 $miserMode = (bool)$this->
getConfig()->get(
'MiserMode' );
112 'label-message' =>
'allpagesfrom',
113 'default' => str_replace(
'_',
' ', $from ),
120 'label-message' =>
'allpagesto',
121 'default' => str_replace(
'_',
' ', $to ),
124 'type' =>
'namespaceselect',
125 'name' =>
'namespace',
127 'label-message' =>
'namespace',
129 'default' => $namespace,
133 'name' =>
'hideredirects',
134 'id' =>
'hidredirects',
135 'label-message' =>
'allpages-hide-redirects',
136 'value' => $hideRedirects,
141 unset( $formDescriptor[
'hideredirects'] );
149 ->setWrapperLegendMsg(
'allpages' )
150 ->setSubmitTextMsg(
'allpagessubmit' )
152 ->displayForm(
false );
164 $from = ( $from && $from->isLocal() ) ? $from->getDBkey() :
null;
165 $to = ( $to && $to->isLocal() ) ? $to->getDBkey() :
null;
167 $this->
showChunk( $namespace, $from, $to, $hideredirects );
176 function showChunk( $namespace =
NS_MAIN, $from =
false, $to =
false, $hideredirects =
false ) {
181 $namespaces = $this->
getContext()->getLanguage()->getNamespaces();
185 if ( !$fromList || !$toList ) {
186 $out = $this->
msg(
'allpagesbadtitle' )->parseAsBlock();
187 } elseif ( !array_key_exists( $namespace, $namespaces ) ) {
189 $out = $this->
msg(
'allpages-bad-ns', $namespace )->parse();
192 list( $namespace, $fromKey, $from ) = $fromList;
193 list( , $toKey, $to ) = $toList;
196 $filterConds = [
'page_namespace' => $namespace ];
197 if ( $hideredirects ) {
198 $filterConds[
'page_is_redirect'] = 0;
201 $conds = $filterConds;
202 $conds[] =
'page_title >= ' .
$dbr->addQuotes( $fromKey );
203 if ( $toKey !==
"" ) {
204 $conds[] =
'page_title <= ' .
$dbr->addQuotes( $toKey );
208 [
'page_namespace',
'page_title',
'page_is_redirect',
'page_id' ],
212 'ORDER BY' =>
'page_title',
213 'LIMIT' => $this->maxPerPage + 1,
214 'USE INDEX' =>
'name_title',
219 if (
$res->numRows() > 0 ) {
220 $out = Html::openElement(
'ul', [
'class' =>
'mw-allpages-chunk' ] );
222 while ( ( $n < $this->maxPerPage ) && (
$s =
$res->fetchObject() ) ) {
226 (
$s->page_is_redirect ?
' class="allpagesredirect"' :
'' ) .
231 $out .=
'<li>[[' . htmlspecialchars(
$s->page_title ) .
"]]</li>\n";
235 $out .= Html::closeElement(
'ul' );
237 if (
$res->numRows() > 2 ) {
240 $out = Html::rawElement(
'div', [
'class' =>
'mw-allpages-body' ], $out );
246 if ( $fromKey !==
'' && !$this->
including() ) {
247 # Get the first title from previous chunk
248 $prevConds = $filterConds;
249 $prevConds[] =
'page_title < ' .
$dbr->addQuotes( $fromKey );
250 $prevKey =
$dbr->selectField(
255 [
'ORDER BY' =>
'page_title DESC',
'OFFSET' => $this->maxPerPage - 1 ]
258 if ( $prevKey ===
false ) {
259 # The previous chunk is not complete, need to link to the very first title
260 # available in the database
261 $prevKey =
$dbr->selectField(
266 [
'ORDER BY' =>
'page_title' ]
270 if ( $prevKey !==
false ) {
287 $query = [
'from' => $prevTitle->getText() ];
290 $query[
'namespace'] = $namespace;
293 if ( $hideredirects ) {
294 $query[
'hideredirects'] = $hideredirects;
299 $this->
msg(
'prevpage', $prevTitle->getText() )->text(),
307 if ( $n == $this->maxPerPage &&
$s =
$res->fetchObject() ) {
308 # $s is the first link of the next chunk
310 $query = [
'from' =>
$t->getText() ];
313 $query[
'namespace'] = $namespace;
316 if ( $hideredirects ) {
317 $query[
'hideredirects'] = $hideredirects;
322 $this->
msg(
'nextpage',
$t->getText() )->text(),
330 if ( count( $navLinks ) ) {
332 $pagination = Html::rawElement(
'div',
333 [
'class' =>
'mw-allpages-nav' ],
337 $output->addHTML( $pagination );
338 $out .= Html::element(
'hr' ) . $pagination;
351 # shortcut for common case
352 return [ $ns,
'',
'' ];
356 if (
$t &&
$t->isLocal() ) {
357 return [
$t->getNamespace(),
$t->getDBkey(),
$t->getText() ];
362 # try again, in case the problem was an empty pagename
363 $text = preg_replace(
'/(#|$)/',
'X$1', $text );
365 if (
$t &&
$t->isLocal() ) {
366 return [
$t->getNamespace(),
'',
'' ];