X-Git-Url: https://git.heureux-cyclage.org/?p=lhc%2Fweb%2Fwiklou.git;a=blobdiff_plain;f=includes%2Fchangetags%2FChangeTags.php;h=2eb9b225d5d1dc1381e53e085a5fb37108cb534a;hp=ff6a8730c5931e10e238dc5590c968699a837c16;hb=64b83bdb3afd0ee4f8fc1893a865409c198e601e;hpb=3cb14f56bdf3271769a5866f9dcaad56bf873aea diff --git a/includes/changetags/ChangeTags.php b/includes/changetags/ChangeTags.php index ff6a8730c5..2eb9b225d5 100644 --- a/includes/changetags/ChangeTags.php +++ b/includes/changetags/ChangeTags.php @@ -120,6 +120,32 @@ class ChangeTags { 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 * @@ -175,7 +201,6 @@ class ChangeTags { &$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 ); @@ -249,8 +274,8 @@ class ChangeTags { // 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 ]; } @@ -317,8 +342,8 @@ class ChangeTags { * @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( [ @@ -393,9 +418,7 @@ class ChangeTags { * @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' ); @@ -439,7 +462,6 @@ class ChangeTags { 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() ) { @@ -465,8 +487,8 @@ class ChangeTags { * @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' ); @@ -528,8 +550,8 @@ class ChangeTags { * @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 = []; } @@ -621,24 +643,32 @@ class ChangeTags { * Handles selecting tags, and filtering. * Needs $tables to be set up properly, so we can figure out which join conditions to use. * + * 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 array $options Options, see Database::select - * @param bool|string $filter_tag Tag to select on + * @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 ) ) { @@ -661,7 +691,13 @@ class ChangeTags { $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'; + } } } @@ -766,8 +802,8 @@ class ChangeTags { * @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 ); @@ -843,8 +879,8 @@ class ChangeTags { * @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() ) { @@ -906,8 +942,8 @@ class ChangeTags { * @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() ) { @@ -940,7 +976,7 @@ class ChangeTags { // 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 ) { @@ -1008,8 +1044,8 @@ class ChangeTags { * @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() ) { @@ -1139,8 +1175,8 @@ class ChangeTags { * @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() ) {