00001 <?php
00012 class BrokenRedirectsPage extends PageQueryPage {
00013 var $targets = array();
00014
00015 function getName() {
00016 return 'BrokenRedirects';
00017 }
00018
00019 function isExpensive( ) { return true; }
00020 function isSyndicated() { return false; }
00021
00022 function getPageHeader( ) {
00023 return wfMsgExt( 'brokenredirectstext', array( 'parse' ) );
00024 }
00025
00026 function getSQL() {
00027 $dbr = wfGetDB( DB_SLAVE );
00028 list( $page, $redirect ) = $dbr->tableNamesN( 'page', 'redirect' );
00029
00030 $sql = "SELECT 'BrokenRedirects' AS type,
00031 p1.page_namespace AS namespace,
00032 p1.page_title AS title,
00033 rd_namespace,
00034 rd_title
00035 FROM $redirect AS rd
00036 JOIN $page p1 ON (rd.rd_from=p1.page_id)
00037 LEFT JOIN $page AS p2 ON (rd_namespace=p2.page_namespace AND rd_title=p2.page_title )
00038 WHERE rd_namespace >= 0
00039 AND p2.page_namespace IS NULL";
00040 return $sql;
00041 }
00042
00043 function getOrder() {
00044 return '';
00045 }
00046
00047 function formatResult( $skin, $result ) {
00048 global $wgUser, $wgContLang, $wgLang;
00049
00050 $fromObj = Title::makeTitle( $result->namespace, $result->title );
00051 if ( isset( $result->rd_title ) ) {
00052 $toObj = Title::makeTitle( $result->rd_namespace, $result->rd_title );
00053 } else {
00054 $blinks = $fromObj->getBrokenLinksFrom(); # TODO: check for redirect, not for links
00055 if ( $blinks ) {
00056 $toObj = $blinks[0];
00057 } else {
00058 $toObj = false;
00059 }
00060 }
00061
00062
00063 if ( !is_object( $toObj ) ) {
00064 return '<s>' . $skin->link( $fromObj ) . '</s>';
00065 }
00066
00067 $from = $skin->linkKnown(
00068 $fromObj,
00069 null,
00070 array(),
00071 array( 'redirect' => 'no' )
00072 );
00073 $links = array();
00074 $links[] = $skin->linkKnown(
00075 $fromObj,
00076 wfMsgHtml( 'brokenredirects-edit' ),
00077 array(),
00078 array( 'action' => 'edit' )
00079 );
00080 $to = $skin->link(
00081 $toObj,
00082 null,
00083 array(),
00084 array(),
00085 array( 'broken' )
00086 );
00087 $arr = $wgContLang->getArrow();
00088
00089 $out = $from . wfMsg( 'word-separator' );
00090
00091 if( $wgUser->isAllowed( 'delete' ) ) {
00092 $links[] = $skin->linkKnown(
00093 $fromObj,
00094 wfMsgHtml( 'brokenredirects-delete' ),
00095 array(),
00096 array( 'action' => 'delete' )
00097 );
00098 }
00099
00100 $out .= wfMsg( 'parentheses', $wgLang->pipeList( $links ) );
00101 $out .= " {$arr} {$to}";
00102 return $out;
00103 }
00104 }
00105
00109 function wfSpecialBrokenRedirects() {
00110 list( $limit, $offset ) = wfCheckLimits();
00111
00112 $sbr = new BrokenRedirectsPage();
00113
00114 return $sbr->doQuery( $offset, $limit );
00115 }