MediaWiki  master
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  $invert = $this->opts->getValue( 'invert' );
139  $associated = $this->opts->getValue( 'associated' );
140 
141  $eq_op = $invert ? '!=' : '=';
142  $bool_op = $invert ? 'AND' : 'OR';
143 
144  $selectedNS = $this->mDb->addQuotes( $namespace );
145  if ( !$associated ) {
146  return [ "rc_namespace $eq_op $selectedNS" ];
147  }
148 
149  $associatedNS = $this->mDb->addQuotes(
150  MediaWikiServices::getInstance()->getNamespaceInfo()->getAssociated( $namespace )
151  );
152  return [
153  "rc_namespace $eq_op $selectedNS " .
154  $bool_op .
155  " rc_namespace $eq_op $associatedNS"
156  ];
157  }
158 
159  public function getIndexField() {
160  return 'rc_timestamp';
161  }
162 
163  public function formatRow( $row ) {
164  return $this->mForm->formatRow( $row );
165  }
166 
167  protected function getStartBody() {
168  # Do a batch existence check on pages
169  $linkBatch = new LinkBatch();
170  foreach ( $this->mResult as $row ) {
171  $linkBatch->add( NS_USER, $row->rc_user_text );
172  $linkBatch->add( NS_USER_TALK, $row->rc_user_text );
173  $linkBatch->add( $row->page_namespace, $row->page_title );
174  }
175  $linkBatch->execute();
176 
177  return '<ul>';
178  }
179 
180  protected function getEndBody() {
181  return '</ul>';
182  }
183 }
RecentChange\getQueryInfo
static getQueryInfo()
Return the tables, fields, and join conditions to be selected to create a new recentchanges object.
Definition: RecentChange.php:246
NewPagesPager\getIndexField
getIndexField()
Returns the name of the index field.
Definition: NewPagesPager.php:159
NewPagesPager\$opts
FormOptions $opts
Definition: NewPagesPager.php:32
LinkBatch
Class representing a list of titles The execute() method checks them all for existence and adds them ...
Definition: LinkBatch.php:35
NewPagesPager\canAnonymousUsersCreatePages
canAnonymousUsersCreatePages()
Definition: NewPagesPager.php:123
MediaWiki\MediaWikiServices
MediaWikiServices is the service locator for the application scope of MediaWiki.
Definition: MediaWikiServices.php:154
NewPagesPager\getStartBody
getStartBody()
Hook into getBody(), allows text to be inserted at the start.
Definition: NewPagesPager.php:167
NewPagesPager\getNamespaceCond
getNamespaceCond()
Definition: NewPagesPager.php:131
User\newFromName
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
Definition: User.php:538
NewPagesPager\getEndBody
getEndBody()
Hook into getBody() for the end of the list.
Definition: NewPagesPager.php:180
ActorMigration\newMigration
static newMigration()
Static constructor.
Definition: ActorMigration.php:140
ChangeTags\modifyDisplayQuery
static modifyDisplayQuery(&$tables, &$fields, &$conds, &$join_conds, &$options, $filter_tag='')
Applies all tags-related changes to a query.
Definition: ChangeTags.php:797
NewPagesPager\getQueryInfo
getQueryInfo()
Provides all parameters needed for the main paged query.
Definition: NewPagesPager.php:49
Title\makeTitleSafe
static makeTitleSafe( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:618
NS_USER_TALK
const NS_USER_TALK
Definition: Defines.php:72
NewPagesPager\formatRow
formatRow( $row)
Returns an HTML string representing the result row $row.
Definition: NewPagesPager.php:163
NewPagesPager
Definition: NewPagesPager.php:27
SpecialNewpages
A special page that list newly created pages.
Definition: SpecialNewpages.php:35
RecentChange\PRC_UNPATROLLED
const PRC_UNPATROLLED
Definition: RecentChange.php:82
NewPagesPager\__construct
__construct( $form, FormOptions $opts)
Definition: NewPagesPager.php:43
NS_USER
const NS_USER
Definition: Defines.php:71
ReverseChronologicalPager
Efficient paging for SQL queries.
Definition: ReverseChronologicalPager.php:29
FormOptions
Helper class to keep track of options when mixing links and form elements.
Definition: FormOptions.php:35
NewPagesPager\$mForm
SpecialNewpages $mForm
Definition: NewPagesPager.php:37