8 * A special page listing redirects to non existent page. Those should be
9 * fixed to point to an existing page.
10 * @ingroup SpecialPage
12 class BrokenRedirectsPage
extends PageQueryPage
{
13 var $targets = array();
16 return 'BrokenRedirects';
19 function isExpensive( ) { return true; }
20 function isSyndicated() { return false; }
22 function getPageHeader( ) {
23 return wfMsgExt( 'brokenredirectstext', array( 'parse' ) );
27 $dbr = wfGetDB( DB_SLAVE
);
28 list( $page, $redirect ) = $dbr->tableNamesN( 'page', 'redirect' );
30 $sql = "SELECT 'BrokenRedirects' AS type,
31 p1.page_namespace AS namespace,
32 p1.page_title AS title,
36 JOIN $page p1 ON (rd.rd_from=p1.page_id)
37 LEFT JOIN $page AS p2 ON (rd_namespace=p2.page_namespace AND rd_title=p2.page_title )
38 WHERE rd_namespace >= 0
39 AND p2.page_namespace IS NULL";
47 function formatResult( $skin, $result ) {
48 global $wgUser, $wgContLang, $wgLang;
50 $fromObj = Title
::makeTitle( $result->namespace, $result->title
);
51 if ( isset( $result->rd_title
) ) {
52 $toObj = Title
::makeTitle( $result->rd_namespace
, $result->rd_title
);
54 $blinks = $fromObj->getBrokenLinksFrom(); # TODO: check for redirect, not for links
62 // $toObj may very easily be false if the $result list is cached
63 if ( !is_object( $toObj ) ) {
64 return '<s>' . $skin->link( $fromObj ) . '</s>';
67 $from = $skin->linkKnown(
71 array( 'redirect' => 'no' )
74 $links[] = $skin->linkKnown(
76 wfMsgHtml( 'brokenredirects-edit' ),
78 array( 'action' => 'edit' )
87 $arr = $wgContLang->getArrow();
89 $out = $from . wfMsg( 'word-separator' );
91 if( $wgUser->isAllowed( 'delete' ) ) {
92 $links[] = $skin->linkKnown(
94 wfMsgHtml( 'brokenredirects-delete' ),
96 array( 'action' => 'delete' )
100 $out .= wfMsg( 'parentheses', $wgLang->pipeList( $links ) );
101 $out .= " {$arr} {$to}";
109 function wfSpecialBrokenRedirects() {
110 list( $limit, $offset ) = wfCheckLimits();
112 $sbr = new BrokenRedirectsPage();
114 return $sbr->doQuery( $offset, $limit );