MediaWiki  REL1_24
DeleteLogFormatter.php
Go to the documentation of this file.
00001 <?php
00031 class DeleteLogFormatter extends LogFormatter {
00032     protected function getMessageKey() {
00033         $key = parent::getMessageKey();
00034         if ( in_array( $this->entry->getSubtype(), array( 'event', 'revision' ) ) ) {
00035             if ( count( $this->getMessageParameters() ) < 5 ) {
00036                 return "$key-legacy";
00037             }
00038         }
00039 
00040         return $key;
00041     }
00042 
00043     protected function getMessageParameters() {
00044         if ( isset( $this->parsedParametersDeleteLog ) ) {
00045             return $this->parsedParametersDeleteLog;
00046         }
00047 
00048         $params = parent::getMessageParameters();
00049         $subtype = $this->entry->getSubtype();
00050         if ( in_array( $subtype, array( 'event', 'revision' ) ) ) {
00051             // $params[3] here is 'revision' or 'archive' for page revisions, 'oldimage' or
00052             // 'filearchive' for file versions, or a comma-separated list of log_ids for log
00053             // entries. $subtype here is 'revision' for page revisions and file
00054             // versions, or 'event' for log entries.
00055             if ( ( $subtype === 'event' && count( $params ) === 6 )
00056                 || ( $subtype === 'revision' && isset( $params[3] )
00057                     && ( $params[3] === 'revision' || $params[3] === 'oldimage'
00058                         || $params[3] === 'archive' || $params[3] === 'filearchive' )
00059                 )
00060             ) {
00061                 $paramStart = $subtype === 'revision' ? 4 : 3;
00062 
00063                 $old = $this->parseBitField( $params[$paramStart + 1] );
00064                 $new = $this->parseBitField( $params[$paramStart + 2] );
00065                 list( $hid, $unhid, $extra ) = RevisionDeleter::getChanges( $new, $old );
00066                 $changes = array();
00067                 // messages used: revdelete-content-hid, revdelete-summary-hid, revdelete-uname-hid
00068                 foreach ( $hid as $v ) {
00069                     $changes[] = $this->msg( "$v-hid" )->plain();
00070                 }
00071                 // messages used: revdelete-content-unhid, revdelete-summary-unhid, revdelete-uname-unhid
00072                 foreach ( $unhid as $v ) {
00073                     $changes[] = $this->msg( "$v-unhid" )->plain();
00074                 }
00075                 foreach ( $extra as $v ) {
00076                     $changes[] = $this->msg( $v )->plain();
00077                 }
00078                 $changeText = $this->context->getLanguage()->listToText( $changes );
00079 
00080                 $newParams = array_slice( $params, 0, 3 );
00081                 $newParams[3] = $changeText;
00082                 $count = count( explode( ',', $params[$paramStart] ) );
00083                 $newParams[4] = $this->context->getLanguage()->formatNum( $count );
00084 
00085                 $this->parsedParametersDeleteLog = $newParams;
00086                 return $this->parsedParametersDeleteLog;
00087             } else {
00088                 $this->parsedParametersDeleteLog = array_slice( $params, 0, 3 );
00089                 return $this->parsedParametersDeleteLog;
00090             }
00091         }
00092 
00093         $this->parsedParametersDeleteLog = $params;
00094         return $this->parsedParametersDeleteLog;
00095     }
00096 
00097     protected function parseBitField( $string ) {
00098         // Input is like ofield=2134 or just the number
00099         if ( strpos( $string, 'field=' ) === 1 ) {
00100             list( , $field ) = explode( '=', $string );
00101 
00102             return (int)$field;
00103         } else {
00104             return (int)$string;
00105         }
00106     }
00107 
00108     public function getActionLinks() {
00109         $user = $this->context->getUser();
00110         if ( !$user->isAllowed( 'deletedhistory' )
00111             || $this->entry->isDeleted( LogPage::DELETED_ACTION )
00112         ) {
00113             return '';
00114         }
00115 
00116         switch ( $this->entry->getSubtype() ) {
00117             case 'delete': // Show undelete link
00118                 if ( $user->isAllowed( 'undelete' ) ) {
00119                     $message = 'undeletelink';
00120                 } else {
00121                     $message = 'undeleteviewlink';
00122                 }
00123                 $revert = Linker::linkKnown(
00124                     SpecialPage::getTitleFor( 'Undelete' ),
00125                     $this->msg( $message )->escaped(),
00126                     array(),
00127                     array( 'target' => $this->entry->getTarget()->getPrefixedDBkey() )
00128                 );
00129 
00130                 return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
00131 
00132             case 'revision': // If an edit was hidden from a page give a review link to the history
00133                 $params = $this->extractParameters();
00134                 if ( !isset( $params[3] ) || !isset( $params[4] ) ) {
00135                     return '';
00136                 }
00137 
00138                 // Different revision types use different URL params...
00139                 $key = $params[3];
00140                 // This is a CSV of the IDs
00141                 $ids = explode( ',', $params[4] );
00142 
00143                 $links = array();
00144 
00145                 // If there's only one item, we can show a diff link
00146                 if ( count( $ids ) == 1 ) {
00147                     // Live revision diffs...
00148                     if ( $key == 'oldid' || $key == 'revision' ) {
00149                         $links[] = Linker::linkKnown(
00150                             $this->entry->getTarget(),
00151                             $this->msg( 'diff' )->escaped(),
00152                             array(),
00153                             array(
00154                                 'diff' => intval( $ids[0] ),
00155                                 'unhide' => 1
00156                             )
00157                         );
00158                         // Deleted revision diffs...
00159                     } elseif ( $key == 'artimestamp' || $key == 'archive' ) {
00160                         $links[] = Linker::linkKnown(
00161                             SpecialPage::getTitleFor( 'Undelete' ),
00162                             $this->msg( 'diff' )->escaped(),
00163                             array(),
00164                             array(
00165                                 'target' => $this->entry->getTarget()->getPrefixedDBkey(),
00166                                 'diff' => 'prev',
00167                                 'timestamp' => $ids[0]
00168                             )
00169                         );
00170                     }
00171                 }
00172 
00173                 // View/modify link...
00174                 $links[] = Linker::linkKnown(
00175                     SpecialPage::getTitleFor( 'Revisiondelete' ),
00176                     $this->msg( 'revdel-restore' )->escaped(),
00177                     array(),
00178                     array(
00179                         'target' => $this->entry->getTarget()->getPrefixedText(),
00180                         'type' => $key,
00181                         'ids' => implode( ',', $ids ),
00182                     )
00183                 );
00184 
00185                 return $this->msg( 'parentheses' )->rawParams(
00186                     $this->context->getLanguage()->pipeList( $links ) )->escaped();
00187 
00188             case 'event': // Hidden log items, give review link
00189                 $params = $this->extractParameters();
00190                 if ( !isset( $params[3] ) ) {
00191                     return '';
00192                 }
00193                 // This is a CSV of the IDs
00194                 $query = $params[3];
00195                 // Link to each hidden object ID, $params[1] is the url param
00196                 $revert = Linker::linkKnown(
00197                     SpecialPage::getTitleFor( 'Revisiondelete' ),
00198                     $this->msg( 'revdel-restore' )->escaped(),
00199                     array(),
00200                     array(
00201                         'target' => $this->entry->getTarget()->getPrefixedText(),
00202                         'type' => 'logging',
00203                         'ids' => $query
00204                     )
00205                 );
00206 
00207                 return $this->msg( 'parentheses' )->rawParams( $revert )->escaped();
00208             default:
00209                 return '';
00210         }
00211     }
00212 }