[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
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 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Fri Nov 28 14:03:12 2014 | Cross-referenced by PHPXref 0.7.1 |