From 3e0f3cfd43df86d0b0ba1f99e3636a902a7327bb Mon Sep 17 00:00:00 2001 From: umherirrender Date: Thu, 3 Dec 2015 21:08:31 +0100 Subject: [PATCH] Show user names as subpages of special pages in autocomplete search The autocomplete search allows special pages to define the list of subpages to be excepted. Use user names on the following special pages, because these special pages can be called with a user name as subpage. Special:Block Special:Contributions Special:DeletedContributions Special:Emailuser Special:Listfiles Special:Unblock Special:Userrights This makes it easier to navigate to this special pages with a prefilled user name field. Hidden user names are always not shown, because the suggestion is cached between priviliged user and non-priviliged user. Change-Id: I7db575bf66caaa5136489ed99f1655673b55adaf --- autoload.php | 1 + includes/db/Database.php | 5 +- includes/specials/SpecialBlock.php | 18 +++++ includes/specials/SpecialContributions.php | 18 +++++ .../specials/SpecialDeletedContributions.php | 18 +++++ includes/specials/SpecialEmailuser.php | 18 +++++ includes/specials/SpecialListfiles.php | 18 +++++ includes/specials/SpecialUnblock.php | 18 +++++ includes/specials/SpecialUserrights.php | 18 +++++ includes/user/UserNamePrefixSearch.php | 70 +++++++++++++++++++ 10 files changed, 200 insertions(+), 2 deletions(-) create mode 100644 includes/user/UserNamePrefixSearch.php diff --git a/autoload.php b/autoload.php index 8c5ec81731..0457189ff2 100644 --- a/autoload.php +++ b/autoload.php @@ -1336,6 +1336,7 @@ $wgAutoloadLocalClasses = array( 'UserCache' => __DIR__ . '/includes/cache/UserCache.php', 'UserDupes' => __DIR__ . '/maintenance/userDupes.inc', 'UserMailer' => __DIR__ . '/includes/mail/UserMailer.php', + 'UserNamePrefixSearch' => __DIR__ . '/includes/user/UserNamePrefixSearch.php', 'UserNotLoggedIn' => __DIR__ . '/includes/exception/UserNotLoggedIn.php', 'UserOptions' => __DIR__ . '/maintenance/userOptions.inc', 'UserPasswordPolicy' => __DIR__ . '/includes/password/UserPasswordPolicy.php', diff --git a/includes/db/Database.php b/includes/db/Database.php index 31e26531d8..6d9f185a15 100644 --- a/includes/db/Database.php +++ b/includes/db/Database.php @@ -1286,13 +1286,14 @@ abstract class DatabaseBase implements IDatabase { * @param string|array $cond The condition array. See DatabaseBase::select() for details. * @param string $fname The function name of the caller. * @param string|array $options The query options. See DatabaseBase::select() for details. + * @param string|array $join_conds The join conditions. See DatabaseBase::select() for details. * * @return bool|array The values from the field, or false on failure * @throws DBUnexpectedError * @since 1.25 */ public function selectFieldValues( - $table, $var, $cond = '', $fname = __METHOD__, $options = array() + $table, $var, $cond = '', $fname = __METHOD__, $options = array(), $join_conds = array() ) { if ( $var === '*' ) { // sanity throw new DBUnexpectedError( $this, "Cannot use a * field: got '$var'" ); @@ -1302,7 +1303,7 @@ abstract class DatabaseBase implements IDatabase { $options = array( $options ); } - $res = $this->select( $table, $var, $cond, $fname, $options ); + $res = $this->select( $table, $var, $cond, $fname, $options, $join_conds ); if ( $res === false ) { return false; } diff --git a/includes/specials/SpecialBlock.php b/includes/specials/SpecialBlock.php index e125d9441d..db50bd890e 100644 --- a/includes/specials/SpecialBlock.php +++ b/includes/specials/SpecialBlock.php @@ -971,6 +971,24 @@ class SpecialBlock extends FormSpecialPage { $out->addWikiMsg( 'blockipsuccesstext', wfEscapeWikiText( $this->target ) ); } + /** + * Return an array of subpages beginning with $search that this special page will accept. + * + * @param string $search Prefix to search for + * @param int $limit Maximum number of results to return (usually 10) + * @param int $offset Number of results to skip (usually 0) + * @return string[] Matching subpages + */ + public function prefixSearchSubpages( $search, $limit, $offset ) { + $user = User::newFromName( $search ); + if ( !$user ) { + // No prefix suggestion for invalid user + return array(); + } + // Autocomplete subpage as user list - public to allow caching + return UserNamePrefixSearch::search( 'public', $search, $limit, $offset ); + } + protected function getGroupName() { return 'users'; } diff --git a/includes/specials/SpecialContributions.php b/includes/specials/SpecialContributions.php index bf3ab907f7..ab6614bc12 100644 --- a/includes/specials/SpecialContributions.php +++ b/includes/specials/SpecialContributions.php @@ -645,6 +645,24 @@ class SpecialContributions extends IncludableSpecialPage { return $form; } + /** + * Return an array of subpages beginning with $search that this special page will accept. + * + * @param string $search Prefix to search for + * @param int $limit Maximum number of results to return (usually 10) + * @param int $offset Number of results to skip (usually 0) + * @return string[] Matching subpages + */ + public function prefixSearchSubpages( $search, $limit, $offset ) { + $user = User::newFromName( $search ); + if ( !$user ) { + // No prefix suggestion for invalid user + return array(); + } + // Autocomplete subpage as user list - public to allow caching + return UserNamePrefixSearch::search( 'public', $search, $limit, $offset ); + } + protected function getGroupName() { return 'users'; } diff --git a/includes/specials/SpecialDeletedContributions.php b/includes/specials/SpecialDeletedContributions.php index 6f8e786e5f..f6d560f4e0 100644 --- a/includes/specials/SpecialDeletedContributions.php +++ b/includes/specials/SpecialDeletedContributions.php @@ -658,6 +658,24 @@ class DeletedContributionsPage extends SpecialPage { return $f; } + /** + * Return an array of subpages beginning with $search that this special page will accept. + * + * @param string $search Prefix to search for + * @param int $limit Maximum number of results to return (usually 10) + * @param int $offset Number of results to skip (usually 0) + * @return string[] Matching subpages + */ + public function prefixSearchSubpages( $search, $limit, $offset ) { + $user = User::newFromName( $search ); + if ( !$user ) { + // No prefix suggestion for invalid user + return array(); + } + // Autocomplete subpage as user list - public to allow caching + return UserNamePrefixSearch::search( 'public', $search, $limit, $offset ); + } + protected function getGroupName() { return 'users'; } diff --git a/includes/specials/SpecialEmailuser.php b/includes/specials/SpecialEmailuser.php index 3b31530698..618e7007c9 100644 --- a/includes/specials/SpecialEmailuser.php +++ b/includes/specials/SpecialEmailuser.php @@ -392,6 +392,24 @@ class SpecialEmailUser extends UnlistedSpecialPage { } } + /** + * Return an array of subpages beginning with $search that this special page will accept. + * + * @param string $search Prefix to search for + * @param int $limit Maximum number of results to return (usually 10) + * @param int $offset Number of results to skip (usually 0) + * @return string[] Matching subpages + */ + public function prefixSearchSubpages( $search, $limit, $offset ) { + $user = User::newFromName( $search ); + if ( !$user ) { + // No prefix suggestion for invalid user + return array(); + } + // Autocomplete subpage as user list - public to allow caching + return UserNamePrefixSearch::search( 'public', $search, $limit, $offset ); + } + protected function getGroupName() { return 'users'; } diff --git a/includes/specials/SpecialListfiles.php b/includes/specials/SpecialListfiles.php index 8de4e2f5e0..9a73a255fd 100644 --- a/includes/specials/SpecialListfiles.php +++ b/includes/specials/SpecialListfiles.php @@ -57,6 +57,24 @@ class SpecialListFiles extends IncludableSpecialPage { } } + /** + * Return an array of subpages beginning with $search that this special page will accept. + * + * @param string $search Prefix to search for + * @param int $limit Maximum number of results to return (usually 10) + * @param int $offset Number of results to skip (usually 0) + * @return string[] Matching subpages + */ + public function prefixSearchSubpages( $search, $limit, $offset ) { + $user = User::newFromName( $search ); + if ( !$user ) { + // No prefix suggestion for invalid user + return array(); + } + // Autocomplete subpage as user list - public to allow caching + return UserNamePrefixSearch::search( 'public', $search, $limit, $offset ); + } + protected function getGroupName() { return 'media'; } diff --git a/includes/specials/SpecialUnblock.php b/includes/specials/SpecialUnblock.php index f81f1c301b..f776832ce0 100644 --- a/includes/specials/SpecialUnblock.php +++ b/includes/specials/SpecialUnblock.php @@ -237,6 +237,24 @@ class SpecialUnblock extends SpecialPage { return true; } + /** + * Return an array of subpages beginning with $search that this special page will accept. + * + * @param string $search Prefix to search for + * @param int $limit Maximum number of results to return (usually 10) + * @param int $offset Number of results to skip (usually 0) + * @return string[] Matching subpages + */ + public function prefixSearchSubpages( $search, $limit, $offset ) { + $user = User::newFromName( $search ); + if ( !$user ) { + // No prefix suggestion for invalid user + return array(); + } + // Autocomplete subpage as user list - public to allow caching + return UserNamePrefixSearch::search( 'public', $search, $limit, $offset ); + } + protected function getGroupName() { return 'users'; } diff --git a/includes/specials/SpecialUserrights.php b/includes/specials/SpecialUserrights.php index ea22274d8b..cf94e50581 100644 --- a/includes/specials/SpecialUserrights.php +++ b/includes/specials/SpecialUserrights.php @@ -776,6 +776,24 @@ class UserrightsPage extends SpecialPage { LogEventsList::showLogExtract( $output, 'rights', $user->getUserPage() ); } + /** + * Return an array of subpages beginning with $search that this special page will accept. + * + * @param string $search Prefix to search for + * @param int $limit Maximum number of results to return (usually 10) + * @param int $offset Number of results to skip (usually 0) + * @return string[] Matching subpages + */ + public function prefixSearchSubpages( $search, $limit, $offset ) { + $user = User::newFromName( $search ); + if ( !$user ) { + // No prefix suggestion for invalid user + return array(); + } + // Autocomplete subpage as user list - public to allow caching + return UserNamePrefixSearch::search( 'public', $search, $limit, $offset ); + } + protected function getGroupName() { return 'users'; } diff --git a/includes/user/UserNamePrefixSearch.php b/includes/user/UserNamePrefixSearch.php new file mode 100644 index 0000000000..f565266315 --- /dev/null +++ b/includes/user/UserNamePrefixSearch.php @@ -0,0 +1,70 @@ +getName() : ''; + $tables = array( 'user' ); + $cond = array( 'user_name ' . $dbr->buildLike( $prefix, $dbr->anyString() ) ); + $joinConds = array(); + + // Filter out hidden user names + if ( $audience === 'public' || !$audience->isAllowed( 'hideuser' ) ) { + $tables[] = 'ipblocks'; + $cond['ipb_deleted'] = array( 0, null ); + $joinConds['ipblocks'] = array( 'LEFT JOIN', 'user_id=ipb_user' ); + } + + $res = $dbr->selectFieldValues( + $tables, + 'user_name', + $cond, + __METHOD__, + array( + 'LIMIT' => $limit, + 'ORDER BY' => 'user_name', + 'OFFSET' => $offset + ), + $joinConds + ); + + return $res === false ? array() : $res; + } +} -- 2.20.1