]> scripts.mit.edu Git - autoinstallsdev/mediawiki.git/blob - includes/specials/SpecialWantedcategories.php
MediaWiki 1.30.2
[autoinstallsdev/mediawiki.git] / includes / specials / SpecialWantedcategories.php
1 <?php
2 /**
3  * Implements Special:Wantedcategories
4  *
5  * Copyright © 2005 Ævar Arnfjörð Bjarmason
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20  * http://www.gnu.org/copyleft/gpl.html
21  *
22  * @file
23  * @ingroup SpecialPage
24  */
25
26 /**
27  * A querypage to list the most wanted categories - implements Special:Wantedcategories
28  *
29  * @ingroup SpecialPage
30  */
31 class WantedCategoriesPage extends WantedQueryPage {
32         private $currentCategoryCounts;
33
34         function __construct( $name = 'Wantedcategories' ) {
35                 parent::__construct( $name );
36         }
37
38         function getQueryInfo() {
39                 return [
40                         'tables' => [ 'categorylinks', 'page' ],
41                         'fields' => [
42                                 'namespace' => NS_CATEGORY,
43                                 'title' => 'cl_to',
44                                 'value' => 'COUNT(*)'
45                         ],
46                         'conds' => [ 'page_title IS NULL' ],
47                         'options' => [ 'GROUP BY' => 'cl_to' ],
48                         'join_conds' => [ 'page' => [ 'LEFT JOIN',
49                                 [ 'page_title = cl_to',
50                                         'page_namespace' => NS_CATEGORY ] ] ]
51                 ];
52         }
53
54         function preprocessResults( $db, $res ) {
55                 parent::preprocessResults( $db, $res );
56
57                 $this->currentCategoryCounts = [];
58
59                 if ( !$res->numRows() || !$this->isCached() ) {
60                         return;
61                 }
62
63                 // Fetch (hopefully) up-to-date numbers of pages in each category.
64                 // This should be fast enough as we limit the list to a reasonable length.
65
66                 $allCategories = [];
67                 foreach ( $res as $row ) {
68                         $allCategories[] = $row->title;
69                 }
70
71                 $categoryRes = $db->select(
72                         'category',
73                         [ 'cat_title', 'cat_pages' ],
74                         [ 'cat_title' => $allCategories ],
75                         __METHOD__
76                 );
77                 foreach ( $categoryRes as $row ) {
78                         $this->currentCategoryCounts[$row->cat_title] = intval( $row->cat_pages );
79                 }
80
81                 // Back to start for display
82                 $res->seek( 0 );
83         }
84
85         /**
86          * @param Skin $skin
87          * @param object $result Result row
88          * @return string
89          */
90         function formatResult( $skin, $result ) {
91                 global $wgContLang;
92
93                 $nt = Title::makeTitle( $result->namespace, $result->title );
94                 $text = $wgContLang->convert( $nt->getText() );
95
96                 if ( !$this->isCached() ) {
97                         // We can assume the freshest data
98                         $plink = $this->getLinkRenderer()->makeBrokenLink(
99                                 $nt,
100                                 $text
101                         );
102                         $nlinks = $this->msg( 'nmembers' )->numParams( $result->value )->escaped();
103                 } else {
104                         $plink = $this->getLinkRenderer()->makeLink( $nt, $text );
105
106                         $currentValue = isset( $this->currentCategoryCounts[$result->title] )
107                                 ? $this->currentCategoryCounts[$result->title]
108                                 : 0;
109                         $cachedValue = intval( $result->value ); // T76910
110
111                         // If the category has been created or emptied since the list was refreshed, strike it
112                         if ( $nt->isKnown() || $currentValue === 0 ) {
113                                 $plink = "<del>$plink</del>";
114                         }
115
116                         // Show the current number of category entries if it changed
117                         if ( $currentValue !== $cachedValue ) {
118                                 $nlinks = $this->msg( 'nmemberschanged' )
119                                         ->numParams( $cachedValue, $currentValue )->escaped();
120                         } else {
121                                 $nlinks = $this->msg( 'nmembers' )->numParams( $cachedValue )->escaped();
122                         }
123                 }
124
125                 return $this->getLanguage()->specialList( $plink, $nlinks );
126         }
127
128         protected function getGroupName() {
129                 return 'maintenance';
130         }
131 }