MediaWiki  master
SpecialListRedirects.php
Go to the documentation of this file.
1 <?php
33 
39 
42 
45 
47  private $redirectLookup;
48 
55  public function __construct(
60  ) {
61  parent::__construct( 'Listredirects' );
62  $this->linkBatchFactory = $linkBatchFactory;
63  $this->setDBLoadBalancer( $loadBalancer );
64  $this->wikiPageFactory = $wikiPageFactory;
65  $this->redirectLookup = $redirectLookup;
66  }
67 
68  public function isExpensive() {
69  return true;
70  }
71 
72  public function isSyndicated() {
73  return false;
74  }
75 
76  protected function sortDescending() {
77  return false;
78  }
79 
80  public function getQueryInfo() {
81  return [
82  'tables' => [ 'p1' => 'page', 'redirect', 'p2' => 'page' ],
83  'fields' => [ 'namespace' => 'p1.page_namespace',
84  'title' => 'p1.page_title',
85  'rd_namespace',
86  'rd_title',
87  'rd_fragment',
88  'rd_interwiki',
89  'redirid' => 'p2.page_id' ],
90  'conds' => [ 'p1.page_is_redirect' => 1 ],
91  'join_conds' => [ 'redirect' => [
92  'LEFT JOIN', 'rd_from=p1.page_id' ],
93  'p2' => [ 'LEFT JOIN', [
94  'p2.page_namespace=rd_namespace',
95  'p2.page_title=rd_title' ] ] ]
96  ];
97  }
98 
99  protected function getOrderFields() {
100  return [ 'p1.page_namespace', 'p1.page_title' ];
101  }
102 
109  public function preprocessResults( $db, $res ) {
110  if ( !$res->numRows() ) {
111  return;
112  }
113 
114  $batch = $this->linkBatchFactory->newLinkBatch();
115  foreach ( $res as $row ) {
116  $batch->add( $row->namespace, $row->title );
117  $redirTarget = $this->getRedirectTarget( $row );
118  if ( $redirTarget ) {
119  $batch->addObj( $redirTarget );
120  }
121  }
122  $batch->execute();
123 
124  // Back to start for display
125  $res->seek( 0 );
126  }
127 
132  protected function getRedirectTarget( $row ) {
133  if ( isset( $row->rd_title ) ) {
134  return Title::makeTitle(
135  $row->rd_namespace,
136  $row->rd_title,
137  $row->rd_fragment ?? '',
138  $row->rd_interwiki ?? ''
139  );
140  } else {
141  $title = Title::makeTitle( $row->namespace, $row->title );
142  if ( !$title->canExist() ) {
143  return null;
144  }
145 
147  $this->redirectLookup->getRedirectTarget( $title )
148  );
149  }
150  }
151 
157  public function formatResult( $skin, $result ) {
158  $linkRenderer = $this->getLinkRenderer();
159  # Make a link to the redirect itself
160  $rd_title = Title::makeTitle( $result->namespace, $result->title );
161  $rd_link = $linkRenderer->makeLink(
162  $rd_title,
163  null,
164  [],
165  [ 'redirect' => 'no' ]
166  );
167 
168  # Find out where the redirect leads
169  $target = $this->getRedirectTarget( $result );
170  if ( $target ) {
171  # Make a link to the destination page
172  $lang = $this->getLanguage();
173  $arr = $lang->getArrow() . $lang->getDirMark();
174  $targetLink = $linkRenderer->makeLink( $target, $target->getFullText() );
175 
176  return "$rd_link $arr $targetLink";
177  } else {
178  return "<del>$rd_link</del>";
179  }
180  }
181 
182  public function execute( $par ) {
183  $this->addHelpLink( 'Help:Redirects' );
184  parent::execute( $par );
185  }
186 
187  protected function getGroupName() {
188  return 'pages';
189  }
190 }
Service for creating WikiPage objects.
This is a class for doing query pages; since they're almost all the same, we factor out some of the f...
Definition: QueryPage.php:42
setDBLoadBalancer(ILoadBalancer $loadBalancer)
Definition: QueryPage.php:895
ILoadBalancer null $loadBalancer
Definition: QueryPage.php:72
Special:Listredirects - Lists all the redirects on the wiki.
__construct(LinkBatchFactory $linkBatchFactory, ILoadBalancer $loadBalancer, WikiPageFactory $wikiPageFactory, RedirectLookup $redirectLookup)
WikiPageFactory $wikiPageFactory
getGroupName()
Under which header this special page is listed in Special:SpecialPages See messages 'specialpages-gro...
execute( $par)
This is the actual workhorse.
RedirectLookup $redirectLookup
formatResult( $skin, $result)
isSyndicated()
Sometimes we don't want to build rss / atom feeds.
preprocessResults( $db, $res)
Cache page existence for performance.
LinkBatchFactory $linkBatchFactory
getQueryInfo()
Subclasses return an SQL query here, formatted as an array with the following keys: tables => Table(s...
isExpensive()
Is this query expensive (for some definition of expensive)? Then we don't let it run in miser mode.
getOrderFields()
Subclasses return an array of fields to order by here.
sortDescending()
Override to sort by increasing values.
LinkRenderer null $linkRenderer
Definition: SpecialPage.php:81
getLanguage()
Shortcut to get user's language.
addHelpLink( $to, $overrideBaseUrl=false)
Adds help link with an icon via page indicators.
static castFromLinkTarget( $linkTarget)
Same as newFromLinkTarget, but if passed null, returns null.
Definition: Title.php:306
static makeTitle( $ns, $title, $fragment='', $interwiki='')
Create a new Title from a namespace index and a DB key.
Definition: Title.php:638
Service for resolving a wiki page redirect.
Basic database interface for live and lazy-loaded relation database handles.
Definition: IDatabase.php:39
Database cluster connection, tracking, load balancing, and transaction manager interface.
Result wrapper for grabbing data queried from an IDatabase object.
if(!isset( $args[0])) $lang