Making INNER JOIN implicit
[lhc/web/wiklou.git] / includes / SpecialBrokenRedirects.php
index d94d405..96a19ef 100644 (file)
@@ -1,56 +1,83 @@
 <?php
 /**
  *
- * @package MediaWiki
- * @subpackage SpecialPage
+ * @addtogroup SpecialPage
  */
 
 /**
- *
- */
-require_once('QueryPage.php');
-
-/**
- *
- * @package MediaWiki
- * @subpackage SpecialPage
+ * A special page listing redirects to non existent page. Those should be
+ * fixed to point to an existing page.
+ * @addtogroup SpecialPage
  */
 class BrokenRedirectsPage extends PageQueryPage {
+       var $targets = array();
 
        function getName() {
                return 'BrokenRedirects';
        }
-       
+
        function isExpensive( ) { return true; }
        function isSyndicated() { return false; }
 
        function getPageHeader( ) {
-               #FIXME : probably need to add a backlink to the maintenance page.
-               return '<p>'.wfMsg('brokenredirectstext')."</p><br />\n";
+               return wfMsgExt( 'brokenredirectstext', array( 'parse' ) );
        }
 
        function getSQL() {
-               $dbr =& wfGetDB( DB_SLAVE );
-               extract( $dbr->tableNames( 'cur', 'brokenlinks' ) );
+               $dbr = wfGetDB( DB_SLAVE );
+               list( $page, $redirect ) = $dbr->tableNamesN( 'page', 'redirect' );
 
-               $sql = "SELECT bl_to,cur_title FROM $brokenlinks,$cur " .
-                      "WHERE cur_is_redirect=1 AND cur_namespace=0 AND bl_from=cur_id ";
+               $sql = "SELECT 'BrokenRedirects'  AS type,
+                               p1.page_namespace AS namespace,
+                               p1.page_title     AS title,
+                               rd_namespace,
+                               rd_title
+                          FROM $redirect AS rd
+                   JOIN $page p1 ON (rd.rd_from=p1.page_id)
+                     LEFT JOIN $page AS p2 ON (rd_namespace=p2.page_namespace AND rd_title=p2.page_title )
+                                 WHERE rd_namespace >= 0
+                                   AND p2.page_namespace IS NULL";
                return $sql;
        }
 
        function getOrder() {
                return '';
        }
-       
+
        function formatResult( $skin, $result ) {
-               global $wgContLang ;
-               
-               $ns = $wgContLang->getNamespaces() ; /* not used, why bother? */
-               $from = $skin->makeKnownLink( $result->cur_title ,'', 'redirect=no' );
-               $edit = $skin->makeBrokenLink( $result->cur_title , "(".wfMsg("qbedit").")" , 'redirect=no');
-               $to   = $skin->makeBrokenLink( $result->bl_to );
-                               
-               return "$from $edit => $to";
+               global $wgUser, $wgContLang;
+
+               $fromObj = Title::makeTitle( $result->namespace, $result->title );
+               if ( isset( $result->rd_title ) ) {
+                       $toObj = Title::makeTitle( $result->rd_namespace, $result->rd_title );
+               } else {
+                       $blinks = $fromObj->getBrokenLinksFrom(); # TODO: check for redirect, not for links
+                       if ( $blinks ) {
+                               $toObj = $blinks[0];
+                       } else {
+                               $toObj = false;
+                       }
+               }
+
+               // $toObj may very easily be false if the $result list is cached
+               if ( !is_object( $toObj ) ) {
+                       return '<s>' . $skin->makeLinkObj( $fromObj ) . '</s>';
+               }
+
+               $from = $skin->makeKnownLinkObj( $fromObj ,'', 'redirect=no' );
+               $edit = $skin->makeKnownLinkObj( $fromObj, wfMsgHtml( 'brokenredirects-edit' ), 'action=edit' );
+               $to   = $skin->makeBrokenLinkObj( $toObj );
+               $arr = $wgContLang->getArrow();
+
+               $out = "{$from} {$edit}";
+
+               if( $wgUser->isAllowed( 'delete' ) ) {
+                       $delete = $skin->makeKnownLinkObj( $fromObj, wfMsgHtml( 'brokenredirects-delete' ), 'action=delete' );
+                       $out .= " {$delete}";
+               }
+
+               $out .= " {$arr} {$to}";
+               return $out;
        }
 }
 
@@ -59,10 +86,8 @@ class BrokenRedirectsPage extends PageQueryPage {
  */
 function wfSpecialBrokenRedirects() {
        list( $limit, $offset ) = wfCheckLimits();
-       
+
        $sbr = new BrokenRedirectsPage();
-       
-       return $sbr->doQuery( $offset, $limit );
 
+       return $sbr->doQuery( $offset, $limit );
 }
-?>