Index: trunk/phase3/docs/hooks.txt |
— | — | @@ -1742,6 +1742,11 @@ |
1743 | 1743 | &$query_options: array of options for the database request |
1744 | 1744 | &$select: Array of columns to select |
1745 | 1745 | |
| 1746 | +'SpecialSearchCreateLink': called when making the message to create a page or |
| 1747 | +go to the existing page |
| 1748 | +$t: title object searched for |
| 1749 | +&$params: an array of the default message name and page title (as parameter) |
| 1750 | + |
1746 | 1751 | 'SpecialSearchGo': called when user clicked the "Go" |
1747 | 1752 | &$title: title object generated from the text entered by the user |
1748 | 1753 | &$term: the search term entered by the user |
— | — | @@ -1750,6 +1755,12 @@ |
1751 | 1756 | target doesn't exist |
1752 | 1757 | &$title: title object generated from the text entered by the user |
1753 | 1758 | |
| 1759 | +'SpecialSearchPowerBox': the equivalent of SpecialSearchProfileForm for |
| 1760 | +the advanced form, a.k.a. power search box |
| 1761 | +&$showSections: an array to add values with more options to |
| 1762 | +$term: the search term (not a title object) |
| 1763 | +$opts: an array of hidden options (containing 'redirs' and 'profile') |
| 1764 | + |
1754 | 1765 | 'SpecialSearchProfiles': allows modification of search profiles |
1755 | 1766 | &$profiles: profiles, which can be modified. |
1756 | 1767 | |
Index: trunk/phase3/includes/specials/SpecialSearch.php |
— | — | @@ -400,19 +400,28 @@ |
401 | 401 | */ |
402 | 402 | protected function showCreateLink( $t ) { |
403 | 403 | // show direct page/create link if applicable |
| 404 | + |
404 | 405 | // Check DBkey !== '' in case of fragment link only. |
405 | | - $messageName = null; |
406 | | - if( !is_null($t) && $t->getDBkey() !== '' ) { |
407 | | - if( $t->isKnown() ) { |
408 | | - $messageName = 'searchmenu-exists'; |
409 | | - } elseif( $t->userCan( 'create' ) ) { |
410 | | - $messageName = 'searchmenu-new'; |
411 | | - } else { |
412 | | - $messageName = 'searchmenu-new-nocreate'; |
413 | | - } |
| 406 | + if( is_null( $t ) || $t->getDBkey() === '' ) { |
| 407 | + // invalid title |
| 408 | + // preserve the paragraph for margins etc... |
| 409 | + $this->getOutput()->addHtml( '<p></p>' ); |
| 410 | + return; |
414 | 411 | } |
| 412 | + $messageName = ''; |
| 413 | + if( $t->isKnown() ) { |
| 414 | + $messageName = 'searchmenu-exists'; |
| 415 | + } elseif( $t->userCan( 'create' ) ) { |
| 416 | + $messageName = 'searchmenu-new'; |
| 417 | + } else { |
| 418 | + $messageName = 'searchmenu-new-nocreate'; |
| 419 | + } |
| 420 | + $params = array( $messageName, wfEscapeWikiText( $t->getPrefixedText() ) ); |
| 421 | + wfRunHooks( 'SpecialSearchCreateLink', array( $t, &$params ) ); |
| 422 | + |
| 423 | + // Extensions using the hook might still return an empty $messageName |
415 | 424 | if( $messageName ) { |
416 | | - $this->getOutput()->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", array( $messageName, wfEscapeWikiText( $t->getPrefixedText() ) ) ); |
| 425 | + $this->getOutput()->wrapWikiMsg( "<p class=\"mw-search-createlink\">\n$1</p>", $params ); |
417 | 426 | } else { |
418 | 427 | // preserve the paragraph for margins etc... |
419 | 428 | $this->getOutput()->addHtml( '<p></p>' ); |
— | — | @@ -871,13 +880,17 @@ |
872 | 881 | } |
873 | 882 | $namespaceTables .= Xml::closeElement( 'table' ); |
874 | 883 | } |
| 884 | + |
| 885 | + $showSections = array( 'namespaceTables' => $namespaceTables ); |
| 886 | + |
875 | 887 | // Show redirects check only if backend supports it |
876 | | - $redirects = ''; |
877 | 888 | if( $this->getSearchEngine()->supports( 'list-redirects' ) ) { |
878 | | - $redirects = |
| 889 | + $showSections['redirects'] = |
879 | 890 | Xml::checkLabel( wfMsg( 'powersearch-redir' ), 'redirs', 'redirs', $this->searchRedirects ); |
880 | 891 | } |
881 | 892 | |
| 893 | + wfRunHooks( 'SpecialSearchPowerBox', array( &$showSections, $term, $opts ) ); |
| 894 | + |
882 | 895 | $hidden = ''; |
883 | 896 | unset( $opts['redirs'] ); |
884 | 897 | foreach( $opts as $key => $value ) { |
— | — | @@ -913,9 +926,8 @@ |
914 | 927 | ) |
915 | 928 | ) . |
916 | 929 | Xml::element( 'div', array( 'class' => 'divider' ), '', false ) . |
917 | | - $namespaceTables . |
918 | | - Xml::element( 'div', array( 'class' => 'divider' ), '', false ) . |
919 | | - $redirects . $hidden . |
| 930 | + implode( Xml::element( 'div', array( 'class' => 'divider' ), '', false ), $showSections ) . |
| 931 | + $hidden . |
920 | 932 | Xml::closeElement( 'fieldset' ); |
921 | 933 | } |
922 | 934 | |
Index: trunk/extensions/WikimediaIncubator/WikimediaIncubator.php |
— | — | @@ -16,7 +16,7 @@ |
17 | 17 | 'path' => __FILE__, |
18 | 18 | 'name' => 'Wikimedia Incubator', |
19 | 19 | 'author' => 'SPQRobin', |
20 | | - 'version' => '4.4', |
| 20 | + 'version' => '4.5', |
21 | 21 | 'url' => 'http://www.mediawiki.org/wiki/Extension:WikimediaIncubator', |
22 | 22 | 'descriptionmsg' => 'wminc-desc', |
23 | 23 | ); |
— | — | @@ -149,3 +149,8 @@ |
150 | 150 | $wgHooks['SpecialListusersHeaderForm'][] = 'ListUsersTestWiki::onSpecialListusersHeaderForm'; |
151 | 151 | $wgHooks['SpecialListusersQueryInfo'][] = 'ListUsersTestWiki::onSpecialListusersQueryInfo'; |
152 | 152 | $wgHooks['SpecialListusersHeader'][] = 'ListUsersTestWiki::onSpecialListusersHeader'; |
| 153 | + |
| 154 | +/* Search in test wiki */ |
| 155 | +$wgHooks['SpecialSearchCreateLink'][] = 'IncubatorTest::onSpecialSearchCreateLink'; |
| 156 | +$wgHooks['SpecialSearchPowerBox'][] = 'IncubatorTest::onSpecialSearchPowerBox'; |
| 157 | +$wgHooks['SpecialSearchSetupEngine'][] = 'IncubatorTest::onSpecialSearchSetupEngine'; |
Index: trunk/extensions/WikimediaIncubator/IncubatorTest.php |
— | — | @@ -35,7 +35,7 @@ |
36 | 36 | $prefinsert[$wmincPref . '-code'] = array( |
37 | 37 | 'type' => 'text', |
38 | 38 | 'section' => 'personal/i18n', |
39 | | - 'label-message' => 'wminc-testwiki', |
| 39 | + 'label-message' => 'wminc-testwiki-code', |
40 | 40 | 'id' => $wmincPref . '-code', |
41 | 41 | 'maxlength' => (int)$wmincLangCodeLength, |
42 | 42 | 'size' => (int)$wmincLangCodeLength, |
— | — | @@ -695,6 +695,62 @@ |
696 | 696 | return true; |
697 | 697 | } |
698 | 698 | |
| 699 | + /** |
| 700 | + * Search: Adapt the default message to show a more descriptive one, |
| 701 | + * along with an adapted link. |
| 702 | + * @return true |
| 703 | + */ |
| 704 | + public static function onSpecialSearchCreateLink( $title, &$params ) { |
| 705 | + if( $title->isKnown() ) { |
| 706 | + return true; |
| 707 | + } |
| 708 | + global $wmincProjectSite, $wmincTestWikiNamespaces; |
| 709 | + $prefix = self::displayPrefix(); |
| 710 | + |
| 711 | + $newNs = $title->getNamespace(); |
| 712 | + $newTitle = $title->getText(); |
| 713 | + if( $prefix == $wmincProjectSite['short'] ) { |
| 714 | + $newNs = NS_PROJECT; |
| 715 | + } else { |
| 716 | + if( !in_array( $title->getNamespace(), $wmincTestWikiNamespaces ) ) { |
| 717 | + $newNs = $wmincTestWikiNamespaces[0]; # no "valid" NS, should be main NS |
| 718 | + } |
| 719 | + $newTitle = $prefix . '/' . $newTitle; |
| 720 | + } |
| 721 | + |
| 722 | + $t = Title::newFromText( $newTitle, $newNs ); |
| 723 | + if( $t->isKnown() ) { |
| 724 | + # use the default message if the suggested title exists |
| 725 | + $params[0] = 'searchmenu-exists'; |
| 726 | + $params[1] = wfEscapeWikiText( $t->getPrefixedText() ); |
| 727 | + return true; |
| 728 | + } |
| 729 | + $params[] = wfEscapeWikiText( $t->getPrefixedText() ); |
| 730 | + $params[0] = $prefix ? 'wminc-search-nocreate-suggest' :'wminc-search-nocreate-nopref'; |
| 731 | + return true; |
| 732 | + } |
| 733 | + |
| 734 | + /** |
| 735 | + * Search: Add an input form to enter a test wiki prefix. |
| 736 | + * @return true |
| 737 | + */ |
| 738 | + public static function onSpecialSearchPowerBox( &$showSections, $term, $opts ) { |
| 739 | + $showSections['testwiki'] = Xml::label( wfMsg( 'wminc-testwiki' ), 'testwiki' ) . ' ' . |
| 740 | + Xml::input( 'testwiki', 20, self::displayPrefix(), array( 'id' => 'testwiki' ) ); |
| 741 | + return true; |
| 742 | + } |
| 743 | + |
| 744 | + /** |
| 745 | + * Search: Search by default in the test wiki of the user's preference (or url &testwiki). |
| 746 | + * @return true |
| 747 | + */ |
| 748 | + public static function onSpecialSearchSetupEngine( $search, $profile, $engine ) { |
| 749 | + if( !isset( $search->prefix ) || !$search->prefix ) { |
| 750 | + $search->prefix = self::displayPrefix(); |
| 751 | + } |
| 752 | + return true; |
| 753 | + } |
| 754 | + |
699 | 755 | private static function preg_quote_slash( $str ) { |
700 | 756 | return preg_quote( $str, '/' ); |
701 | 757 | } |
Index: trunk/extensions/WikimediaIncubator/WikimediaIncubator.i18n.php |
— | — | @@ -16,6 +16,7 @@ |
17 | 17 | 'wminc-manual' => 'Manual', |
18 | 18 | 'wminc-listwikis' => 'List of wikis', |
19 | 19 | 'wminc-testwiki' => 'Test wiki:', |
| 20 | + 'wminc-testwiki-code' => 'Test wiki language:', |
20 | 21 | 'wminc-testwiki-none' => 'None/All', |
21 | 22 | 'wminc-recentchanges-all' => 'All recent changes', |
22 | 23 | |
— | — | @@ -57,6 +58,10 @@ |
58 | 59 | |
59 | 60 | # Special:ListUsers |
60 | 61 | 'wminc-listusers-testwiki' => 'You are viewing users who have set their test wiki preference to $1.', |
| 62 | + |
| 63 | + # Search |
| 64 | + 'wminc-search-nocreate-nopref' => 'You searched for "$1". Please set your [[Special:Preferences|test wiki preference]] so we can tell you which page you can create!', |
| 65 | + 'wminc-search-nocreate-suggest' => 'You searched for "$1". You can create a page in your wiki at <b>[[$2]]</b>!', |
61 | 66 | ); |
62 | 67 | |
63 | 68 | /** Message documentation (Message documentation) |