MediaWiki 1.40.4
LogFormatter.php
Go to the documentation of this file.
1<?php
34
48 // Audience options for viewing usernames, comments, and actions
49 public const FOR_PUBLIC = 1;
50 public const FOR_THIS_USER = 2;
51
52 // Static->
53
59 public static function newFromEntry( LogEntry $entry ) {
60 $logActionsHandlers = MediaWikiServices::getInstance()->getMainConfig()
61 ->get( MainConfigNames::LogActionsHandlers );
62 $fulltype = $entry->getFullType();
63 $wildcard = $entry->getType() . '/*';
64 $handler = $logActionsHandlers[$fulltype] ?? $logActionsHandlers[$wildcard] ?? '';
65
66 if ( $handler !== '' && is_string( $handler ) && class_exists( $handler ) ) {
67 return new $handler( $entry );
68 }
69
70 return new LegacyLogFormatter( $entry );
71 }
72
80 public static function newFromRow( $row ) {
81 return self::newFromEntry( DatabaseLogEntry::newFromRow( $row ) );
82 }
83
84 // Nonstatic->
85
87 protected $entry;
88
90 protected $audience = self::FOR_PUBLIC;
91
93 public $context;
94
96 protected $linkFlood = false;
97
105 protected $plaintext = false;
106
108 protected $irctext = false;
109
113 private $linkRenderer;
114
120
126 protected function __construct( LogEntry $entry ) {
127 $this->entry = $entry;
128 $this->context = RequestContext::getMain();
129 }
130
135 public function setContext( IContextSource $context ) {
136 $this->context = $context;
137 }
138
143 public function setLinkRenderer( LinkRenderer $linkRenderer ) {
144 $this->linkRenderer = $linkRenderer;
145 }
146
151 public function getLinkRenderer() {
152 if ( $this->linkRenderer !== null ) {
153 return $this->linkRenderer;
154 } else {
155 return MediaWikiServices::getInstance()->getLinkRenderer();
156 }
157 }
158
165 public function setAudience( $audience ) {
166 $this->audience = ( $audience == self::FOR_THIS_USER )
167 ? self::FOR_THIS_USER
168 : self::FOR_PUBLIC;
169 }
170
175 public function canViewLogType() {
176 // If the user doesn't have the right permission to view the specific
177 // log type, return false
178 $logRestrictions = $this->context->getConfig()->get( MainConfigNames::LogRestrictions );
179 $type = $this->entry->getType();
180 return !isset( $logRestrictions[$type] )
181 || $this->context->getAuthority()->isAllowed( $logRestrictions[$type] );
182 }
183
189 protected function canView( $field ) {
190 if ( $this->audience == self::FOR_THIS_USER ) {
191 return LogEventsList::userCanBitfield(
192 $this->entry->getDeleted(), $field, $this->context->getAuthority() ) &&
193 self::canViewLogType();
194 } else {
195 return !$this->entry->isDeleted( $field ) && self::canViewLogType();
196 }
197 }
198
205 public function setShowUserToolLinks( $value ) {
206 $this->linkFlood = $value;
207 }
208
217 public function getPlainActionText() {
218 $this->plaintext = true;
219 $text = $this->getActionText();
220 $this->plaintext = false;
221
222 return $text;
223 }
224
231 public function getIRCActionComment() {
232 $actionComment = $this->getIRCActionText();
233 $comment = $this->entry->getComment();
234
235 if ( $comment != '' ) {
236 if ( $actionComment == '' ) {
237 $actionComment = $comment;
238 } else {
239 $actionComment .= wfMessage( 'colon-separator' )->inContentLanguage()->text() . $comment;
240 }
241 }
242
243 return $actionComment;
244 }
245
253 public function getIRCActionText() {
254 $this->plaintext = true;
255 $this->irctext = true;
256
257 $entry = $this->entry;
258 $parameters = $entry->getParameters();
259 // @see LogPage::actionText()
260 // Text of title the action is aimed at.
261 $target = $entry->getTarget()->getPrefixedText();
262 $text = null;
263 $contLang = MediaWikiServices::getInstance()->getContentLanguage();
264 switch ( $entry->getType() ) {
265 case 'move':
266 switch ( $entry->getSubtype() ) {
267 case 'move':
268 $movesource = $parameters['4::target'];
269 $text = wfMessage( '1movedto2' )
270 ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
271 break;
272 case 'move_redir':
273 $movesource = $parameters['4::target'];
274 $text = wfMessage( '1movedto2_redir' )
275 ->rawParams( $target, $movesource )->inContentLanguage()->escaped();
276 break;
277 case 'move-noredirect':
278 break;
279 case 'move_redir-noredirect':
280 break;
281 }
282 break;
283
284 case 'delete':
285 switch ( $entry->getSubtype() ) {
286 case 'delete':
287 $text = wfMessage( 'deletedarticle' )
288 ->rawParams( $target )->inContentLanguage()->escaped();
289 break;
290 case 'restore':
291 $text = wfMessage( 'undeletedarticle' )
292 ->rawParams( $target )->inContentLanguage()->escaped();
293 break;
294 }
295 break;
296
297 case 'patrol':
298 // https://github.com/wikimedia/mediawiki/commit/1a05f8faf78675dc85984f27f355b8825b43efff
299 // Create a diff link to the patrolled revision
300 if ( $entry->getSubtype() === 'patrol' ) {
301 $diffLink = htmlspecialchars(
302 wfMessage( 'patrol-log-diff', $parameters['4::curid'] )
303 ->inContentLanguage()->text() );
304 $text = wfMessage( 'patrol-log-line', $diffLink, "[[$target]]", "" )
305 ->inContentLanguage()->text();
306 } else {
307 // broken??
308 }
309 break;
310
311 case 'protect':
312 switch ( $entry->getSubtype() ) {
313 case 'protect':
314 $text = wfMessage( 'protectedarticle' )
315 ->rawParams( $target . ' ' . $parameters['4::description'] )
316 ->inContentLanguage()
317 ->escaped();
318 break;
319 case 'unprotect':
320 $text = wfMessage( 'unprotectedarticle' )
321 ->rawParams( $target )->inContentLanguage()->escaped();
322 break;
323 case 'modify':
324 $text = wfMessage( 'modifiedarticleprotection' )
325 ->rawParams( $target . ' ' . $parameters['4::description'] )
326 ->inContentLanguage()
327 ->escaped();
328 break;
329 case 'move_prot':
330 $text = wfMessage( 'movedarticleprotection' )
331 ->rawParams( $target, $parameters['4::oldtitle'] )->inContentLanguage()->escaped();
332 break;
333 }
334 break;
335
336 case 'newusers':
337 switch ( $entry->getSubtype() ) {
338 case 'newusers':
339 case 'create':
340 $text = wfMessage( 'newuserlog-create-entry' )
341 ->inContentLanguage()->escaped();
342 break;
343 case 'create2':
344 case 'byemail':
345 $text = wfMessage( 'newuserlog-create2-entry' )
346 ->rawParams( $target )->inContentLanguage()->escaped();
347 break;
348 case 'autocreate':
349 $text = wfMessage( 'newuserlog-autocreate-entry' )
350 ->inContentLanguage()->escaped();
351 break;
352 }
353 break;
354
355 case 'upload':
356 switch ( $entry->getSubtype() ) {
357 case 'upload':
358 $text = wfMessage( 'uploadedimage' )
359 ->rawParams( $target )->inContentLanguage()->escaped();
360 break;
361 case 'overwrite':
362 case 'revert':
363 $text = wfMessage( 'overwroteimage' )
364 ->rawParams( $target )->inContentLanguage()->escaped();
365 break;
366 }
367 break;
368
369 case 'rights':
370 if ( count( $parameters['4::oldgroups'] ) ) {
371 $oldgroups = implode( ', ', $parameters['4::oldgroups'] );
372 } else {
373 $oldgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
374 }
375 if ( count( $parameters['5::newgroups'] ) ) {
376 $newgroups = implode( ', ', $parameters['5::newgroups'] );
377 } else {
378 $newgroups = wfMessage( 'rightsnone' )->inContentLanguage()->escaped();
379 }
380 switch ( $entry->getSubtype() ) {
381 case 'rights':
382 $text = wfMessage( 'rightslogentry' )
383 ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
384 break;
385 case 'autopromote':
386 $text = wfMessage( 'rightslogentry-autopromote' )
387 ->rawParams( $target, $oldgroups, $newgroups )->inContentLanguage()->escaped();
388 break;
389 }
390 break;
391
392 case 'merge':
393 $text = wfMessage( 'pagemerge-logentry' )
394 ->rawParams( $target, $parameters['4::dest'], $parameters['5::mergepoint'] )
395 ->inContentLanguage()->escaped();
396 break;
397
398 case 'block':
399 switch ( $entry->getSubtype() ) {
400 case 'block':
401 // Keep compatibility with extensions by checking for
402 // new key (5::duration/6::flags) or old key (0/optional 1)
403 if ( $entry->isLegacy() ) {
404 $rawDuration = $parameters[0];
405 $rawFlags = $parameters[1] ?? '';
406 } else {
407 $rawDuration = $parameters['5::duration'];
408 $rawFlags = $parameters['6::flags'];
409 }
410 $duration = $contLang->translateBlockExpiry(
411 $rawDuration,
412 null,
413 (int)wfTimestamp( TS_UNIX, $entry->getTimestamp() )
414 );
415 $flags = BlockLogFormatter::formatBlockFlags( $rawFlags, $contLang );
416 $text = wfMessage( 'blocklogentry' )
417 ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
418 break;
419 case 'unblock':
420 $text = wfMessage( 'unblocklogentry' )
421 ->rawParams( $target )->inContentLanguage()->escaped();
422 break;
423 case 'reblock':
424 $duration = $contLang->translateBlockExpiry(
425 $parameters['5::duration'],
426 null,
427 (int)wfTimestamp( TS_UNIX, $entry->getTimestamp() )
428 );
429 $flags = BlockLogFormatter::formatBlockFlags( $parameters['6::flags'],
430 $contLang );
431 $text = wfMessage( 'reblock-logentry' )
432 ->rawParams( $target, $duration, $flags )->inContentLanguage()->escaped();
433 break;
434 }
435 break;
436
437 case 'import':
438 switch ( $entry->getSubtype() ) {
439 case 'upload':
440 $text = wfMessage( 'import-logentry-upload' )
441 ->rawParams( $target )->inContentLanguage()->escaped();
442 break;
443 case 'interwiki':
444 $text = wfMessage( 'import-logentry-interwiki' )
445 ->rawParams( $target )->inContentLanguage()->escaped();
446 break;
447 }
448 break;
449 // case 'suppress' --private log -- aaron (so we know who to blame in a few years :-D)
450 // default:
451 }
452
453 $this->plaintext = false;
454 $this->irctext = false;
455
456 return $text ?? $this->getPlainActionText();
457 }
458
466 public function getActionText() {
467 if ( $this->canView( LogPage::DELETED_ACTION ) ) {
468 $element = $this->getActionMessage();
469 if ( $element instanceof Message ) {
470 $element = $this->plaintext ? $element->text() : $element->escaped();
471 }
472 if ( $this->entry->isDeleted( LogPage::DELETED_ACTION ) ) {
473 $element = $this->styleRestrictedElement( $element );
474 }
475 } else {
476 $sep = $this->msg( 'word-separator' );
477 $sep = $this->plaintext ? $sep->text() : $sep->escaped();
478 $performer = $this->getPerformerElement();
479 $element = $performer . $sep . $this->getRestrictedElement( 'rev-deleted-event' );
480 }
481
482 return $element;
483 }
484
491 protected function getActionMessage() {
492 $message = $this->msg( $this->getMessageKey() );
493 $message->params( $this->getMessageParameters() );
494
495 return $message;
496 }
497
506 protected function getMessageKey() {
507 $type = $this->entry->getType();
508 $subtype = $this->entry->getSubtype();
509
510 return "logentry-$type-$subtype";
511 }
512
519 public function getActionLinks() {
520 return '';
521 }
522
529 protected function extractParameters() {
530 $entry = $this->entry;
531 $params = [];
532
533 if ( $entry->isLegacy() ) {
534 foreach ( $entry->getParameters() as $index => $value ) {
535 $params[$index + 3] = $value;
536 }
537 }
538
539 // Filter out parameters which are not in format #:foo
540 foreach ( $entry->getParameters() as $key => $value ) {
541 if ( strpos( $key, ':' ) === false ) {
542 continue;
543 }
544 [ $index, $type, ] = explode( ':', $key, 3 );
545 if ( ctype_digit( $index ) ) {
546 $params[(int)$index - 1] = $this->formatParameterValue( $type, $value );
547 }
548 }
549
550 /* Message class doesn't like non consecutive numbering.
551 * Fill in missing indexes with empty strings to avoid
552 * incorrect renumbering.
553 */
554 if ( count( $params ) ) {
555 $max = max( array_keys( $params ) );
556 // index 0 to 2 are added in getMessageParameters
557 for ( $i = 3; $i < $max; $i++ ) {
558 if ( !isset( $params[$i] ) ) {
559 $params[$i] = '';
560 }
561 }
562 }
563
564 return $params;
565 }
566
577 protected function getMessageParameters() {
578 if ( isset( $this->parsedParameters ) ) {
579 return $this->parsedParameters;
580 }
581
582 $entry = $this->entry;
583 $params = $this->extractParameters();
584 $params[0] = Message::rawParam( $this->getPerformerElement() );
585 $params[1] = $this->canView( LogPage::DELETED_USER ) ? $entry->getPerformerIdentity()->getName() : '';
586 $params[2] = Message::rawParam( $this->makePageLink( $entry->getTarget() ) );
587
588 // Bad things happens if the numbers are not in correct order
589 ksort( $params );
590
591 $this->parsedParameters = $params;
592 return $this->parsedParameters;
593 }
594
621 protected function formatParameterValue( $type, $value ) {
622 $saveLinkFlood = $this->linkFlood;
623
624 switch ( strtolower( trim( $type ) ) ) {
625 case 'raw':
626 $value = Message::rawParam( $value );
627 break;
628 case 'list':
629 $value = $this->context->getLanguage()->commaList( $value );
630 break;
631 case 'msg':
632 $value = $this->msg( $value )->text();
633 break;
634 case 'msg-content':
635 $value = $this->msg( $value )->inContentLanguage()->text();
636 break;
637 case 'number':
638 $value = Message::numParam( $value );
639 break;
640 case 'user':
641 $user = User::newFromName( $value );
642 $value = $user->getName();
643 break;
644 case 'user-link':
645 $this->setShowUserToolLinks( false );
646
647 $user = User::newFromName( $value );
648
649 if ( !$user ) {
650 $value = $this->msg( 'empty-username' )->text();
651 } else {
652 $value = Message::rawParam( $this->makeUserLink( $user ) );
653 $this->setShowUserToolLinks( $saveLinkFlood );
654 }
655 break;
656 case 'title':
657 $title = Title::newFromText( $value );
658 $value = $title->getPrefixedText();
659 break;
660 case 'title-link':
661 $title = Title::newFromText( $value );
662 $value = Message::rawParam( $this->makePageLink( $title ) );
663 break;
664 case 'plain':
665 // Plain text, nothing to do
666 default:
667 // Catch other types and use the old behavior (return as-is)
668 }
669
670 return $value;
671 }
672
683 protected function makePageLink( Title $title = null, $parameters = [], $html = null ) {
684 if ( !$title instanceof Title ) {
685 $msg = $this->msg( 'invalidtitle' )->text();
686 if ( $this->plaintext ) {
687 return $msg;
688 } else {
689 return Html::element( 'span', [ 'class' => 'mw-invalidtitle' ], $msg );
690 }
691 }
692
693 if ( $this->plaintext ) {
694 $link = '[[' . $title->getPrefixedText() . ']]';
695 } else {
696 $html = $html !== null ? new HtmlArmor( $html ) : $html;
697 $link = $this->getLinkRenderer()->makeLink( $title, $html, [], $parameters );
698 }
699
700 return $link;
701 }
702
709 public function getPerformerElement() {
710 if ( $this->canView( LogPage::DELETED_USER ) ) {
711 $performerIdentity = $this->entry->getPerformerIdentity();
712 $element = $this->makeUserLink( $performerIdentity );
713 if ( $this->entry->isDeleted( LogPage::DELETED_USER ) ) {
714 $element = $this->styleRestrictedElement( $element );
715 }
716 } else {
717 $element = $this->getRestrictedElement( 'rev-deleted-user' );
718 }
719
720 return $element;
721 }
722
728 public function getComment() {
729 if ( $this->canView( LogPage::DELETED_COMMENT ) ) {
730 $comment = MediaWikiServices::getInstance()->getCommentFormatter()
731 ->formatBlock( $this->entry->getComment() );
732 // No hard coded spaces thanx
733 $element = ltrim( $comment );
734 if ( $this->entry->isDeleted( LogPage::DELETED_COMMENT ) ) {
735 $element = $this->styleRestrictedElement( $element );
736 }
737 } else {
738 $element = $this->getRestrictedElement( 'rev-deleted-comment' );
739 }
740
741 return $element;
742 }
743
750 protected function getRestrictedElement( $message ) {
751 if ( $this->plaintext ) {
752 return $this->msg( $message )->text();
753 }
754
755 return $this->styleRestrictedElement( $this->msg( $message )->escaped() );
756 }
757
763 protected function styleRestrictedElement( $content ) {
764 if ( $this->plaintext ) {
765 return $content;
766 }
767 $attribs = [ 'class' => [ 'history-deleted' ] ];
768 if ( $this->entry->isDeleted( LogPage::DELETED_RESTRICTED ) ) {
769 $attribs['class'][] = 'mw-history-suppressed';
770 }
771
772 return Html::rawElement( 'span', $attribs, $content );
773 }
774
781 protected function msg( $key, ...$params ) {
782 return $this->context->msg( $key, ...$params );
783 }
784
791 protected function makeUserLink( UserIdentity $user, $toolFlags = 0 ) {
792 if ( $this->plaintext ) {
793 $element = $user->getName();
794 } else {
795 $element = Linker::userLink(
796 $user->getId(),
797 $user->getName()
798 );
799 if ( $this->linkFlood ) {
800 $editCount = $user->isRegistered()
801 ? MediaWikiServices::getInstance()->getUserEditTracker()->getUserEditCount( $user )
802 : null;
803
804 $element .= Linker::userToolLinks(
805 $user->getId(),
806 $user->getName(),
807 true, // redContribsWhenNoEdits
808 $toolFlags,
809 $editCount,
810 // do not render parentheses in the HTML markup (CSS will provide)
811 false
812 );
813 }
814 }
815
816 return $element;
817 }
818
823 public function getPreloadTitles() {
824 return [];
825 }
826
831 // This function was added because getMessageParameters() is
832 // protected and a change from protected to public caused
833 // problems with extensions
834 return $this->getMessageParameters();
835 }
836
843 protected function getParametersForApi() {
844 return $this->entry->getParameters();
845 }
846
862 public function formatParametersForApi() {
863 $logParams = [];
864 foreach ( $this->getParametersForApi() as $key => $value ) {
865 $vals = explode( ':', $key, 3 );
866 if ( count( $vals ) !== 3 ) {
867 if ( $value instanceof __PHP_Incomplete_Class ) {
868 wfLogWarning( 'Log entry of type ' . $this->entry->getFullType() .
869 ' contains unrecoverable extra parameters.' );
870 continue;
871 }
872 $logParams[$key] = $value;
873 continue;
874 }
875 $logParams += $this->formatParameterValueForApi( $vals[2], $vals[1], $value );
876 }
877 ApiResult::setIndexedTagName( $logParams, 'param' );
878 ApiResult::setArrayType( $logParams, 'assoc' );
879
880 return $logParams;
881 }
882
892 protected function formatParameterValueForApi( $name, $type, $value ) {
893 $type = strtolower( trim( $type ) );
894 switch ( $type ) {
895 case 'bool':
896 $value = (bool)$value;
897 break;
898
899 case 'number':
900 if ( is_int( $value ) || ctype_digit( (string)$value ) ) {
901 $value = (int)$value;
902 } else {
903 $value = (float)$value;
904 }
905 break;
906
907 case 'array':
908 case 'assoc':
909 case 'kvp':
910 if ( is_array( $value ) ) {
911 ApiResult::setArrayType( $value, $type );
912 }
913 break;
914
915 case 'timestamp':
916 $value = wfTimestamp( TS_ISO_8601, $value );
917 break;
918
919 case 'msg':
920 case 'msg-content':
921 $msg = $this->msg( $value );
922 if ( $type === 'msg-content' ) {
923 $msg->inContentLanguage();
924 }
925 $value = [];
926 $value["{$name}_key"] = $msg->getKey();
927 if ( $msg->getParams() ) {
928 $value["{$name}_params"] = $msg->getParams();
929 }
930 $value["{$name}_text"] = $msg->text();
931 return $value;
932
933 case 'title':
934 case 'title-link':
935 $title = Title::newFromText( $value );
936 if ( !$title ) {
937 $title = SpecialPage::getTitleFor( 'Badtitle', $value );
938 }
939 $value = [];
940 ApiQueryBase::addTitleInfo( $value, $title, "{$name}_" );
941 return $value;
942
943 case 'user':
944 case 'user-link':
945 $user = User::newFromName( $value );
946 if ( $user ) {
947 $value = $user->getName();
948 }
949 break;
950
951 default:
952 // do nothing
953 break;
954 }
955
956 return [ $name => $value ];
957 }
958}
wfLogWarning( $msg, $callerOffset=1, $level=E_USER_WARNING)
Send a warning as a PHP error and the debug log.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
wfMessage( $key,... $params)
This is the function for getting translated interface messages.
Marks HTML that shouldn't be escaped.
Definition HtmlArmor.php:30
This class formats all log entries for log types which have not been converted to the new system.
Extends the LogEntry Interface with some basic functionality.
isLegacy()
Whether the parameters for this log are stored in new or old format.
Implements the default log formatting.
styleRestrictedElement( $content)
Helper method for styling restricted element.
LogEntryBase $entry
static newFromRow( $row)
Handy shortcut for constructing a formatter directly from database row.
canView( $field)
Check if a log item can be displayed.
bool $linkFlood
Whether to output user tool links.
setShowUserToolLinks( $value)
If set to true, will produce user tool links after the user name.
getActionLinks()
Returns extra links that comes after the action text, like "revert", etc.
static newFromEntry(LogEntry $entry)
Constructs a new formatter suitable for given entry.
array $parsedParameters
getMessageParametersForTesting()
__construct(LogEntry $entry)
bool $plaintext
Set to true if we are constructing a message text that is going to be included in page history or sen...
getRestrictedElement( $message)
Helper method for displaying restricted element.
formatParameterValue( $type, $value)
Formats parameters values dependent to their type.
getActionMessage()
Returns a sentence describing the log action.
const FOR_THIS_USER
getActionText()
Gets the log action, including username.
canViewLogType()
Check if a log item type can be displayed.
msg( $key,... $params)
Shortcut for wfMessage which honors local context.
getPerformerElement()
Provides the name of the user who performed the log action.
setLinkRenderer(LinkRenderer $linkRenderer)
formatParameterValueForApi( $name, $type, $value)
Format a single parameter value for API output.
IContextSource $context
Context for logging.
int $audience
Constant for handling log_deleted.
formatParametersForApi()
Format parameters for API output.
getComment()
Gets the user provided comment.
getParametersForApi()
Get the array of parameters, converted from legacy format if necessary.
makePageLink(Title $title=null, $parameters=[], $html=null)
Helper to make a link to the page, taking the plaintext value in consideration.
getMessageKey()
Returns a key to be used for formatting the action sentence.
makeUserLink(UserIdentity $user, $toolFlags=0)
setAudience( $audience)
Set the visibility restrictions for displaying content.
getIRCActionText()
Even uglier hack to maintain backwards compatibility with IRC bots (T36508).
setContext(IContextSource $context)
Replace the default context.
getIRCActionComment()
Even uglier hack to maintain backwards compatibility with IRC bots (T36508).
getPlainActionText()
Ugly hack to produce plaintext version of the message.
extractParameters()
Extracts the optional extra parameters for use in action messages.
getMessageParameters()
Formats parameters intended for action message from array of all parameters.
This class is a collection of static functions that serve two purposes:
Definition Html.php:55
Class that generates HTML for internal links.
Some internal bits split of from Skin.php.
Definition Linker.php:67
A class containing constants representing the names of configuration variables.
Service locator for MediaWiki core services.
Represents a title within MediaWiki.
Definition Title.php:82
The Message class deals with fetching and processing of interface message into a variety of formats.
Definition Message.php:144
static rawParam( $raw)
Definition Message.php:1135
static numParam( $num)
Definition Message.php:1146
static getTitleFor( $name, $subpage=false, $fragment='')
Get a localised Title object for a specified special page name If you don't need a full Title object,...
static newFromName( $name, $validate='valid')
Definition User.php:592
Interface for objects which can provide a MediaWiki context on request.
An individual log entry.
Definition LogEntry.php:35
getPerformerIdentity()
getParameters()
Get the extra parameters stored for this message.
getTimestamp()
Get the timestamp when the action was executed.
getTarget()
Get the target page of this action.
getSubtype()
The log subtype.
getFullType()
The full logtype in format maintype/subtype.
getType()
The main log type.
Interface for objects representing user identity.
getId( $wikiId=self::LOCAL)
$content
Definition router.php:76