MediaWiki  REL1_20
RevisionList.php
Go to the documentation of this file.
00001 <?php
00026 abstract class RevisionListBase extends ContextSource {
00030         var $title;
00031 
00032         var $ids, $res, $current;
00033 
00039         function __construct( IContextSource $context, Title $title ) {
00040                 $this->setContext( $context );
00041                 $this->title = $title;
00042         }
00043 
00048         function filterByIds( array $ids ) {
00049                 $this->ids = $ids;
00050         }
00051 
00057         public function getType() {
00058                 return null;
00059         }
00060 
00064         protected function initCurrent() {
00065                 $row = $this->res->current();
00066                 if ( $row ) {
00067                         $this->current = $this->newItem( $row );
00068                 } else {
00069                         $this->current = false;
00070                 }
00071         }
00072 
00077         public function reset() {
00078                 if ( !$this->res ) {
00079                         $this->res = $this->doQuery( wfGetDB( DB_SLAVE ) );
00080                 } else {
00081                         $this->res->rewind();
00082                 }
00083                 $this->initCurrent();
00084                 return $this->current;
00085         }
00086 
00090         public function current() {
00091                 return $this->current;
00092         }
00093 
00097         public function next() {
00098                 $this->res->next();
00099                 $this->initCurrent();
00100                 return $this->current;
00101         }
00102 
00107         public function length() {
00108                 if( !$this->res ) {
00109                         return 0;
00110                 } else {
00111                         return $this->res->numRows();
00112                 }
00113         }
00114 
00119         abstract public function doQuery( $db );
00120 
00125         abstract public function newItem( $row );
00126 }
00127 
00131 abstract class RevisionItemBase {
00133         var $list;
00134 
00136         var $row;
00137 
00142         public function __construct( $list, $row ) {
00143                 $this->list = $list;
00144                 $this->row = $row;
00145         }
00146 
00152         public function getIdField() {
00153                 return null;
00154         }
00155 
00161         public function getTimestampField() {
00162                 return false;
00163         }
00164 
00170         public function getAuthorIdField() {
00171                 return false;
00172         }
00173 
00179         public function getAuthorNameField() {
00180                 return false;
00181         }
00182 
00187         public function getId() {
00188                 $field = $this->getIdField();
00189                 return $this->row->$field;
00190         }
00191 
00196         public function formatDate() {
00197                 return $this->list->getLanguage()->userDate( $this->getTimestamp(),
00198                         $this->list->getUser() );
00199         }
00200 
00205         public function formatTime() {
00206                 return $this->list->getLanguage()->userTime( $this->getTimestamp(),
00207                         $this->list->getUser() );
00208         }
00209 
00214         public function getTimestamp() {
00215                 $field = $this->getTimestampField();
00216                 return wfTimestamp( TS_MW, $this->row->$field );
00217         }
00218 
00223         public function getAuthorId() {
00224                 $field = $this->getAuthorIdField();
00225                 return intval( $this->row->$field );
00226         }
00227 
00232         public function getAuthorName() {
00233                 $field = $this->getAuthorNameField();
00234                 return strval( $this->row->$field );
00235         }
00236 
00240         abstract public function canView();
00241 
00245         abstract public function canViewContent();
00246 
00251         abstract public function getHTML();
00252 }
00253 
00254 class RevisionList extends RevisionListBase {
00255         public function getType() {
00256                 return 'revision';
00257         }
00258 
00263         public function doQuery( $db ) {
00264                 $conds = array( 'rev_page' => $this->title->getArticleID() );
00265                 if ( $this->ids !== null ) {
00266                         $conds['rev_id'] = array_map( 'intval', $this->ids );
00267                 }
00268                 return $db->select(
00269                         array( 'revision', 'page', 'user' ),
00270                         array_merge( Revision::selectFields(), Revision::selectUserFields() ),
00271                         $conds,
00272                         __METHOD__,
00273                         array( 'ORDER BY' => 'rev_id DESC' ),
00274                         array(
00275                                 'page' => Revision::pageJoinCond(),
00276                                 'user' => Revision::userJoinCond() )
00277                 );
00278         }
00279 
00280         public function newItem( $row ) {
00281                 return new RevisionItem( $this, $row );
00282         }
00283 }
00284 
00288 class RevisionItem extends RevisionItemBase {
00289         var $revision, $context;
00290 
00291         public function __construct( $list, $row ) {
00292                 parent::__construct( $list, $row );
00293                 $this->revision = new Revision( $row );
00294                 $this->context = $list->getContext();
00295         }
00296 
00297         public function getIdField() {
00298                 return 'rev_id';
00299         }
00300 
00301         public function getTimestampField() {
00302                 return 'rev_timestamp';
00303         }
00304 
00305         public function getAuthorIdField() {
00306                 return 'rev_user';
00307         }
00308 
00309         public function getAuthorNameField() {
00310                 return 'user_name'; // see Revision::selectUserFields()
00311         }
00312 
00313         public function canView() {
00314                 return $this->revision->userCan( Revision::DELETED_RESTRICTED, $this->context->getUser() );
00315         }
00316 
00317         public function canViewContent() {
00318                 return $this->revision->userCan( Revision::DELETED_TEXT, $this->context->getUser() );
00319         }
00320 
00321         public function isDeleted() {
00322                 return $this->revision->isDeleted( Revision::DELETED_TEXT );
00323         }
00324 
00330         protected function getRevisionLink() {
00331                 $date = $this->list->getLanguage()->timeanddate( $this->revision->getTimestamp(), true );
00332                 if ( $this->isDeleted() && !$this->canViewContent() ) {
00333                         return $date;
00334                 }
00335                 return Linker::link(
00336                         $this->list->title,
00337                         $date,
00338                         array(),
00339                         array(
00340                                 'oldid' => $this->revision->getId(),
00341                                 'unhide' => 1
00342                         )
00343                 );
00344         }
00345 
00351         protected function getDiffLink() {
00352                 if ( $this->isDeleted() && !$this->canViewContent() ) {
00353                         return $this->context->msg( 'diff' )->escaped();
00354                 } else {
00355                         return
00356                                 Linker::link(
00357                                         $this->list->title,
00358                                         $this->context->msg( 'diff' )->escaped(),
00359                                         array(),
00360                                         array(
00361                                                 'diff' => $this->revision->getId(),
00362                                                 'oldid' => 'prev',
00363                                                 'unhide' => 1
00364                                         ),
00365                                         array(
00366                                                 'known',
00367                                                 'noclasses'
00368                                         )
00369                                 );
00370                 }
00371         }
00372 
00373         public function getHTML() {
00374                 $difflink = $this->context->msg( 'parentheses' )
00375                         ->rawParams( $this->getDiffLink() )->escaped();
00376                 $revlink = $this->getRevisionLink();
00377                 $userlink = Linker::revUserLink( $this->revision );
00378                 $comment = Linker::revComment( $this->revision );
00379                 if ( $this->isDeleted() ) {
00380                         $revlink = "<span class=\"history-deleted\">$revlink</span>";
00381                 }
00382                 return "<li>$difflink $revlink $userlink $comment</li>";
00383         }
00384 }