44 $msgs = [
'deletionlog',
'undeleteviewlink',
'diff' ];
45 foreach ( $msgs as $msg ) {
46 $this->messages[$msg] = $this->
msg( $msg )->text();
54 $query = parent::getDefaultQuery();
63 ActorMigration::newMigration()->getWhere(
70 if ( !$user->isAllowed(
'deletedhistory' ) ) {
71 $conds[] = $this->mDb->bitAnd(
'ar_deleted', Revision::DELETED_USER ) .
' = 0';
72 } elseif ( !$user->isAllowedAny(
'suppressrevision',
'viewsuppressed' ) ) {
73 $conds[] = $this->mDb->bitAnd(
'ar_deleted', Revision::SUPPRESSED_USER ) .
74 ' != ' . Revision::SUPPRESSED_USER;
77 $commentQuery = CommentStore::getStore()->getJoin(
'ar_comment' );
78 $actorQuery = ActorMigration::newMigration()->getJoin(
'ar_user' );
81 'tables' => [
'archive' ] + $commentQuery[
'tables'] + $actorQuery[
'tables'],
83 'ar_rev_id',
'ar_namespace',
'ar_title',
'ar_timestamp',
84 'ar_minor_edit',
'ar_deleted'
85 ] + $commentQuery[
'fields'] + $actorQuery[
'fields'],
88 'join_conds' => $commentQuery[
'joins'] + $actorQuery[
'joins'],
102 $data = [ parent::reallyDoQuery( $offset, $limit, $descending ) ];
107 'DeletedContribsPager::reallyDoQuery',
108 [ &$data, $this, $offset, $limit, $descending ]
114 foreach ( $data as
$query ) {
115 foreach (
$query as $i => $row ) {
129 $result = array_slice( $result, 0, $limit );
132 $result = array_values( $result );
138 return 'ar_timestamp';
150 if ( isset( $this->mNavigationBar ) ) {
151 return $this->mNavigationBar;
155 'prev' => $this->msg(
'pager-newer-n' )->numParams( $this->mLimit )->escaped(),
156 'next' => $this->msg(
'pager-older-n' )->numParams( $this->mLimit )->escaped(),
157 'first' => $this->msg(
'histlast' )->escaped(),
158 'last' => $this->msg(
'histfirst' )->escaped()
161 $pagingLinks = $this->getPagingLinks( $linkTexts );
162 $limitLinks = $this->getLimitLinks();
163 $lang = $this->getLanguage();
164 $limits =
$lang->pipeList( $limitLinks );
166 $firstLast =
$lang->pipeList( [ $pagingLinks[
'first'], $pagingLinks[
'last'] ] );
167 $firstLast = $this->msg(
'parentheses' )->rawParams( $firstLast )->escaped();
168 $prevNext = $this->msg(
'viewprevnext' )
170 $pagingLinks[
'prev'],
171 $pagingLinks[
'next'],
174 $separator = $this->msg(
'word-separator' )->escaped();
175 $this->mNavigationBar = $firstLast . $separator . $prevNext;
177 return $this->mNavigationBar;
181 if ( $this->
namespace !==
'' ) {
182 return [
'ar_namespace' => (int)$this->
namespace ];
207 Wikimedia\suppressWarnings();
209 $rev = Revision::newFromArchiveRow( $row );
210 $validRevision = (bool)
$rev->getId();
211 }
catch ( Exception
$e ) {
212 $validRevision =
false;
214 Wikimedia\restoreWarnings();
216 if ( $validRevision ) {
218 $ret = $this->formatRevisionRow( $row );
222 Hooks::run(
'DeletedContributionsLineEnding', [ $this, &
$ret, $row, &$classes, &
$attribs ] );
225 if ( $classes === [] &&
$attribs === [] &&
$ret ===
'' ) {
226 wfDebug(
"Dropping Special:DeletedContribution row that could not be formatted\n" );
227 $ret =
"<!-- Could not format Special:DeletedContribution row. -->\n";
249 $page = Title::makeTitle( $row->ar_namespace, $row->ar_title );
251 $linkRenderer = MediaWikiServices::getInstance()->getLinkRenderer();
255 'id' => $row->ar_rev_id,
256 'comment' => CommentStore::getStore()->getComment(
'ar_comment', $row )->text,
257 'user' => $row->ar_user,
258 'user_text' => $row->ar_user_text,
259 'actor' => isset( $row->ar_actor ) ? $row->ar_actor :
null,
260 'timestamp' => $row->ar_timestamp,
261 'minor_edit' => $row->ar_minor_edit,
262 'deleted' => $row->ar_deleted,
265 $undelete = SpecialPage::getTitleFor(
'Undelete' );
267 $logs = SpecialPage::getTitleFor(
'Log' );
270 $this->messages[
'deletionlog'],
274 'page' => $page->getPrefixedText()
279 SpecialPage::getTitleFor(
'Undelete', $page->getPrefixedDBkey() ),
280 $this->messages[
'undeleteviewlink']
283 $user = $this->getUser();
285 if ( $user->isAllowed(
'deletedtext' ) ) {
288 $this->messages[
'diff'],
291 'target' => $page->getPrefixedText(),
292 'timestamp' =>
$rev->getTimestamp(),
297 $last = htmlspecialchars( $this->messages[
'diff'] );
301 $date = $this->getLanguage()->userTimeAndDate(
$rev->getTimestamp(), $user );
303 if ( !$user->isAllowed(
'undelete' ) || !
$rev->userCan( Revision::DELETED_TEXT, $user ) ) {
304 $link = htmlspecialchars( $date );
309 [
'class' =>
'mw-changeslist-date' ],
311 'target' => $page->getPrefixedText(),
312 'timestamp' =>
$rev->getTimestamp()
317 if (
$rev->isDeleted( Revision::DELETED_TEXT ) ) {
318 $link =
'<span class="history-deleted">' .
$link .
'</span>';
324 [
'class' =>
'mw-changeslist-title' ]
327 if (
$rev->isMinor() ) {
339 $tools = Html::rawElement(
341 [
'class' =>
'mw-deletedcontribs-tools' ],
342 $this->msg(
'parentheses' )->rawParams( $this->getLanguage()->pipeList(
343 [
$last, $dellog, $reviewlink ] ) )->escaped()
346 $separator =
'<span class="mw-changeslist-separator">. .</span>';
347 $ret =
"{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
349 # Denote if username is redacted for this edit
350 if (
$rev->isDeleted( Revision::DELETED_USER ) ) {
351 $ret .=
" <strong>" . $this->msg(
'rev-deleted-user-contribs' )->escaped() .
"</strong>";
wfDebug( $text, $dest='all', array $context=[])
Sends a line to the debug log if enabled or, optionally, to a comment in output.
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
wfArrayFilterByKey(array $arr, callable $callback)
Like array_filter with ARRAY_FILTER_USE_KEY, but works pre-5.6.
static flag( $flag, IContextSource $context=null)
Make an "<abbr>" element for a given change flag.
msg( $key)
Get a Message object with context set Parameters are the same as wfMessage()
static revComment(Revision $rev, $local=false, $isPublic=false)
Wrap and format the given revision's comment block, if the current user is allowed to view it.
static getRevDeleteLink(User $user, Revision $rev, Title $title)
Get a revision-deletion link, or disabled link, or nothing, depending on user permissions & the setti...
static newFromName( $name, $validate='valid')
Static factory method for creation from username.
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
usually copyright or history_copyright This message must be in HTML not wikitext & $link
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 after processing & $attribs
null for the local wiki Added should default to null in handler for backwards compatibility add a value to it if you want to add a cookie that have to vary cache options can modify $query
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 after processing after in associative array form before processing starts Return false to skip default processing and return $ret $linkRenderer
presenting them properly to the user as errors is done by the caller return true use this to change the list i e etc $rev
returning false will NOT prevent logging $e
Interface for objects which can provide a MediaWiki context on request.
if(!isset( $args[0])) $lang