MediaWiki REL1_35
NewPagesPager.php
Go to the documentation of this file.
1<?php
26
28
32 protected $opts;
33
37 protected $mForm;
38
43 public function __construct( $form, FormOptions $opts ) {
44 parent::__construct( $form->getContext() );
45 $this->mForm = $form;
46 $this->opts = $opts;
47 }
48
49 public function getQueryInfo() {
50 $rcQuery = RecentChange::getQueryInfo();
51
52 $conds = [];
53 $conds['rc_new'] = 1;
54
55 $username = $this->opts->getValue( 'username' );
56 $user = Title::makeTitleSafe( NS_USER, $username );
57
58 $size = abs( intval( $this->opts->getValue( 'size' ) ) );
59 if ( $size > 0 ) {
60 if ( $this->opts->getValue( 'size-mode' ) === 'max' ) {
61 $conds[] = 'page_len <= ' . $size;
62 } else {
63 $conds[] = 'page_len >= ' . $size;
64 }
65 }
66
67 if ( $user ) {
68 $conds[] = ActorMigration::newMigration()->getWhere(
69 $this->mDb, 'rc_user', User::newFromName( $user->getText(), false ), false
70 )['conds'];
71 } elseif ( $this->canAnonymousUsersCreatePages() && $this->opts->getValue( 'hideliu' ) ) {
72 # If anons cannot make new pages, don't "exclude logged in users"!
73 $conds[] = ActorMigration::newMigration()->isAnon( $rcQuery['fields']['rc_user'] );
74 }
75
76 $conds = array_merge( $conds, $this->getNamespaceCond() );
77
78 # If this user cannot see patrolled edits or they are off, don't do dumb queries!
79 if ( $this->opts->getValue( 'hidepatrolled' ) && $this->getUser()->useNPPatrol() ) {
80 $conds['rc_patrolled'] = RecentChange::PRC_UNPATROLLED;
81 }
82
83 if ( $this->opts->getValue( 'hidebots' ) ) {
84 $conds['rc_bot'] = 0;
85 }
86
87 if ( $this->opts->getValue( 'hideredirs' ) ) {
88 $conds['page_is_redirect'] = 0;
89 }
90
91 // Allow changes to the New Pages query
92 $tables = array_merge( $rcQuery['tables'], [ 'page' ] );
93 $fields = array_merge( $rcQuery['fields'], [
94 'length' => 'page_len', 'rev_id' => 'page_latest', 'page_namespace', 'page_title',
95 'page_content_model',
96 ] );
97 $join_conds = [ 'page' => [ 'JOIN', 'page_id=rc_cur_id' ] ] + $rcQuery['joins'];
98
99 $this->getHookRunner()->onSpecialNewpagesConditions(
100 $this, $this->opts, $conds, $tables, $fields, $join_conds );
101
102 $info = [
103 'tables' => $tables,
104 'fields' => $fields,
105 'conds' => $conds,
106 'options' => [],
107 'join_conds' => $join_conds
108 ];
109
110 // Modify query for tags
112 $info['tables'],
113 $info['fields'],
114 $info['conds'],
115 $info['join_conds'],
116 $info['options'],
117 $this->opts['tagfilter']
118 );
119
120 return $info;
121 }
122
123 private function canAnonymousUsersCreatePages() {
124 $pm = MediaWikiServices::getInstance()->getPermissionManager();
125 return ( $pm->groupHasPermission( '*', 'createpage' ) ||
126 $pm->groupHasPermission( '*', 'createtalk' )
127 );
128 }
129
130 // Based on ContribsPager.php
131 private function getNamespaceCond() {
132 $namespace = $this->opts->getValue( 'namespace' );
133 if ( $namespace === 'all' || $namespace === '' ) {
134 return [];
135 }
136
137 $namespace = intval( $namespace );
138 if ( $namespace < NS_MAIN ) {
139 // Negative namespaces are invalid
140 return [];
141 }
142
143 $invert = $this->opts->getValue( 'invert' );
144 $associated = $this->opts->getValue( 'associated' );
145
146 $eq_op = $invert ? '!=' : '=';
147 $bool_op = $invert ? 'AND' : 'OR';
148
149 $selectedNS = $this->mDb->addQuotes( $namespace );
150 if ( !$associated ) {
151 return [ "rc_namespace $eq_op $selectedNS" ];
152 }
153
154 $associatedNS = $this->mDb->addQuotes(
155 MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociated( $namespace )
156 );
157 return [
158 "rc_namespace $eq_op $selectedNS " .
159 $bool_op .
160 " rc_namespace $eq_op $associatedNS"
161 ];
162 }
163
164 public function getIndexField() {
165 return 'rc_timestamp';
166 }
167
168 public function formatRow( $row ) {
169 return $this->mForm->formatRow( $row );
170 }
171
172 protected function getStartBody() {
173 # Do a batch existence check on pages
174 $linkBatch = new LinkBatch();
175 foreach ( $this->mResult as $row ) {
176 $linkBatch->add( NS_USER, $row->rc_user_text );
177 $linkBatch->add( NS_USER_TALK, $row->rc_user_text );
178 $linkBatch->add( $row->page_namespace, $row->page_title );
179 }
180 $linkBatch->execute();
181
182 return '<ul>';
183 }
184
185 protected function getEndBody() {
186 return '</ul>';
187 }
188}
static modifyDisplayQuery(&$tables, &$fields, &$conds, &$join_conds, &$options, $filter_tag='')
Applies all tags-related changes to a query.
Helper class to keep track of options when mixing links and form elements.
Class representing a list of titles The execute() method checks them all for existence and adds them ...
Definition LinkBatch.php:35
MediaWikiServices is the service locator for the application scope of MediaWiki.
formatRow( $row)
Returns an HTML string representing the result row $row.
SpecialNewpages $mForm
FormOptions $opts
__construct( $form, FormOptions $opts)
getQueryInfo()
Provides all parameters needed for the main paged query.
getStartBody()
Hook into getBody(), allows text to be inserted at the start.
getIndexField()
Returns the name of the index field.
getEndBody()
Hook into getBody() for the end of the list.
Efficient paging for SQL queries.
A special page that list newly created pages.
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition User.php:541
const NS_USER
Definition Defines.php:72
const NS_MAIN
Definition Defines.php:70
const NS_USER_TALK
Definition Defines.php:73