Implemented the "default namespaces for search" feature. This includes
authorMatthias Jordan <matjordan@users.mediawiki.org>
Tue, 1 Jul 2003 08:27:32 +0000 (08:27 +0000)
committerMatthias Jordan <matjordan@users.mediawiki.org>
Tue, 1 Jul 2003 08:27:32 +0000 (08:27 +0000)
changes to the preferences form, a new key in the LanguageXX.php files
(defaultns) and a new global config variable in DefaultSettings.php
($wgNamespacesToBeSearchedDefault).

I also killed a bug that produced an errorneous SQL command when the user
failed to check any namespaces to search in the search form. The updated
implementation searched the main namespace if no checkbox is checked.

includes/DefaultSettings.php
includes/SearchEngine.php
includes/SpecialPreferences.php
includes/User.php
languages/Language.php
languages/LanguageDe.php

index 40c7834..60ad7a2 100644 (file)
@@ -92,4 +92,7 @@ $wgCompressByDefault = true;
 $wgNamespacesWithSubpages = array( -1 => 0, 0 => 0, 1 => 1,
   2 => 1, 3 => 1, 4 => 0, 5 => 1, 6 => 0, 7 => 1 );
 
+$wgNamespacesToBeSearchedDefault = array( -1 => 0, 0 => 1, 1 => 0,
+  2 => 0, 3 => 0, 4 => 0, 5 => 0, 6 => 0, 7 => 0 );
+
 ?>
index 1960573..e339106 100644 (file)
@@ -23,7 +23,11 @@ class SearchEngine {
 
        function queryNamespaces()
        {
-               return "cur_namespace IN (" . implode( ",", $this->namespacesToSearch ) . ")";
+               $namespaces = implode( ",", $this->namespacesToSearch );
+               if ($namespaces == "") {
+                       $namespaces = "0";
+               }
+               return "AND cur_namespace IN (" . $namespaces . ")";
                #return "1";
        }
 
@@ -33,6 +37,25 @@ class SearchEngine {
                return "AND cur_is_redirect=0 ";
        }
 
+
+
+       /* private */ function initNamespaceCheckbox( $i )
+       {
+               global $wgUser, $wgNamespacesToBeSearchedDefault;
+               
+
+               if ($wgUser->getRights()) {
+                       // User is logged in so we retrieve his default namespaces
+                       return $wgUser->getOption( "searchNs".$i );
+               }
+               else {  
+                       // User is not logged in so we give him the global default namespaces
+                       return $wgNamespacesToBeSearchedDefault[ $i ];
+               }
+       }
+
+
+
        function powersearch()
        {
                global $wgUser, $wgOut, $wgLang, $wgTitle;
@@ -41,18 +64,25 @@ class SearchEngine {
                $search                 = $_REQUEST['search'];
                $searchx                = $_REQUEST['searchx'];
                $listredirs             = $_REQUEST['redirs'];
-               $nscb[0]                = $_REQUEST['ns0'];
-               $nscb[1]                = $_REQUEST['ns1'];
-               $nscb[2]                = $_REQUEST['ns2'];
-               $nscb[3]                = $_REQUEST['ns3'];
-               $nscb[4]                = $_REQUEST['ns4'];
-               $nscb[5]                = $_REQUEST['ns5'];
-               $nscb[6]                = $_REQUEST['ns6'];
-               $nscb[7]                = $_REQUEST['ns7'];
+
 
                if ( ! isset ( $searchx ) ) {   /* First time here */
-                       $nscb[0] = $listredirs = 1;     /* All others should be unset */
+                       $listredirs = 1;
+                       for ($i = 0; ($i <= 7); $i++)
+                       {
+                               $nscb[$i] = $this->initNamespaceCheckbox($i);
+                       }
+               } else {
+                       $nscb[0]                = $_REQUEST['ns0'];
+                       $nscb[1]                = $_REQUEST['ns1'];
+                       $nscb[2]                = $_REQUEST['ns2'];
+                       $nscb[3]                = $_REQUEST['ns3'];
+                       $nscb[4]                = $_REQUEST['ns4'];
+                       $nscb[5]                = $_REQUEST['ns5'];
+                       $nscb[6]                = $_REQUEST['ns6'];
+                       $nscb[7]                = $_REQUEST['ns7'];
                }
+
                $this->checkboxes["searchx"] = 1;
                $ret = wfMsg("powersearchtext");
 
@@ -143,7 +173,7 @@ class SearchEngine {
                $sql = "SELECT cur_id,cur_namespace,cur_title," .
                  "cur_text FROM cur,searchindex " .
                  "WHERE cur_id=si_page AND {$this->mTitlecond} " .
-                 "AND {$searchnamespaces} {$redircond}" .
+                 "{$searchnamespaces} {$redircond}" .
                  "LIMIT {$offset}, {$limit}";
                $res1 = wfQuery( $sql, $fname );
                $num = wfNumRows($res1);
@@ -154,7 +184,7 @@ class SearchEngine {
                        $sql = "SELECT cur_id,cur_namespace,cur_title," .
                          "cur_text FROM cur,searchindex " .
                          "WHERE cur_id=si_page AND {$this->mTextcond} " .
-                         "AND {$searchnamespaces} {$redircond} " .
+                         "{$searchnamespaces} {$redircond} " .
                          "LIMIT {$offset}, {$limit}";
                        $res2 = wfQuery( $sql, $fname );
                        $num = $num + wfNumRows($res2);
index 48294dd..18117a3 100644 (file)
@@ -43,6 +43,21 @@ function wfSpecialPreferences()
        }
 }
 
+
+/* private */ function validateCheckbox( $cb )
+{
+       if ( $cb )
+       {
+               return 1;
+       }
+       else
+       {
+               return 0;
+       }
+}
+
+
+
 /* private */ function savePreferences()
 {
        global $wgUser, $wgLang, $wgDeferredUpdateList;
@@ -50,6 +65,7 @@ function wfSpecialPreferences()
        global $wpSkin, $wpMath, $wpEmail, $wpEmailFlag, $wpNick, $wpSearch, $wpRecent;
        global $wpSearchLines, $wpSearchChars, $wpStubs;
        global $wpRows, $wpCols, $wpHourDiff, $HTTP_POST_VARS;
+       global $wpNs0, $wpNs1, $wpNs2, $wpNs3, $wpNs4, $wpNs5, $wpNs6, $wpNs7;
 
        if ( "" != $wpNewpass ) {
                if ( $wpNewpass != $wpRetype ) {
@@ -79,8 +95,17 @@ function wfSpecialPreferences()
        $wgUser->setOption( "stubthreshold", validateIntOrNull( $wpStubs ) );
        $wgUser->setOption( "timecorrection", validateIntOrNull( $wpHourDiff, -12, 14 ) );
 
-       if ( $wpEmailFlag ) { $wgUser->setOption( "disablemail", 1 ); }
-       else { $wgUser->setOption( "disablemail", 0 ); }
+       $wgUser->setOption( "searchNs0", validateCheckbox( $wpNs0 ) );
+       $wgUser->setOption( "searchNs1", validateCheckbox( $wpNs1 ) );
+       $wgUser->setOption( "searchNs2", validateCheckbox( $wpNs2 ) );
+       $wgUser->setOption( "searchNs3", validateCheckbox( $wpNs3 ) );
+       $wgUser->setOption( "searchNs4", validateCheckbox( $wpNs4 ) );
+       $wgUser->setOption( "searchNs5", validateCheckbox( $wpNs5 ) );
+       $wgUser->setOption( "searchNs6", validateCheckbox( $wpNs6 ) );
+       $wgUser->setOption( "searchNs7", validateCheckbox( $wpNs7 ) );
+
+
+       $wgUser->setOption( "disablemail", validateCheckbox( $wpEmailFlag ) );
 
        $togs = $wgLang->getUserToggles();
        foreach ( $togs as $tname => $ttext ) {
@@ -128,6 +153,45 @@ function wfSpecialPreferences()
        }
 }
 
+
+
+
+/* private */ function namespacesCheckboxes()
+{
+       global $wgLang, $wgUser;
+       $nscb = array();
+
+       
+       for ($i = 0; ($i < 8); $i++)
+       {
+               $nscb[$i] = $wgUser->getOption( "searchNs".$i );
+       }
+
+       # Determine namespace checkboxes
+
+       $ns = $wgLang->getNamespaces();
+       array_shift( $ns ); /* Skip "Special" */
+
+       $r1 = "";
+       for ( $i = 0; $i < count( $ns ); ++$i ) {
+               $checked = "";
+               if ( $nscb[$i] == 1 ) {
+                       $checked = " checked";
+               }
+               $name = str_replace( "_", " ", $ns[$i] );
+               if ( "" == $name ) { $name = "(Main)"; }
+
+               if ( 0 != $i ) { $r1 .= " "; }
+               $r1 .= "<input type=checkbox value=\"1\" name=\"" .
+                 "wpNs{$i}\"{$checked}>{$name}\n";
+       }
+       
+       return $r1;
+}
+
+
+
+
 /* private */ function mainPrefsForm( $err )
 {
        global $wgUser, $wgOut, $wgLang;
@@ -181,6 +245,7 @@ function wfSpecialPreferences()
        $scl = wfMsg( "contextlines" );
        $scc = wfMsg( "contextchars" );
        $rcc = wfMsg( "recentchangescount" );
+       $dsn = wfMsg( "defaultns" );
 
        $wgOut->addHTML( "<form id=\"preferences\" name=\"preferences\" action=\"$action\"
 method=\"post\"><table border=\"1\"><tr><td valign=top nowrap><b>$qb:</b><br>\n" );
@@ -262,6 +327,8 @@ value=\"$i\"$checked> {$mathopts[$i]}</label><br>\n" );
        if ( $wpEmailFlag ) { $emfc = "checked"; }
        else { $emfc = ""; }
 
+       $ps = namespacesCheckboxes();
+
        $wgOut->addHTML( "<td valign=top nowrap>
 <label>$yem: <input type=text name=\"wpEmail\" value=\"{$wpEmail}\" size=20></label><br>
 <label><input type=checkbox $emfc value=\"1\" name=\"wpEmailFlag\"> $emf</label><br>
@@ -273,6 +340,11 @@ value=\"$i\"$checked> {$mathopts[$i]}</label><br>\n" );
 <label>$scl: <input type=text name=\"wpSearchLines\" value=\"$wpSearchLines\" size=6></label><br>
 <label>$scc: <input type=text name=\"wpSearchChars\" value=\"$wpSearchChars\" size=6></label></td>
 </tr><tr>
+<td colspan=2>
+<b>$dsn</b><br>
+$ps
+</td>
+</tr><tr>
 <td align=center><input type=submit name=\"wpSaveprefs\" value=\"$svp\"></td>
 <td align=center><input type=submit name=\"wpReset\" value=\"$rsp\"></td>
 </tr></table>* {$tzt} </form>\n" );
index 691860b..4e38f7d 100644 (file)
@@ -69,6 +69,7 @@ class User {
        function loadDefaults()
        {
                global $wgLang ;
+               global $wgNamespacesToBeSearchedDefault;
 
                $this->mId = $this->mNewtalk = 0;
                $this->mName = getenv( "REMOTE_ADDR" );
@@ -79,6 +80,9 @@ class User {
                foreach ( $defOpt as $oname => $val ) {
                        $this->mOptions[$oname] = $val;
                }
+               foreach ($wgNamespacesToBeSearchedDefault as $nsnum => $val) {
+                       $this->mOptions["searchNs".$nsnum] = $val;
+               }
                unset( $this->mSkin );
                $this->mDataLoaded = false;
                $this->mBlockedby = -1; # Unset
index 6ecf196..7d704a1 100644 (file)
@@ -634,6 +634,7 @@ from server time (UTC).",
 "servertime"   => "Server time is now",
 "guesstimezone" => "Fill in from browser",
 "emailflag"            => "Disable e-mail from other users",
+"defaultns"            => "Search in these namespaces by default:",
 
 # Recent changes
 #
index 8d7376c..91adf0c 100644 (file)
@@ -568,6 +568,7 @@ Ihre interne ID-Nummer ist $2.",
 "servertime" => "Aktuelle Zeit auf dem Server",
 "guesstimezone" => "Einfügen aus dem Browser",
 "emailflag"            => "Keine E-Mail von anderen Benutzern erhalten",
+"defaultns"            => "In diesen Namensräumen soll standardmäßig gesucht werden:",
 
 # Recent changes
 #