[ Index ] |
PHP Cross Reference of MediaWiki-1.24.0 |
[Summary view] [Print] [Text view]
1 <?php 2 /** 3 * Holders of revision list for a single page 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 */ 22 23 /** 24 * List for revision table items for a single page 25 */ 26 abstract class RevisionListBase extends ContextSource { 27 /** @var Title */ 28 public $title; 29 30 /** @var array */ 31 protected $ids; 32 33 protected $res; 34 35 /** @var bool|object */ 36 protected $current; 37 38 /** 39 * Construct a revision list for a given title 40 * @param IContextSource $context 41 * @param Title $title 42 */ 43 function __construct( IContextSource $context, Title $title ) { 44 $this->setContext( $context ); 45 $this->title = $title; 46 } 47 48 /** 49 * Select items only where the ID is any of the specified values 50 * @param array $ids 51 */ 52 function filterByIds( array $ids ) { 53 $this->ids = $ids; 54 } 55 56 /** 57 * Get the internal type name of this list. Equal to the table name. 58 * Override this function. 59 * @return null 60 */ 61 public function getType() { 62 return null; 63 } 64 65 /** 66 * Initialise the current iteration pointer 67 */ 68 protected function initCurrent() { 69 $row = $this->res->current(); 70 if ( $row ) { 71 $this->current = $this->newItem( $row ); 72 } else { 73 $this->current = false; 74 } 75 } 76 77 /** 78 * Start iteration. This must be called before current() or next(). 79 * @return Revision First list item 80 */ 81 public function reset() { 82 if ( !$this->res ) { 83 $this->res = $this->doQuery( wfGetDB( DB_SLAVE ) ); 84 } else { 85 $this->res->rewind(); 86 } 87 $this->initCurrent(); 88 return $this->current; 89 } 90 91 /** 92 * Get the current list item, or false if we are at the end 93 * @return Revision 94 */ 95 public function current() { 96 return $this->current; 97 } 98 99 /** 100 * Move the iteration pointer to the next list item, and return it. 101 * @return Revision 102 */ 103 public function next() { 104 $this->res->next(); 105 $this->initCurrent(); 106 return $this->current; 107 } 108 109 /** 110 * Get the number of items in the list. 111 * @return int 112 */ 113 public function length() { 114 if ( !$this->res ) { 115 return 0; 116 } else { 117 return $this->res->numRows(); 118 } 119 } 120 121 /** 122 * Do the DB query to iterate through the objects. 123 * @param DatabaseBase $db DatabaseBase object to use for the query 124 */ 125 abstract public function doQuery( $db ); 126 127 /** 128 * Create an item object from a DB result row 129 * @param object $row 130 */ 131 abstract public function newItem( $row ); 132 } 133 134 /** 135 * Abstract base class for revision items 136 */ 137 abstract class RevisionItemBase { 138 /** @var RevisionListBase The parent */ 139 protected $list; 140 141 /** The database result row */ 142 protected $row; 143 144 /** 145 * @param RevisionListBase $list 146 * @param object $row DB result row 147 */ 148 public function __construct( $list, $row ) { 149 $this->list = $list; 150 $this->row = $row; 151 } 152 153 /** 154 * Get the DB field name associated with the ID list. 155 * Override this function. 156 * @return null 157 */ 158 public function getIdField() { 159 return null; 160 } 161 162 /** 163 * Get the DB field name storing timestamps. 164 * Override this function. 165 * @return bool 166 */ 167 public function getTimestampField() { 168 return false; 169 } 170 171 /** 172 * Get the DB field name storing user ids. 173 * Override this function. 174 * @return bool 175 */ 176 public function getAuthorIdField() { 177 return false; 178 } 179 180 /** 181 * Get the DB field name storing user names. 182 * Override this function. 183 * @return bool 184 */ 185 public function getAuthorNameField() { 186 return false; 187 } 188 189 /** 190 * Get the ID, as it would appear in the ids URL parameter 191 * @return int 192 */ 193 public function getId() { 194 $field = $this->getIdField(); 195 return $this->row->$field; 196 } 197 198 /** 199 * Get the date, formatted in user's language 200 * @return string 201 */ 202 public function formatDate() { 203 return $this->list->getLanguage()->userDate( $this->getTimestamp(), 204 $this->list->getUser() ); 205 } 206 207 /** 208 * Get the time, formatted in user's language 209 * @return string 210 */ 211 public function formatTime() { 212 return $this->list->getLanguage()->userTime( $this->getTimestamp(), 213 $this->list->getUser() ); 214 } 215 216 /** 217 * Get the timestamp in MW 14-char form 218 * @return mixed 219 */ 220 public function getTimestamp() { 221 $field = $this->getTimestampField(); 222 return wfTimestamp( TS_MW, $this->row->$field ); 223 } 224 225 /** 226 * Get the author user ID 227 * @return int 228 */ 229 public function getAuthorId() { 230 $field = $this->getAuthorIdField(); 231 return intval( $this->row->$field ); 232 } 233 234 /** 235 * Get the author user name 236 * @return string 237 */ 238 public function getAuthorName() { 239 $field = $this->getAuthorNameField(); 240 return strval( $this->row->$field ); 241 } 242 243 /** 244 * Returns true if the current user can view the item 245 */ 246 abstract public function canView(); 247 248 /** 249 * Returns true if the current user can view the item text/file 250 */ 251 abstract public function canViewContent(); 252 253 /** 254 * Get the HTML of the list item. Should be include "<li></li>" tags. 255 * This is used to show the list in HTML form, by the special page. 256 */ 257 abstract public function getHTML(); 258 } 259 260 class RevisionList extends RevisionListBase { 261 public function getType() { 262 return 'revision'; 263 } 264 265 /** 266 * @param DatabaseBase $db 267 * @return mixed 268 */ 269 public function doQuery( $db ) { 270 $conds = array( 'rev_page' => $this->title->getArticleID() ); 271 if ( $this->ids !== null ) { 272 $conds['rev_id'] = array_map( 'intval', $this->ids ); 273 } 274 return $db->select( 275 array( 'revision', 'page', 'user' ), 276 array_merge( Revision::selectFields(), Revision::selectUserFields() ), 277 $conds, 278 __METHOD__, 279 array( 'ORDER BY' => 'rev_id DESC' ), 280 array( 281 'page' => Revision::pageJoinCond(), 282 'user' => Revision::userJoinCond() ) 283 ); 284 } 285 286 public function newItem( $row ) { 287 return new RevisionItem( $this, $row ); 288 } 289 } 290 291 /** 292 * Item class for a live revision table row 293 */ 294 class RevisionItem extends RevisionItemBase { 295 /** @var Revision */ 296 protected $revision; 297 298 /** @var RequestContext */ 299 protected $context; 300 301 public function __construct( $list, $row ) { 302 parent::__construct( $list, $row ); 303 $this->revision = new Revision( $row ); 304 $this->context = $list->getContext(); 305 } 306 307 public function getIdField() { 308 return 'rev_id'; 309 } 310 311 public function getTimestampField() { 312 return 'rev_timestamp'; 313 } 314 315 public function getAuthorIdField() { 316 return 'rev_user'; 317 } 318 319 public function getAuthorNameField() { 320 return 'user_name'; // see Revision::selectUserFields() 321 } 322 323 public function canView() { 324 return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->context->getUser() ); 325 } 326 327 public function canViewContent() { 328 return $this->revision->userCan( Revision::DELETED_TEXT, $this->context->getUser() ); 329 } 330 331 public function isDeleted() { 332 return $this->revision->isDeleted( Revision::DELETED_TEXT ); 333 } 334 335 /** 336 * Get the HTML link to the revision text. 337 * Overridden by RevDelArchiveItem. 338 * @return string 339 */ 340 protected function getRevisionLink() { 341 $date = $this->list->getLanguage()->timeanddate( $this->revision->getTimestamp(), true ); 342 if ( $this->isDeleted() && !$this->canViewContent() ) { 343 return $date; 344 } 345 return Linker::link( 346 $this->list->title, 347 $date, 348 array(), 349 array( 350 'oldid' => $this->revision->getId(), 351 'unhide' => 1 352 ) 353 ); 354 } 355 356 /** 357 * Get the HTML link to the diff. 358 * Overridden by RevDelArchiveItem 359 * @return string 360 */ 361 protected function getDiffLink() { 362 if ( $this->isDeleted() && !$this->canViewContent() ) { 363 return $this->context->msg( 'diff' )->escaped(); 364 } else { 365 return Linker::link( 366 $this->list->title, 367 $this->context->msg( 'diff' )->escaped(), 368 array(), 369 array( 370 'diff' => $this->revision->getId(), 371 'oldid' => 'prev', 372 'unhide' => 1 373 ), 374 array( 375 'known', 376 'noclasses' 377 ) 378 ); 379 } 380 } 381 382 public function getHTML() { 383 $difflink = $this->context->msg( 'parentheses' ) 384 ->rawParams( $this->getDiffLink() )->escaped(); 385 $revlink = $this->getRevisionLink(); 386 $userlink = Linker::revUserLink( $this->revision ); 387 $comment = Linker::revComment( $this->revision ); 388 if ( $this->isDeleted() ) { 389 $revlink = "<span class=\"history-deleted\">$revlink</span>"; 390 } 391 return "<li>$difflink $revlink $userlink $comment</li>"; 392 } 393 }
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 |