]> scripts.mit.edu Git - autoinstalls/mediawiki.git/blobdiff - includes/specials/SpecialBrokenRedirects.php
MediaWiki 1.30.2-scripts
[autoinstalls/mediawiki.git] / includes / specials / SpecialBrokenRedirects.php
index 0a16e6de327436dc72b36373a8ee93105a520cde..cf9ae07187b7b62e2afd1b819a895fe892cd2c21 100644 (file)
 <?php
 /**
+ * Implements Special:Brokenredirects
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
  * @file
  * @ingroup SpecialPage
  */
 
+use Wikimedia\Rdbms\ResultWrapper;
+use Wikimedia\Rdbms\IDatabase;
+
 /**
  * A special page listing redirects to non existent page. Those should be
  * fixed to point to an existing page.
+ *
  * @ingroup SpecialPage
  */
-class BrokenRedirectsPage extends PageQueryPage {
-       var $targets = array();
+class BrokenRedirectsPage extends QueryPage {
+       function __construct( $name = 'BrokenRedirects' ) {
+               parent::__construct( $name );
+       }
 
-       function getName() {
-               return 'BrokenRedirects';
+       public function isExpensive() {
+               return true;
        }
 
-       function isExpensive( ) { return true; }
-       function isSyndicated() { return false; }
+       function isSyndicated() {
+               return false;
+       }
 
-       function getPageHeader( ) {
-               return wfMsgExt( 'brokenredirectstext', array( 'parse' ) );
+       function sortDescending() {
+               return false;
        }
 
-       function getSQL() {
-               $dbr = wfGetDB( DB_SLAVE );
-               list( $page, $redirect ) = $dbr->tableNamesN( 'page', 'redirect' );
-
-               $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 getPageHeader() {
+               return $this->msg( 'brokenredirectstext' )->parseAsBlock();
        }
 
-       function getOrder() {
-               return '';
+       public function getQueryInfo() {
+               $dbr = wfGetDB( DB_REPLICA );
+
+               return [
+                       'tables' => [
+                               'redirect',
+                               'p1' => 'page',
+                               'p2' => 'page',
+                       ],
+                       'fields' => [
+                               'namespace' => 'p1.page_namespace',
+                               'title' => 'p1.page_title',
+                               'value' => 'p1.page_title',
+                               'rd_namespace',
+                               'rd_title',
+                               'rd_fragment',
+                       ],
+                       'conds' => [
+                               // Exclude pages that don't exist locally as wiki pages,
+                               // but aren't "broken" either.
+                               // Special pages and interwiki links
+                               'rd_namespace >= 0',
+                               'rd_interwiki IS NULL OR rd_interwiki = ' . $dbr->addQuotes( '' ),
+                               'p2.page_namespace IS NULL',
+                       ],
+                       'join_conds' => [
+                               'p1' => [ 'JOIN', [
+                                       'rd_from=p1.page_id',
+                               ] ],
+                               'p2' => [ 'LEFT JOIN', [
+                                       'rd_namespace=p2.page_namespace',
+                                       'rd_title=p2.page_title'
+                               ] ],
+                       ],
+               ];
        }
 
-       function formatResult( $skin, $result ) {
-               global $wgUser, $wgContLang;
+       /**
+        * @return array
+        */
+       function getOrderFields() {
+               return [ 'rd_namespace', 'rd_title', 'rd_from' ];
+       }
 
+       /**
+        * @param Skin $skin
+        * @param object $result Result row
+        * @return string
+        */
+       function formatResult( $skin, $result ) {
                $fromObj = Title::makeTitle( $result->namespace, $result->title );
                if ( isset( $result->rd_title ) ) {
-                       $toObj = Title::makeTitle( $result->rd_namespace, $result->rd_title );
+                       $toObj = Title::makeTitle( $result->rd_namespace, $result->rd_title, $result->rd_fragment );
                } else {
                        $blinks = $fromObj->getBrokenLinksFrom(); # TODO: check for redirect, not for links
                        if ( $blinks ) {
@@ -59,35 +113,67 @@ class BrokenRedirectsPage extends PageQueryPage {
                        }
                }
 
+               $linkRenderer = $this->getLinkRenderer();
                // $toObj may very easily be false if the $result list is cached
                if ( !is_object( $toObj ) ) {
-                       return '<s>' . $skin->makeLinkObj( $fromObj ) . '</s>';
+                       return '<del>' . $linkRenderer->makeLink( $fromObj ) . '</del>';
                }
 
-               $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}";
+               $from = $linkRenderer->makeKnownLink(
+                       $fromObj,
+                       null,
+                       [],
+                       [ 'redirect' => 'no' ]
+               );
+               $links = [];
+               // if the page is editable, add an edit link
+               if (
+                       // check user permissions
+                       $this->getUser()->isAllowed( 'edit' ) &&
+                       // check, if the content model is editable through action=edit
+                       ContentHandler::getForTitle( $fromObj )->supportsDirectEditing()
+               ) {
+                       $links[] = $linkRenderer->makeKnownLink(
+                               $fromObj,
+                               $this->msg( 'brokenredirects-edit' )->text(),
+                               [],
+                               [ 'action' => 'edit' ]
+                       );
+               }
+               $to = $linkRenderer->makeBrokenLink( $toObj, $toObj->getFullText() );
+               $arr = $this->getLanguage()->getArrow();
+
+               $out = $from . $this->msg( 'word-separator' )->escaped();
+
+               if ( $this->getUser()->isAllowed( 'delete' ) ) {
+                       $links[] = $linkRenderer->makeKnownLink(
+                               $fromObj,
+                               $this->msg( 'brokenredirects-delete' )->text(),
+                               [],
+                               [ 'action' => 'delete' ]
+                       );
                }
 
+               if ( $links ) {
+                       $out .= $this->msg( 'parentheses' )->rawParams( $this->getLanguage()
+                               ->pipeList( $links ) )->escaped();
+               }
                $out .= " {$arr} {$to}";
+
                return $out;
        }
-}
-
-/**
- * constructor
- */
-function wfSpecialBrokenRedirects() {
-       list( $limit, $offset ) = wfCheckLimits();
 
-       $sbr = new BrokenRedirectsPage();
+       /**
+        * Cache page content model for performance
+        *
+        * @param IDatabase $db
+        * @param ResultWrapper $res
+        */
+       function preprocessResults( $db, $res ) {
+               $this->executeLBFromResultWrapper( $res );
+       }
 
-       return $sbr->doQuery( $offset, $limit );
+       protected function getGroupName() {
+               return 'maintenance';
+       }
 }