mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/AbuseFilter.git
synced 2024-12-01 00:56:26 +00:00
45d80bc7e5
- Depend on a generic IContextSource rather than SpecialAbuseFilter (lower coupling); - Inject a LinkRenderer (IContextSource doesn't have a ::getLinkRenderer method) - Add a helper method in SpecialAbuseFilter to get the page title, that can also be used elsewhere (and the name constant can be made private now) - Pull down the mFilter property (and rename it to just 'filter') to classes that actually need it. Some classes didn't need this at all and the types were different among subclasses Now the only cause of coupling between the View classes and SpecialAbuseFilter is the static call in getTitle. Change-Id: I3df0c3a7621f0cc9a64a16b0a402a15aae2d5d73
147 lines
3.6 KiB
PHP
147 lines
3.6 KiB
PHP
<?php
|
|
|
|
class SpecialAbuseFilter extends AbuseFilterSpecialPage {
|
|
|
|
private const PAGE_NAME = 'AbuseFilter';
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function __construct() {
|
|
parent::__construct( self::PAGE_NAME, 'abusefilter-view' );
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
public function doesWrites() {
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* @inheritDoc
|
|
*/
|
|
protected function getGroupName() {
|
|
return 'wiki';
|
|
}
|
|
|
|
/**
|
|
* @param string|null $subpage
|
|
*/
|
|
public function execute( $subpage ) {
|
|
$out = $this->getOutput();
|
|
$request = $this->getRequest();
|
|
|
|
$out->addModuleStyles( 'ext.abuseFilter' );
|
|
|
|
$this->setHeaders();
|
|
$this->addHelpLink( 'Extension:AbuseFilter' );
|
|
|
|
$this->checkPermissions();
|
|
|
|
if ( $request->getVal( 'result' ) === 'success' ) {
|
|
$out->setSubtitle( $this->msg( 'abusefilter-edit-done-subtitle' ) );
|
|
$changedFilter = intval( $request->getVal( 'changedfilter' ) );
|
|
$changeId = intval( $request->getVal( 'changeid' ) );
|
|
$out->wrapWikiMsg( '<p class="success">$1</p>',
|
|
[
|
|
'abusefilter-edit-done',
|
|
$changedFilter,
|
|
$changeId,
|
|
$this->getLanguage()->formatNum( $changedFilter )
|
|
]
|
|
);
|
|
}
|
|
|
|
[ $view, $pageType, $params ] = $this->getViewClassAndPageType( $subpage );
|
|
|
|
// Links at the top
|
|
$this->addNavigationLinks( $pageType );
|
|
|
|
/** @var AbuseFilterView $v */
|
|
$v = new $view( $this->getContext(), $this->getLinkRenderer(), $params );
|
|
$v->show();
|
|
}
|
|
|
|
/**
|
|
* Determine the view class to instantiate
|
|
*
|
|
* @param string|null $subpage
|
|
* @return array A tuple of three elements:
|
|
* - a subclass of AbuseFilterView
|
|
* - type of page for addNavigationLinks
|
|
* - array of parameters for the class
|
|
* @phan-return array{0:class-string,1:string,2:array}
|
|
*/
|
|
public function getViewClassAndPageType( $subpage ) : array {
|
|
// Filter by removing blanks.
|
|
$params = array_values( array_filter(
|
|
explode( '/', $subpage ?: '' ),
|
|
function ( $value ) {
|
|
return $value !== '';
|
|
}
|
|
) );
|
|
|
|
if ( $subpage === 'tools' ) {
|
|
return [ AbuseFilterViewTools::class, 'tools', [] ];
|
|
}
|
|
|
|
if ( $subpage === 'import' ) {
|
|
return [ AbuseFilterViewImport::class, 'import', [] ];
|
|
}
|
|
|
|
if ( is_numeric( $subpage ) || $subpage === 'new' ) {
|
|
return [
|
|
AbuseFilterViewEdit::class,
|
|
'edit',
|
|
[ 'filter' => is_numeric( $subpage ) ? (int)$subpage : null ]
|
|
];
|
|
}
|
|
|
|
if ( $params ) {
|
|
if ( count( $params ) === 2 && $params[0] === 'revert' && is_numeric( $params[1] ) ) {
|
|
$params[1] = (int)$params[1];
|
|
return [ AbuseFilterViewRevert::class, 'revert', $params ];
|
|
}
|
|
|
|
if ( $params[0] === 'test' ) {
|
|
return [ AbuseFilterViewTestBatch::class, 'test', $params ];
|
|
}
|
|
|
|
if ( $params[0] === 'examine' ) {
|
|
return [ AbuseFilterViewExamine::class, 'examine', $params ];
|
|
}
|
|
|
|
if ( $params[0] === 'history' || $params[0] === 'log' ) {
|
|
if ( count( $params ) <= 2 ) {
|
|
$params = isset( $params[1] ) ? [ 'filter' => (int)$params[1] ] : [];
|
|
return [ AbuseFilterViewHistory::class, 'recentchanges', $params ];
|
|
}
|
|
if ( count( $params ) === 4 && $params[2] === 'item' ) {
|
|
return [
|
|
AbuseFilterViewEdit::class,
|
|
'',
|
|
[ 'filter' => (int)$params[1], 'history' => (int)$params[3] ]
|
|
];
|
|
}
|
|
if ( count( $params ) === 5 && $params[2] === 'diff' ) {
|
|
// Special:AbuseFilter/history/<filter>/diff/<oldid>/<newid>
|
|
return [ AbuseFilterViewDiff::class, '', $params ];
|
|
}
|
|
}
|
|
}
|
|
|
|
return [ AbuseFilterViewList::class, 'home', [] ];
|
|
}
|
|
|
|
/**
|
|
* Static variant to get the associated Title.
|
|
*
|
|
* @param string|int $subpage
|
|
* @return Title
|
|
*/
|
|
public static function getTitleForSubpage( $subpage ) : Title {
|
|
return self::getTitleFor( self::PAGE_NAME, $subpage );
|
|
}
|
|
}
|