return $msg->parse();
}
+ /**
+ * Get the message object for the tag's long description.
+ *
+ * Checks if message key "mediawiki:tag-$tag-description" exists. If it does not,
+ * or if message is disabled, returns false. Otherwise, returns the message object
+ * for the long description.
+ *
+ * @param string $tag Tag
+ * @param IContextSource $context
+ * @return Message|bool Message object of the tag long description or false if
+ * there is no description.
+ */
+ public static function tagLongDescriptionMessage( $tag, IContextSource $context ) {
+ $msg = $context->msg( "tag-$tag-description" );
+ if ( !$msg->exists() ) {
+ return false;
+ }
+ if ( $msg->isDisabled() ) {
+ // The message exists but is disabled, hide the description.
+ return false;
+ }
+
+ // Message exists and isn't disabled, use it.
+ return $msg;
+ }
+
/**
* Add tags to a change given its rc_id, rev_id and/or log_id
*
&$rev_id = null, &$log_id = null, $params = null, RecentChange $rc = null,
User $user = null
) {
-
$tagsToAdd = array_filter( (array)$tagsToAdd ); // Make sure we're submitting all tags...
$tagsToRemove = array_filter( (array)$tagsToRemove );
// update the tag_summary row
$prevTags = [];
if ( !self::updateTagSummaryRow( $tagsToAdd, $tagsToRemove, $rc_id, $rev_id,
- $log_id, $prevTags ) ) {
-
+ $log_id, $prevTags )
+ ) {
// nothing to do
return [ [], [], $prevTags ];
}
* @since 1.25
*/
protected static function updateTagSummaryRow( &$tagsToAdd, &$tagsToRemove,
- $rc_id, $rev_id, $log_id, &$prevTags = [] ) {
-
+ $rc_id, $rev_id, $log_id, &$prevTags = []
+ ) {
$dbw = wfGetDB( DB_MASTER );
$tsConds = array_filter( [
* @return Status
* @since 1.25
*/
- public static function canAddTagsAccompanyingChange( array $tags,
- User $user = null ) {
-
+ public static function canAddTagsAccompanyingChange( array $tags, User $user = null ) {
if ( !is_null( $user ) ) {
if ( !$user->isAllowed( 'applychangetags' ) ) {
return Status::newFatal( 'tags-apply-no-permission' );
public static function addTagsAccompanyingChangeWithChecks(
array $tags, $rc_id, $rev_id, $log_id, $params, User $user
) {
-
// are we allowed to do this?
$result = self::canAddTagsAccompanyingChange( $tags, $user );
if ( !$result->isOK() ) {
* @since 1.25
*/
public static function canUpdateTags( array $tagsToAdd, array $tagsToRemove,
- User $user = null ) {
-
+ User $user = null
+ ) {
if ( !is_null( $user ) ) {
if ( !$user->isAllowed( 'changetags' ) ) {
return Status::newFatal( 'tags-update-no-permission' );
* @since 1.25
*/
public static function updateTagsWithChecks( $tagsToAdd, $tagsToRemove,
- $rc_id, $rev_id, $log_id, $params, $reason, User $user ) {
-
+ $rc_id, $rev_id, $log_id, $params, $reason, User $user
+ ) {
if ( is_null( $tagsToAdd ) ) {
$tagsToAdd = [];
}
* Handles selecting tags, and filtering.
* Needs $tables to be set up properly, so we can figure out which join conditions to use.
*
- * @param string|array $tables Table names, see Database::select
- * @param string|array $fields Fields used in query, see Database::select
- * @param string|array $conds Conditions used in query, see Database::select
- * @param array $join_conds Join conditions, see Database::select
- * @param array $options Options, see Database::select
- * @param bool|string $filter_tag Tag to select on
+ * WARNING: If $filter_tag contains more than one tag, this function will add DISTINCT,
+ * which may cause performance problems for your query unless you put the ID field of your
+ * table at the end of the ORDER BY, and set a GROUP BY equal to the ORDER BY. For example,
+ * if you had ORDER BY foo_timestamp DESC, you will now need GROUP BY foo_timestamp, foo_id
+ * ORDER BY foo_timestamp DESC, foo_id DESC.
+ *
+ * @param string|array &$tables Table names, see Database::select
+ * @param string|array &$fields Fields used in query, see Database::select
+ * @param string|array &$conds Conditions used in query, see Database::select
+ * @param array &$join_conds Join conditions, see Database::select
+ * @param string|array &$options Options, see Database::select
+ * @param string|array $filter_tag Tag(s) to select on
*
* @throws MWException When unable to determine appropriate JOIN condition for tagging
*/
public static function modifyDisplayQuery( &$tables, &$fields, &$conds,
- &$join_conds, &$options, $filter_tag = false ) {
- global $wgRequest, $wgUseTagFilter;
+ &$join_conds, &$options, $filter_tag = '' ) {
+ global $wgUseTagFilter;
- if ( $filter_tag === false ) {
- $filter_tag = $wgRequest->getVal( 'tagfilter' );
- }
+ // Normalize to arrays
+ $tables = (array)$tables;
+ $fields = (array)$fields;
+ $conds = (array)$conds;
+ $options = (array)$options;
- // Figure out which conditions can be done.
+ // Figure out which ID field to use
if ( in_array( 'recentchanges', $tables ) ) {
$join_cond = 'ct_rc_id=rc_id';
} elseif ( in_array( 'logging', $tables ) ) {
$tables[] = 'change_tag';
$join_conds['change_tag'] = [ 'INNER JOIN', $join_cond ];
- $conds['ct_tag'] = explode( '|', $filter_tag );
+ $conds['ct_tag'] = $filter_tag;
+ if (
+ is_array( $filter_tag ) && count( $filter_tag ) > 1 &&
+ !in_array( 'DISTINCT', $options )
+ ) {
+ $options[] = 'DISTINCT';
+ }
}
}
* @since 1.25
*/
protected static function logTagManagementAction( $action, $tag, $reason,
- User $user, $tagCount = null, array $logEntryTags = [] ) {
-
+ User $user, $tagCount = null, array $logEntryTags = []
+ ) {
$dbw = wfGetDB( DB_MASTER );
$logEntry = new ManualLogEntry( 'managetags', $action );
* @since 1.25
*/
public static function activateTagWithChecks( $tag, $reason, User $user,
- $ignoreWarnings = false, array $logEntryTags = [] ) {
-
+ $ignoreWarnings = false, array $logEntryTags = []
+ ) {
// are we allowed to do this?
$result = self::canActivateTag( $tag, $user );
if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) {
* @since 1.25
*/
public static function deactivateTagWithChecks( $tag, $reason, User $user,
- $ignoreWarnings = false, array $logEntryTags = [] ) {
-
+ $ignoreWarnings = false, array $logEntryTags = []
+ ) {
// are we allowed to do this?
$result = self::canDeactivateTag( $tag, $user );
if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) {
// tags cannot contain commas (used as a delimiter in tag_summary table),
// pipe (used as a delimiter between multiple tags in
- // modifyDisplayQuery), or slashes (would break tag description messages in
+ // SpecialRecentchanges and friends), or slashes (would break tag description messages in
// MediaWiki namespace)
if ( strpos( $tag, ',' ) !== false || strpos( $tag, '|' ) !== false
|| strpos( $tag, '/' ) !== false ) {
* @since 1.25
*/
public static function createTagWithChecks( $tag, $reason, User $user,
- $ignoreWarnings = false, array $logEntryTags = [] ) {
-
+ $ignoreWarnings = false, array $logEntryTags = []
+ ) {
// are we allowed to do this?
$result = self::canCreateTag( $tag, $user );
if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) {
* @since 1.25
*/
public static function deleteTagWithChecks( $tag, $reason, User $user,
- $ignoreWarnings = false, array $logEntryTags = [] ) {
-
+ $ignoreWarnings = false, array $logEntryTags = []
+ ) {
// are we allowed to do this?
$result = self::canDeleteTag( $tag, $user );
if ( $ignoreWarnings ? !$result->isOK() : !$result->isGood() ) {
*
* @see listSoftwareDefinedTags
* @deprecated since 1.28
+ * @return array
*/
public static function listExtensionDefinedTags() {
wfDeprecated( __METHOD__, '1.28' );