MediaWiki REL1_31
RightsLogFormatter.php
Go to the documentation of this file.
1<?php
32 protected function makePageLink( Title $title = null, $parameters = [], $html = null ) {
34
35 if ( !$this->plaintext ) {
36 $text = $wgContLang->ucfirst( $title->getDBkey() );
37 $parts = explode( $wgUserrightsInterwikiDelimiter, $text, 2 );
38
39 if ( count( $parts ) === 2 ) {
40 $titleLink = WikiMap::foreignUserLink(
41 $parts[1],
42 $parts[0],
43 htmlspecialchars(
44 strtr( $parts[0], '_', ' ' ) .
46 $parts[1]
47 )
48 );
49
50 if ( $titleLink !== false ) {
51 return $titleLink;
52 }
53 }
54 }
55
56 return parent::makePageLink( $title, $parameters, $title ? $title->getText() : null );
57 }
58
59 protected function getMessageKey() {
60 $key = parent::getMessageKey();
62 if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
63 // Messages: logentry-rights-rights-legacy
64 $key .= '-legacy';
65 }
66
67 return $key;
68 }
69
70 protected function getMessageParameters() {
71 $params = parent::getMessageParameters();
72
73 // Really old entries that lack old/new groups
74 if ( !isset( $params[3] ) && !isset( $params[4] ) ) {
75 return $params;
76 }
77
78 $oldGroups = $this->makeGroupArray( $params[3] );
79 $newGroups = $this->makeGroupArray( $params[4] );
80
81 $userName = $this->entry->getTarget()->getText();
82 if ( !$this->plaintext && count( $oldGroups ) ) {
83 foreach ( $oldGroups as &$group ) {
84 $group = UserGroupMembership::getGroupMemberName( $group, $userName );
85 }
86 }
87 if ( !$this->plaintext && count( $newGroups ) ) {
88 foreach ( $newGroups as &$group ) {
89 $group = UserGroupMembership::getGroupMemberName( $group, $userName );
90 }
91 }
92
93 // fetch the metadata about each group membership
94 $allParams = $this->entry->getParameters();
95
96 if ( count( $oldGroups ) ) {
97 $params[3] = [ 'raw' => $this->formatRightsList( $oldGroups,
98 isset( $allParams['oldmetadata'] ) ? $allParams['oldmetadata'] : [] ) ];
99 } else {
100 $params[3] = $this->msg( 'rightsnone' )->text();
101 }
102 if ( count( $newGroups ) ) {
103 // Array_values is used here because of T44211
104 // see use of array_unique in UserrightsPage::doSaveUserGroups on $newGroups.
105 $params[4] = [ 'raw' => $this->formatRightsList( array_values( $newGroups ),
106 isset( $allParams['newmetadata'] ) ? $allParams['newmetadata'] : [] ) ];
107 } else {
108 $params[4] = $this->msg( 'rightsnone' )->text();
109 }
110
111 $params[5] = $userName;
112
113 return $params;
114 }
115
116 protected function formatRightsList( $groups, $serializedUGMs = [] ) {
117 $uiLanguage = $this->context->getLanguage();
118 $uiUser = $this->context->getUser();
119 // separate arrays of temporary and permanent memberships
120 $tempList = $permList = [];
121
122 reset( $groups );
123 reset( $serializedUGMs );
124 while ( current( $groups ) ) {
125 $group = current( $groups );
126
127 if ( current( $serializedUGMs ) &&
128 isset( current( $serializedUGMs )['expiry'] ) &&
129 current( $serializedUGMs )['expiry']
130 ) {
131 // there is an expiry date; format the group and expiry into a friendly string
132 $expiry = current( $serializedUGMs )['expiry'];
133 $expiryFormatted = $uiLanguage->userTimeAndDate( $expiry, $uiUser );
134 $expiryFormattedD = $uiLanguage->userDate( $expiry, $uiUser );
135 $expiryFormattedT = $uiLanguage->userTime( $expiry, $uiUser );
136 $tempList[] = $this->msg( 'rightslogentry-temporary-group' )->params( $group,
137 $expiryFormatted, $expiryFormattedD, $expiryFormattedT )->parse();
138 } else {
139 // the right does not expire; just insert the group name
140 $permList[] = $group;
141 }
142
143 next( $groups );
144 next( $serializedUGMs );
145 }
146
147 // place all temporary memberships first, to avoid the ambiguity of
148 // "adinistrator, bureaucrat and importer (temporary, until X time)"
149 return $uiLanguage->listToText( array_merge( $tempList, $permList ) );
150 }
151
152 protected function getParametersForApi() {
155
156 static $map = [
157 '4:array:oldgroups',
158 '5:array:newgroups',
159 '4::oldgroups' => '4:array:oldgroups',
160 '5::newgroups' => '5:array:newgroups',
161 ];
162 foreach ( $map as $index => $key ) {
163 if ( isset( $params[$index] ) ) {
164 $params[$key] = $params[$index];
165 unset( $params[$index] );
166 }
167 }
168
169 // Really old entries do not have log params, so form them from whatever info
170 // we have.
171 // Also walk through the parallel arrays of groups and metadata, combining each
172 // metadata array with the name of the group it pertains to
173 if ( isset( $params['4:array:oldgroups'] ) ) {
174 $params['4:array:oldgroups'] = $this->makeGroupArray( $params['4:array:oldgroups'] );
175
176 $oldmetadata =& $params['oldmetadata'];
177 // unset old metadata entry to ensure metadata goes at the end of the params array
178 unset( $params['oldmetadata'] );
179 $params['oldmetadata'] = array_map( function ( $index ) use ( $params, $oldmetadata ) {
180 $result = [ 'group' => $params['4:array:oldgroups'][$index] ];
181 if ( isset( $oldmetadata[$index] ) ) {
182 $result += $oldmetadata[$index];
183 }
184 $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
185 $result['expiry'] : null );
186
187 return $result;
188 }, array_keys( $params['4:array:oldgroups'] ) );
189 }
190
191 if ( isset( $params['5:array:newgroups'] ) ) {
192 $params['5:array:newgroups'] = $this->makeGroupArray( $params['5:array:newgroups'] );
193
194 $newmetadata =& $params['newmetadata'];
195 // unset old metadata entry to ensure metadata goes at the end of the params array
196 unset( $params['newmetadata'] );
197 $params['newmetadata'] = array_map( function ( $index ) use ( $params, $newmetadata ) {
198 $result = [ 'group' => $params['5:array:newgroups'][$index] ];
199 if ( isset( $newmetadata[$index] ) ) {
200 $result += $newmetadata[$index];
201 }
202 $result['expiry'] = ApiResult::formatExpiry( isset( $result['expiry'] ) ?
203 $result['expiry'] : null );
204
205 return $result;
206 }, array_keys( $params['5:array:newgroups'] ) );
207 }
208
209 return $params;
210 }
211
212 public function formatParametersForApi() {
213 $ret = parent::formatParametersForApi();
214 if ( isset( $ret['oldgroups'] ) ) {
215 ApiResult::setIndexedTagName( $ret['oldgroups'], 'g' );
216 }
217 if ( isset( $ret['newgroups'] ) ) {
218 ApiResult::setIndexedTagName( $ret['newgroups'], 'g' );
219 }
220 if ( isset( $ret['oldmetadata'] ) ) {
221 ApiResult::setArrayType( $ret['oldmetadata'], 'array' );
222 ApiResult::setIndexedTagName( $ret['oldmetadata'], 'g' );
223 }
224 if ( isset( $ret['newmetadata'] ) ) {
225 ApiResult::setArrayType( $ret['newmetadata'], 'array' );
226 ApiResult::setIndexedTagName( $ret['newmetadata'], 'g' );
227 }
228 return $ret;
229 }
230
231 private function makeGroupArray( $group ) {
232 // Migrate old group params from string to array
233 if ( $group === '' ) {
234 $group = [];
235 } elseif ( is_string( $group ) ) {
236 $group = array_map( 'trim', explode( ',', $group ) );
237 }
238 return $group;
239 }
240}
$wgUserrightsInterwikiDelimiter
Character used as a delimiter when testing for interwiki userrights (In Special:UserRights,...
static setArrayType(array &$arr, $type, $kvpKeyName=null)
Set the array data type.
static setIndexedTagName(array &$arr, $tag)
Set the tag name for numeric-keyed values in XML format.
static formatExpiry( $expiry, $infinity='infinity')
Format an expiry timestamp for API output.
Implements the default log formatting.
LogEntryBase $entry
msg( $key)
Shortcut for wfMessage which honors local context.
This class formats rights log entries.
getMessageKey()
Returns a key to be used for formatting the action sentence.
formatRightsList( $groups, $serializedUGMs=[])
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.
formatParametersForApi()
Format parameters for API output.
getMessageParameters()
Formats parameters intented for action message from array of all parameters.
Represents a title within MediaWiki.
Definition Title.php:39
static foreignUserLink( $wikiID, $user, $text=null)
Convenience to get a link to a user page on a foreign wiki.
Definition WikiMap.php:137
this class mediates it Skin Encapsulates a look and feel for the wiki All of the functions that render HTML and make choices about how to render it are here and are called from various other places when and is meant to be subclassed with other skins that may override some of its functions The User object contains a reference to a and so rather than having a global skin object we just rely on the global User and get the skin with $wgUser and also has some character encoding functions and other locale stuff The current user interface language is instantiated as and the local content language as $wgContLang
Definition design.txt:57
namespace being checked & $result
Definition hooks.txt:2323
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses & $ret
Definition hooks.txt:2005
null means default in associative array with keys and values unescaped Should be merged with default with a value of false meaning to suppress the attribute in associative array with keys and values unescaped noclasses just before the function returns a value If you return an< a > element with HTML attributes $attribs and contents $html will be returned If you return $ret will be returned and may include noclasses & $html
Definition hooks.txt:2013
getParameters()
Get the extra parameters stored for this message.
$params