use MediaWiki\Linker\LinkRenderer;
use MediaWiki\Linker\LinkTarget;
use MediaWiki\MediaWikiServices;
-use Wikimedia\Rdbms\DBReadOnlyError;
/**
* Provides the UI through which users can perform editing
$this->showTitles( $toUnwatch, $this->successMessage );
}
} else {
- $this->clearWatchlist();
- $this->getUser()->invalidateCache();
- if ( count( $current ) > 0 ) {
- $this->successMessage = $this->msg( 'watchlistedit-raw-done' )->parse();
- } else {
+ if ( count( $current ) === 0 ) {
return false;
}
- $this->successMessage .= ' ' . $this->msg( 'watchlistedit-raw-removed' )
- ->numParams( count( $current ) )->parse();
+ $this->clearUserWatchedItems( $current, 'raw' );
$this->showTitles( $current, $this->successMessage );
}
public function submitClear( $data ) {
$current = $this->getWatchlist();
- $this->clearWatchlist();
- $this->getUser()->invalidateCache();
- $this->successMessage = $this->msg( 'watchlistedit-clear-done' )->parse();
- $this->successMessage .= ' ' . $this->msg( 'watchlistedit-clear-removed' )
- ->numParams( count( $current ) )->parse();
+ $this->clearUserWatchedItems( $current, 'clear' );
$this->showTitles( $current, $this->successMessage );
-
return true;
}
+ /**
+ * @param array $current
+ * @param string $messageFor 'raw' or 'clear'
+ */
+ private function clearUserWatchedItems( $current, $messageFor ) {
+ $watchedItemStore = MediaWikiServices::getInstance()->getWatchedItemStore();
+ if ( $watchedItemStore->clearUserWatchedItems( $this->getUser() ) ) {
+ $this->successMessage = $this->msg( 'watchlistedit-' . $messageFor . '-done' )->parse();
+ $this->successMessage .= ' ' . $this->msg( 'watchlistedit-' . $messageFor . '-removed' )
+ ->numParams( count( $current ) )->parse();
+ $this->getUser()->invalidateCache();
+ } else {
+ $watchedItemStore->clearUserWatchedItemsUsingJobQueue( $this->getUser() );
+ $this->successMessage = $this->msg( 'watchlistedit-clear-jobqueue' )->parse();
+ }
+ }
+
/**
* Print out a list of linked titles
*
} );
}
- /**
- * Remove all titles from a user's watchlist
- */
- private function clearWatchlist() {
- if ( $this->getConfig()->get( 'ReadOnlyWatchedItemStore' ) ) {
- throw new DBReadOnlyError( null, 'The watchlist is currently readonly.' );
- }
-
- $dbw = wfGetDB( DB_MASTER );
- $dbw->delete(
- 'watchlist',
- [ 'wl_user' => $this->getUser()->getId() ],
- __METHOD__
- );
- }
-
/**
* Add a list of targets to a user's watchlist
*
"watchlistedit-clear-titles": "Titles:",
"watchlistedit-clear-submit": "Clear the watchlist (This is permanent!)",
"watchlistedit-clear-done": "Your watchlist has been cleared.",
+ "watchlistedit-clear-jobqueue": "Your watchlist is being cleared. This may take some time!",
"watchlistedit-clear-removed": "{{PLURAL:$1|1 title was|$1 titles were}} removed:",
"watchlistedit-too-many": "There are too many pages to display here.",
"watchlisttools-clear": "Clear the watchlist",
"watchlistedit-clear-titles": "Text above edit box containing items being watched on [[Special:Watchlist/clear]].\n{{Identical|Title}}",
"watchlistedit-clear-submit": "Text of submit button on [[Special:Watchlist/clear]].\n{{Identical|Clear watchlist}}",
"watchlistedit-clear-done": "A message which appears after the watchlist has been cleared using [[Special:Watchlist/clear]].",
+ "watchlistedit-clear-jobqueue": "A message which appears after the watchlist has been scheduled to be cleared using [[Special:Watchlist/clear]] and the Job Queue.",
"watchlistedit-clear-removed": "Message on [[Special:EditWatchlist/clear]].\n\nThe message appears once the watchlist has been cleared.",
"watchlistedit-too-many": "Message on [[Special:EditWatchlist]] that is used when there are too many titles to display.\n\nShown instead of list of the pages.",
"watchlisttools-clear": "[[Special:Watchlist]]: Navigation link under the title.\n{{Identical|Clear watchlist}}",