[ Index ]

PHP Cross Reference of MediaWiki-1.24.0

title

Body

[close]

/includes/specials/ -> SpecialDoubleRedirects.php (source)

   1  <?php
   2  /**
   3   * Implements Special:DoubleRedirects
   4   *
   5   * This program is free software; you can redistribute it and/or modify
   6   * it under the terms of the GNU General Public License as published by
   7   * the Free Software Foundation; either version 2 of the License, or
   8   * (at your option) any later version.
   9   *
  10   * This program is distributed in the hope that it will be useful,
  11   * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13   * GNU General Public License for more details.
  14   *
  15   * You should have received a copy of the GNU General Public License along
  16   * with this program; if not, write to the Free Software Foundation, Inc.,
  17   * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
  18   * http://www.gnu.org/copyleft/gpl.html
  19   *
  20   * @file
  21   * @ingroup SpecialPage
  22   */
  23  
  24  /**
  25   * A special page listing redirects to redirecting page.
  26   * The software will automatically not follow double redirects, to prevent loops.
  27   *
  28   * @ingroup SpecialPage
  29   */
  30  class DoubleRedirectsPage extends QueryPage {
  31  	function __construct( $name = 'DoubleRedirects' ) {
  32          parent::__construct( $name );
  33      }
  34  
  35  	function isExpensive() {
  36          return true;
  37      }
  38  
  39  	function isSyndicated() {
  40          return false;
  41      }
  42  
  43  	function sortDescending() {
  44          return false;
  45      }
  46  
  47  	function getPageHeader() {
  48          return $this->msg( 'doubleredirectstext' )->parseAsBlock();
  49      }
  50  
  51  	function reallyGetQueryInfo( $namespace = null, $title = null ) {
  52          $limitToTitle = !( $namespace === null && $title === null );
  53          $dbr = wfGetDB( DB_SLAVE );
  54          $retval = array(
  55              'tables' => array(
  56                  'ra' => 'redirect',
  57                  'rb' => 'redirect',
  58                  'pa' => 'page',
  59                  'pb' => 'page'
  60              ),
  61              'fields' => array(
  62                  'namespace' => 'pa.page_namespace',
  63                  'title' => 'pa.page_title',
  64                  'value' => 'pa.page_title',
  65  
  66                  'nsb' => 'pb.page_namespace',
  67                  'tb' => 'pb.page_title',
  68  
  69                  // Select fields from redirect instead of page. Because there may
  70                  // not actually be a page table row for this target (e.g. for interwiki redirects)
  71                  'nsc' => 'rb.rd_namespace',
  72                  'tc' => 'rb.rd_title',
  73                  'iwc' => 'rb.rd_interwiki',
  74              ),
  75              'conds' => array(
  76                  'ra.rd_from = pa.page_id',
  77  
  78                  // Filter out redirects where the target goes interwiki (bug 40353).
  79                  // This isn't an optimization, it is required for correct results,
  80                  // otherwise a non-double redirect like Bar -> w:Foo will show up
  81                  // like "Bar -> Foo -> w:Foo".
  82  
  83                  // Need to check both NULL and "" for some reason,
  84                  // apparently either can be stored for non-iw entries.
  85                  'ra.rd_interwiki IS NULL OR ra.rd_interwiki = ' . $dbr->addQuotes( '' ),
  86  
  87                  'pb.page_namespace = ra.rd_namespace',
  88                  'pb.page_title = ra.rd_title',
  89  
  90                  'rb.rd_from = pb.page_id',
  91              )
  92          );
  93  
  94          if ( $limitToTitle ) {
  95              $retval['conds']['pa.page_namespace'] = $namespace;
  96              $retval['conds']['pa.page_title'] = $title;
  97          }
  98  
  99          return $retval;
 100      }
 101  
 102  	function getQueryInfo() {
 103          return $this->reallyGetQueryInfo();
 104      }
 105  
 106  	function getOrderFields() {
 107          return array( 'ra.rd_namespace', 'ra.rd_title' );
 108      }
 109  
 110      /**
 111       * @param Skin $skin
 112       * @param object $result Result row
 113       * @return string
 114       */
 115  	function formatResult( $skin, $result ) {
 116          $titleA = Title::makeTitle( $result->namespace, $result->title );
 117  
 118          // If only titleA is in the query, it means this came from
 119          // querycache (which only saves 3 columns).
 120          // That does save the bulk of the query cost, but now we need to
 121          // get a little more detail about each individual entry quickly
 122          // using the filter of reallyGetQueryInfo.
 123          if ( $result && !isset( $result->nsb ) ) {
 124              $dbr = wfGetDB( DB_SLAVE );
 125              $qi = $this->reallyGetQueryInfo(
 126                  $result->namespace,
 127                  $result->title
 128              );
 129              $res = $dbr->select(
 130                  $qi['tables'],
 131                  $qi['fields'],
 132                  $qi['conds'],
 133                  __METHOD__
 134              );
 135  
 136              if ( $res ) {
 137                  $result = $dbr->fetchObject( $res );
 138              }
 139          }
 140          if ( !$result ) {
 141              return '<del>' . Linker::link( $titleA, null, array(), array( 'redirect' => 'no' ) ) . '</del>';
 142          }
 143  
 144          $titleB = Title::makeTitle( $result->nsb, $result->tb );
 145          $titleC = Title::makeTitle( $result->nsc, $result->tc, '', $result->iwc );
 146  
 147          $linkA = Linker::linkKnown(
 148              $titleA,
 149              null,
 150              array(),
 151              array( 'redirect' => 'no' )
 152          );
 153  
 154          $edit = Linker::linkKnown(
 155              $titleA,
 156              $this->msg( 'parentheses', $this->msg( 'editlink' )->text() )->escaped(),
 157              array(),
 158              array(
 159                  'redirect' => 'no',
 160                  'action' => 'edit'
 161              )
 162          );
 163  
 164          $linkB = Linker::linkKnown(
 165              $titleB,
 166              null,
 167              array(),
 168              array( 'redirect' => 'no' )
 169          );
 170  
 171          $linkC = Linker::linkKnown( $titleC );
 172  
 173          $lang = $this->getLanguage();
 174          $arr = $lang->getArrow() . $lang->getDirMark();
 175  
 176          return ( "{$linkA} {$edit} {$arr} {$linkB} {$arr} {$linkC}" );
 177      }
 178  
 179  	protected function getGroupName() {
 180          return 'maintenance';
 181      }
 182  }


Generated: Fri Nov 28 14:03:12 2014 Cross-referenced by PHPXref 0.7.1