9use MediaWiki\Cache\LinkBatchFactory;
52 private array $redirectTargets = [];
57 LinkBatchFactory $linkBatchFactory
59 parent::__construct(
'BrokenRedirects' );
60 $this->contentHandlerFactory = $contentHandlerFactory;
82 return $this->
msg(
'brokenredirectstext' )->parseAsBlock();
96 'namespace' =>
'p1.page_namespace',
97 'title' =>
'p1.page_title',
105 $dbr->expr(
'rd_namespace',
'>=', 0 ),
106 'rd_interwiki' =>
'',
107 'p2.page_namespace' =>
null,
111 'rd_from=p1.page_id',
113 'p2' => [
'LEFT JOIN', [
114 'rd_namespace=p2.page_namespace',
115 'rd_title=p2.page_title'
125 return [
'rd_namespace',
'rd_title',
'rd_from' ];
135 if ( !$res->numRows() ) {
141 foreach ( $res as $row ) {
143 $batch->add( $row->namespace, $row->title );
146 $batch->add( $row->rd_namespace, $row->rd_title );
151 $rdRes = $db->newSelectQueryBuilder()
152 ->select( [
'page_namespace',
'page_title',
'rd_namespace',
'rd_title',
'rd_fragment' ] )
154 ->join(
'redirect',
null,
'page_id = rd_from' )
155 ->where( $batch->constructSet(
'page', $db ) )
156 ->caller( __METHOD__ )
159 foreach ( $rdRes as $rdRow ) {
160 $batch->add( $rdRow->rd_namespace, $rdRow->rd_title );
161 $this->redirectTargets[$rdRow->page_namespace][$rdRow->page_title] =
162 Title::makeTitle( $rdRow->rd_namespace, $rdRow->rd_title, $rdRow->rd_fragment );
171 if ( isset( $result->rd_title ) ) {
173 $result->rd_namespace,
178 return $this->redirectTargets[$result->namespace][$result->title] ??
null;
189 $toObj = $this->getRedirectTarget( $result );
191 $linkRenderer = $this->getLinkRenderer();
193 if ( $toObj ===
null || $toObj->isKnown() ) {
194 return '<del>' . $linkRenderer->makeLink( $fromObj ) .
'</del>';
197 $from = $linkRenderer->makeKnownLink(
201 [
'redirect' =>
'no' ]
207 $this->getAuthority()->isAllowed(
'edit' ) &&
209 $this->contentHandlerFactory->getContentHandler( $fromObj->getContentModel() )
210 ->supportsDirectEditing()
212 $links[] = $linkRenderer->makeKnownLink(
214 $this->msg(
'brokenredirects-edit' )->text(),
216 [
'action' =>
'edit' ]
219 $to = $linkRenderer->makeBrokenLink( $toObj, $toObj->getFullText() );
220 $arr = $this->getLanguage()->getArrow();
222 $out = $from . $this->msg(
'word-separator' )->escaped();
224 if ( $this->getAuthority()->isAllowed(
'delete' ) ) {
225 $links[] = $linkRenderer->makeKnownLink(
227 $this->msg(
'brokenredirects-delete' )->text(),
230 'action' =>
'delete',
231 'wpReason' => $this->msg(
'brokenredirects-delete-reason' )
232 ->inContentLanguage()
239 $out .= $this->msg(
'parentheses' )->rawParams( $this->getLanguage()
240 ->pipeList( $links ) )->escaped();
242 $out .=
" {$arr} {$to}";
249 $this->addHelpLink(
'Help:Redirects' );
250 parent::execute( $par );
255 return 'maintenance';
260class_alias( SpecialBrokenRedirects::class,
'SpecialBrokenRedirects' );
if(!defined('MW_SETUP_CALLBACK'))
This is a class for doing query pages; since they're almost all the same, we factor out some of the f...
setDatabaseProvider(IConnectionProvider $databaseProvider)
isCached()
Whether or not the output of the page in question is retrieved from the database cache.
setLinkBatchFactory(LinkBatchFactory $linkBatchFactory)
msg( $key,... $params)
Wrapper around wfMessage that sets the current context.