X-Cart: shopping cart software

X-Cart forums (https://forum.x-cart.com/index.php)
-   Dev Questions (https://forum.x-cart.com/forumdisplay.php?f=20)
-   -   Improved Search Function (https://forum.x-cart.com/showthread.php?t=4415)

colonial123 09-30-2005 09:27 AM

Thanks for the code. I tried it but it has little effect, but I think its a little better than the other version.

My search results have to be somewhat accurate because I have over 1500 products and will have about 5000 when im done.

This search engine solution starts by seperating the string which is what it should do. But then it searches for all products that contain any of the words in the string and returns them as the results. I think it would be a bit more accurate if it placed the products that had the most "keywords" used in your search string at the top of the results list.

If anyone has any ideas let me know

Don L 09-30-2005 09:50 AM

try experimenting with the weighting given to keywords found in certain areas. It sounds like you want to highly favor keywords found in the title so try bumping up $topscore for the title section.

Maybe something like ($topscore changed from 4 to 10 for by_title):
Code:

  #
  # Generate additional fields string
  #
  $add_fields_string = '';
    $scorestr="";
    // Add score to fields - LNJ
    if (!empty($data["by_title"]) && count($search_words)>0) {
          $scorestr.="if($sql_tbl[products].product like '%". $data["substring"] ."%',5,0) + ";  //Add high score for exact match - LNJ
          $topscore=10; // Yeah I know HARDCODED - LNJ
          $scoredesc=$topscore/count($search_words); //Get decrementing number for scores - LNJ
          foreach($search_words as $search_word){
              $scorestr.="if($sql_tbl[products].product like '%". $search_word ."%',$topscore,0) + "; //add individual word score - LNJ
              $topscore=$topscore-$scoredesc; //Descrement individual score for word - LNJ
          }
    }
    if (!empty($data["by_shortdescr"]) && count($search_words)>0) {
          $scorestr.="if($sql_tbl[products].descr like '%". $data["substring"] ."%',3,0) + ";  //Add high score for exact match - LNJ
          $topscore=2;
          $scoredesc=$topscore/count($search_words);  //Get decrementing number for scores - LNJ
          foreach($search_words as $search_word){
              $scorestr.="if($sql_tbl[products].descr like '%". $search_word ."%',$topscore,0) + "; //add individual word score - LNJ
              $topscore=$topscore-$scoredesc;//Descrement individual score for word - LNJ
          }
    }
    if (!empty($data["by_longdescr"]) && count($search_words)>0) {
          $scorestr.="if($sql_tbl[products].fulldescr like '%". $data["substring"] ."%',3,0) + ";    //Add high score for exact match - LNJ
          $topscore=2;
          $scoredesc=$topscore/count($search_words);  //Get decrementing number for scores - LNJ
          foreach($search_words as $search_word){
              $scorestr.="if($sql_tbl[products].fulldescr like '%". $search_word ."%',$topscore,0) + "; //add individual word score - LNJ
              $topscore=$topscore-$scoredesc;//Descrement individual score for word - LNJ
          }

    }


See if you can find optimal settings for the results you're looking for.

Lucent88 10-05-2005 09:06 AM

Just to clear up the confusion... (if anyone was confused as much as I was)

the file to be replaced is include/search.php not xcart/search.php

Great Mod!!! works perfect in v4.0.16.

One question..

How can we combine this mod with "auto search using vars in url" mod?

http://forum.x-cart.com/viewtopic.php?t=18563&postdays=0&postorder=asc&sta rt=30

any idea?

vafer 10-09-2005 08:06 PM

One other thought to get better search results, has anyone thought about using the MySQL normal/boolean full text search route?

I created a simple page (not integrated with x-cart) that does the full text searching and I find I get very accurate results. My only problem. I do not know how to integrate it into x-cart. Just curious.

QVS 10-25-2005 07:49 AM

how can we make the search find product codes as well as the actual title of products etc. im using the latest version by leighj, the title search works well enough, just need to add product code to it. any help would be greatly appreciated.

:)

QVS 11-14-2005 07:49 AM

Quote:

Originally Posted by QVS
how can we make the search find product codes as well as the actual title of products etc. im using the latest version by leighj, the title search works well enough, just need to add product code to it. any help would be greatly appreciated.

:)


ok worked it out, http://forum.x-cart.com/viewtopic.php?t=11930&highlight=

colonial123 11-14-2005 07:50 AM

The easiest way is to include the product code in your detailed information.

Jon 11-14-2005 12:58 PM

I've created a mod that allows search to use Mysql's FULLTEXT capabilities, to provide relevant search results, ordered by relevance.

http://www.websitecm.com/relevant-search-results.html

xhilr8 12-06-2005 02:11 PM

Does this work with X-Cart 4.0.16?

xhilr8 12-08-2005 02:39 AM

Re: Full source
 
Quote:

Originally Posted by leighj
For those who've asked... all of it
WARNING If you mess up your X-cart don't cry to me... this was applied to a 4.0.16 search.php

Code:

<?php
/*****************************************************************************\
+-----------------------------------------------------------------------------+
| X-Cart                                                                      |
| Copyright (c) 2001-2005 Ruslan R. Fazliev <rrf@rrf.ru>                      |
| All rights reserved.                                                        |
+-----------------------------------------------------------------------------+
| PLEASE READ  THE FULL TEXT OF SOFTWARE LICENSE AGREEMENT IN THE "COPYRIGHT" |
| FILE PROVIDED WITH THIS DISTRIBUTION. THE AGREEMENT TEXT IS ALSO AVAILABLE  |
| AT THE FOLLOWING URL: http://www.x-cart.com/license.php                    |
|                                                                            |
| THIS  AGREEMENT  EXPRESSES  THE  TERMS  AND CONDITIONS ON WHICH YOU MAY USE |
| THIS SOFTWARE  PROGRAM  AND  ASSOCIATED  DOCUMENTATION  THAT  RUSLAN  R. |
| FAZLIEV (hereinafter  referred to as "THE AUTHOR") IS FURNISHING  OR MAKING |
| AVAILABLE TO YOU WITH  THIS  AGREEMENT  (COLLECTIVELY,  THE  "SOFTWARE").  |
| PLEASE  REVIEW  THE  TERMS  AND  CONDITIONS  OF  THIS  LICENSE AGREEMENT |
| CAREFULLY  BEFORE  INSTALLING  OR  USING  THE  SOFTWARE.  BY INSTALLING, |
| COPYING  OR  OTHERWISE  USING  THE  SOFTWARE,  YOU  AND  YOUR  COMPANY |
| (COLLECTIVELY,  "YOU")  ARE  ACCEPTING  AND AGREEING  TO  THE TERMS OF THIS |
| LICENSE  AGREEMENT.  IF  YOU    ARE  NOT  WILLING  TO  BE  BOUND BY THIS |
| AGREEMENT, DO  NOT INSTALL OR USE THE SOFTWARE.  VARIOUS  COPYRIGHTS  AND |
| OTHER  INTELLECTUAL  PROPERTY  RIGHTS    PROTECT  THE  SOFTWARE.  THIS |
| AGREEMENT IS A LICENSE AGREEMENT THAT GIVES  YOU  LIMITED  RIGHTS  TO  USE |
| THE  SOFTWARE  AND  NOT  AN  AGREEMENT  FOR SALE OR FOR  TRANSFER OF TITLE.|
| THE AUTHOR RETAINS ALL RIGHTS NOT EXPRESSLY GRANTED BY THIS AGREEMENT.      |
|                                                                            |
| The Initial Developer of the Original Code is Ruslan R. Fazliev            |
| Portions created by Ruslan R. Fazliev are Copyright (C) 2001-2005          |
| Ruslan R. Fazliev. All Rights Reserved.                                    |
+-----------------------------------------------------------------------------+
\*****************************************************************************/

#
# $Id: search.php,v 1.38.2.61 2005/09/19 06:45:33 max Exp $
#

if ( !defined('XCART_SESSION_START') ) { header("Location: ../"); die("Access denied"); }

$advanced_options = array("productcode", "productid", "provider", "price_max", "avail_max", "weight_max", "forsale", "flag_free_ship", "flag_ship_freight", "flag_global_disc", "flag_free_tax", "flag_min_amount", "flag_low_avail_limit", "flag_list_price", "flag_vat", "flag_gstpst", "manufacturers");

$sort_fields = array(
        "productcode"        => func_get_langvar_by_name("lbl_sku"),
        "title"                => func_get_langvar_by_name("lbl_product"),
    "price"                => func_get_langvar_by_name("lbl_price"),
        "orderby"                => func_get_langvar_by_name("lbl_default")
);
if($current_area == 'A' || $current_area == 'P')
    $sort_fields["quantity"] = func_get_langvar_by_name("lbl_quantity");

if (empty($search_data)) {
        $search_data = array();
}

if ($REQUEST_METHOD == "POST" && $mode == 'search') {
#
# Update the session $search_data variable from $posted_data
#
        if (!empty($posted_data)) {
       
                $need_advanced_options = false;
                foreach ($posted_data as $k=>$v) {
                        if (!is_array($v) && !is_numeric($v))
                                $posted_data[$k] = stripslashes($v);
                        if (in_array($k, $advanced_options) and $v !== "")
                                $need_advanced_options = true;
                }
                if (!$need_advanced_options)
                        $need_advanced_options = (doubleval($posted_data["price_min"]) != 0 || intval($posted_data["avail_min"]) != 0 || doubleval($posted_data["weight_min"]) != 0);
                if (!$need_advanced_options and $current_area == "C" and !empty($posted_data["categoryid"]))
                        $need_advanced_options = true;
                $posted_data["need_advanced_options"] = $need_advanced_options;

#
# Data convertation for Feature comparison module
#
                if(!empty($active_modules['Feature_Comparison'])) {
                        include $xcart_dir."/modules/Feature_Comparison/search_define.php";
                }

                if (empty($search_data["products"]["sort_field"])) {
                        $posted_data["sort_field"] = "title";
                        $posted_data["sort_direction"] = 0;
                }
                else {
                        $posted_data["sort_field"] = $search_data["products"]["sort_field"];
                        $posted_data["sort_direction"] = $search_data["products"]["sort_direction"];
                }
               
                $search_data["products"] = $posted_data;
                $search_data["is_modify"] = $is_modify;

        }
        func_header_location("search.php?mode=search");
}


if ($mode == "search") {
#
# Perform search and display results
#
        $data = array();

        $flag_save = false;

#
# Prepare the search data
#
        if (!empty($sort) and isset($sort_fields[$sort])) {
                # Store the sorting type in the session
                $search_data["products"]["sort_field"] = $sort;
                $flag_save = true;
        }
        if (isset($sort_direction)) {
                # Store the sorting direction in the session
                $search_data["products"]["sort_direction"] = $sort_direction;
                $flag_save = true;
        }


    if($current_area == 'C' && !empty($config['Appearance']['products_order']) && empty($search_data["products"]["sort_field"])) {
            $search_data["products"]["sort_field"] = $config['Appearance']['products_order'];
                $search_data["products"]["sort_direction"] = 0;
        }
       
        if (!empty($page) and $search_data["products"]["page"] != intval($page)) {
                # Store the current page number in the session
                $search_data["products"]["page"] = $page;
                $flag_save = true;
        }

        if (is_array($search_data["products"])) {
                $data = $search_data["products"];
                foreach ($data as $k=>$v)
                        if (!is_array($v) && !is_numeric($v))
                                $data[$k] = addslashes($v);
        }

        if(!isset($condition) || (isset($HTTP_GET_VARS['condition']) || isset($HTTP_POST_VARS['condition']) || isset($HTTP_COOKIE_VARS['condition'])))
                $condition = array();
        if(!isset($join) || (isset($HTTP_GET_VARS['join']) || isset($HTTP_POST_VARS['join']) || isset($HTTP_COOKIE_VARS['join'])))
                $join = array();
        if(!isset($add_fields) || (isset($HTTP_GET_VARS['add_fields']) || isset($HTTP_POST_VARS['add_fields']) || isset($HTTP_COOKIE_VARS['add_fields'])))
                $add_fields = array();
        if(!isset($having) || (isset($HTTP_GET_VARS['having']) || isset($HTTP_POST_VARS['having']) || isset($HTTP_COOKIE_VARS['having'])))
                $having = array();
        if(!isset($from_tbl) || (isset($HTTP_GET_VARS['from_tbl']) || isset($HTTP_POST_VARS['from_tbl']) || isset($HTTP_COOKIE_VARS['from_tbl'])))
                $from_tbl = array();
if(!isset($search_condition) || (isset($HTTP_GET_VARS['search_condition']) || isset($HTTP_POST_VARS['search_condition']) || isset($HTTP_COOKIE_VARS['search_condition'])))
                $search_condition = "";
        $search_condition .= "$sql_tbl[pricing].productid=$sql_tbl[products].productid AND $sql_tbl[pricing].quantity=1 AND $sql_tbl[pricing].membership IN ('".addslashes(@$user_account['membership'])."','')";

        if ($current_area == 'C' && empty($active_modules['Product_Configurator'])) {
                $search_condition .= " AND $sql_tbl[products].product_type <> 'C' AND $sql_tbl[products].product_type <> 'B' ";
        }

        $search_condition .= " AND $sql_tbl[pricing].variantid = 0";
       
        $data["substring"] = trim($data["substring"]);

        if (!empty($data["substring"])) {
               
                if (empty($data["by_title"]) && empty($data["by_shortdescr"]) && empty($data["by_fulldescr"]) && empty($data["extra_fields"])) {
                        $search_data["products"]["by_title"] = $data["by_title"] = "Y";
                        $flag_save = true;
                }
               
                # Search for substring in some fields...
                $search_words=explode(" ", $data["substring"]); // This separates the string by words - LNJ
                if (!empty($data["by_title"])) {
                        if($current_area == 'C' || $current_area == 'P') {
                                //$condition[] = "IF($sql_tbl[products_lng].product IS NOT NULL AND $sql_tbl[products_lng].product != '', $sql_tbl[products_lng].product, $sql_tbl[products].product) LIKE '%".$data["substring"]."%'";
                    foreach($search_words as $search_word){ // Loop through adding the search words - LNJ
                        $condition[]="$sql_tbl[products].product LIKE '%".$search_word."%'";
                    }
                        } else {
                                $condition[] = "$sql_tbl[products].product LIKE '%".$data["substring"]."%'";
                        }
                }

                if (!empty($data["by_shortdescr"])) {
                        if($current_area == 'C' || $current_area == 'P') {
                                //$condition[] = "IF($sql_tbl[products_lng].descr IS NOT NULL AND $sql_tbl[products_lng].descr != '', $sql_tbl[products_lng].descr,  $sql_tbl[products].descr) LIKE '%".$data["substring"]."%'";
                    foreach($search_words as $search_word){ // Loop through adding the search words - LNJ
                        $condition[]="$sql_tbl[products].descr LIKE '%".$search_word."%'";
                    }
                        } else {
                                $condition[] = "$sql_tbl[products].descr LIKE '%".$data["substring"]."%'";
                        }
                }

                if (!empty($data["by_fulldescr"])) {
                        if($current_area == 'C' || $current_area == 'P') {
                                //$condition[] = "IF($sql_tbl[products_lng].full_descr IS NOT NULL AND $sql_tbl[products_lng].full_descr != '', $sql_tbl[products_lng].full_descr, $sql_tbl[products].fulldescr) LIKE '%".$data["substring"]."%'";
                    foreach($search_words as $search_word){ // Loop through adding the search words - LNJ
                        $condition[]="$sql_tbl[products].fulldescr LIKE '%".$search_word."%'";
                    }
                        } else {
                                $condition[] = "$sql_tbl[products].fulldescr LIKE '%".$data["substring"]."%'";
                        }
                }

                if (!empty($data["extra_fields"]) && $active_modules['Extra_Fields']) {
                        foreach($data["extra_fields"] as $k => $v)
                                $condition[] = "($sql_tbl[extra_field_values].value LIKE '%".$data["substring"]."%' AND $sql_tbl[extra_fields].fieldid = '$k')";
                        $join['extra_field_values'] = "$sql_tbl[products].productid = $sql_tbl[extra_field_values].productid";
                        $join['extra_fields'] = "$sql_tbl[extra_field_values].fieldid = $sql_tbl[extra_fields].fieldid AND $sql_tbl[extra_fields].active = 'Y'";
                }
                if (!empty($condition))
                        $search_condition .= " AND (".implode(" OR ", $condition).")";

                # Search statistics
                db_query("INSERT INTO $sql_tbl[stats_search] (search, date) VALUES ('$data[substring]', '".time()."')");
        } # /if (!empty($data["substring"]))

#
# Search by product features
#
        if(!empty($active_modules['Feature_Comparison'])) {
                include $xcart_dir."/modules/Feature_Comparison/search_define.php";
        }

#
# Internation names & descriptions
#
        if($current_area == 'C' || $current_area == 'P') {
                $add_fields[] = "$sql_tbl[products_lng].product as product_lng";
                $add_fields[] = "$sql_tbl[products_lng].descr as descr_lng";
                $add_fields[] = "$sql_tbl[products_lng].full_descr as fulldescr_lng";
                $join['products_lng'] = "$sql_tbl[products_lng].productid = $sql_tbl[products].productid AND $sql_tbl[products_lng].code = '$shop_language'";
        }

        if(!empty($data["manufacturers"]) && $active_modules['Manufacturers']) {
                $search_condition .= " AND $sql_tbl[products].manufacturerid IN ('".implode("','", $data["manufacturers"])."')";
        }

        $search_condition .= " AND $sql_tbl[products_categories].productid=$sql_tbl[products].productid AND $sql_tbl[products_categories].categoryid = $sql_tbl[categories].categoryid";
        if($current_area == 'C') {
                $search_condition .= " AND $sql_tbl[categories].membership IN ('','".addslashes(@$user_account['membership'])."') AND $sql_tbl[categories].avail = 'Y'";
        }
        $from_tbl[$sql_tbl["products_categories"]] = 1;
        $from_tbl[$sql_tbl["categories"]] = 1;

        if (!empty($data["categoryid"])) {

                # Search by category...

                $data["categoryid"] = intval($data["categoryid"]);

                $category_sign = "";

                if (empty($data["category_main"]) && empty($data["category_extra"])) {
                        $category_sign = "NOT";
                }

                if (!empty($data["search_in_subcategories"])) {

                        # Search also in all subcategories
                        $categoryid_path = addslashes(func_query_first_cell("SELECT categoryid_path FROM $sql_tbl[categories] WHERE categoryid='".$data["categoryid"]."'"));
                        $categoryids_tmp = func_query("SELECT categoryid FROM $sql_tbl[categories] WHERE categoryid='".$data["categoryid"]."' OR categoryid_path LIKE '$categoryid_path/%'");

                        if (is_array($categoryids_tmp) && !empty($categoryids_tmp)) {
                                foreach ($categoryids_tmp as $k=>$v) {
                                        $categoryids[] = $v["categoryid"];
                                }

                                $search_condition .= " AND $sql_tbl[products_categories].categoryid $category_sign IN (".implode(",", $categoryids).")";
                        }
                }
                else {
                        $search_condition .= " AND $category_sign $sql_tbl[products_categories].categoryid='$data[categoryid]'";
                }
               
                $condition = array();
               
                if (!empty($data["category_main"]))
                        $condition[] = "$sql_tbl[products_categories].main='Y'";

                if (!empty($data["category_extra"]))
                        $condition[] = "$sql_tbl[products_categories].main!='Y'";
       
                if (!empty($condition))
                        $search_condition .= " AND (".implode(" OR ", $condition).")";
               
        } elseif($current_area == 'C') {
        }
        # /if (!empty($data["categoryid"]))

        if (!empty($data["productcode"])) {
                if(!empty($active_modules['Product_Options'])) {
                        $search_condition .= " AND ($sql_tbl[products].productcode LIKE '%".$data["productcode"]."%' OR $sql_tbl[variants].productcode LIKE '%".$data["productcode"]."%')";
                } else {
                        $search_condition .= " AND $sql_tbl[products].productcode LIKE '%".$data["productcode"]."%'";
                }
        }

        if (!empty($data["productid"])) {
                $search_condition .= " AND $sql_tbl[products].productid ".(is_array($data["productid"]) ? " IN ('".implode("','", $data["productid"])."')": "= '".$data["productid"]."'");
        }
       
        if (!empty($data["provider"]))
                $search_condition .= " AND $sql_tbl[products].provider='".$data["provider"]."'";

        if (!empty($data["price_min"])) {
                if(!empty($active_modules['Product_Options'])) {
                        $having[] = "(price>='".$data["price_min"]."' OR v_price>='".$data["price_min"]."')";
                } else {
                        $search_condition .= " AND $sql_tbl[pricing].price>='".$data["price_min"]."'";
                }
        }
       
        if (strlen(@$data["price_max"]) > 0) {
                if(!empty($active_modules['Product_Options'])) {
                        $having[] = "(price<='".$data["price_max"]."' OR v_price<='".$data["price_max"]."')";
                } else {
                        $search_condition .= " AND $sql_tbl[pricing].price<='".$data["price_max"]."'";
                }
        }

        if (!empty($data["avail_min"])) {
                if(!empty($active_modules['Product_Options'])) {
                        $search_condition .= " AND ($sql_tbl[products].avail>='".$data["avail_min"]."' OR $sql_tbl[variants].avail>='".$data["avail_min"]."')";
                } else {
                        $search_condition .= " AND $sql_tbl[products].avail>='".$data["avail_min"]."'";
                }
        }
       
        if (strlen(@$data["avail_max"]) > 0) {
                if(!empty($active_modules['Product_Options'])) {
                        $search_condition .= " AND ($sql_tbl[products].avail<='".$data["avail_max"]."' OR $sql_tbl[variants].avail<='".$data["avail_max"]."')";
                } else {
                        $search_condition .= " AND $sql_tbl[products].avail<='".$data["avail_max"]."'";
                }
        }

        if (!empty($data["weight_min"])) {
                if(!empty($active_modules['Product_Options'])) {
                        $search_condition .= " AND ($sql_tbl[products].weight>='".$data["weight_min"]."' OR $sql_tbl[variants].weight>='".$data["weight_min"]."')";
                } else {
                        $search_condition .= " AND $sql_tbl[products].weight>='".$data["weight_min"]."'";
                }
        }

        if (strlen(@$data["weight_max"]) > 0) {
                if(!empty($active_modules['Product_Options'])) {
                        $search_condition .= " AND ($sql_tbl[products].weight<='".$data["weight_max"]."' OR $sql_tbl[variants].weight<='".$data["weight_max"]."')";
                } else {
                        $search_condition .= " AND $sql_tbl[products].weight<='".$data["weight_max"]."'";
                }
        }

        if (!empty($data["forsale"]))
                $search_condition .= " AND $sql_tbl[products].forsale='".$data["forsale"]."'";

        if (!empty($data["flag_free_ship"]))
                $search_condition .= " AND $sql_tbl[products].free_shipping='".$data["flag_free_ship"]."'";

        if (!empty($data["flag_ship_freight"]))
                $search_condition .= " AND $sql_tbl[products].shipping_freight='".$data["flag_ship_freight"]."'";
       
        if (!empty($data["flag_ship_freight"])) {
                if ($data["flag_ship_freight"] == "Y")
                        $search_condition .= " AND $sql_tbl[products].shipping_freight>'0'";
                else
                        $search_condition .= " AND $sql_tbl[products].shipping_freight='0'";
        }

        if (!empty($data["flag_global_disc"]))
                $search_condition .= " AND $sql_tbl[products].discount_avail='".$data["flag_global_disc"]."'";

        if (!empty($data["flag_free_tax"]))
                $search_condition .= " AND $sql_tbl[products].free_tax='".$data["flag_free_tax"]."'";

        if (!empty($data["flag_min_amount"])) {
                if ($data["flag_min_amount"] == "Y")
                        $search_condition .= " AND $sql_tbl[products].min_amount!='1'";
                else
                        $search_condition .= " AND $sql_tbl[products].min_amount='1'";
        }

        if (!empty($data["flag_low_avail_limit"])) {
                if ($data["flag_low_avail_limit"] == "Y")
                        $search_condition .= " AND $sql_tbl[products].low_avail_limit!='10'";
                else
                        $search_condition .= " AND $sql_tbl[products].low_avail_limit='10'";
        }

        if (!empty($data["flag_list_price"])) {
                if ($data["flag_list_price"] == "Y")
                        $search_condition .= " AND $sql_tbl[products].list_price!='0'";
                else
                        $search_condition .= " AND $sql_tbl[products].list_price='0'";
        }

        if (!empty($data["flag_vat"])) {
                if ($data["flag_vat"] == "Y")
                        $search_condition .= " AND $sql_tbl[products].vat!='0'";
                else
                        $search_condition .= " AND $sql_tbl[products].vat='0'";
        }

        if (!empty($data["flag_gstpst"])) {
                if ($data["flag_gstpst"] == "Y")
                        $search_condition .= " AND ($sql_tbl[products].apply_gst='Y' OR $sql_tbl[products].apply_pst='Y')";
                else
                        $search_condition .= " AND $sql_tbl[products].apply_gst='N' AND $sql_tbl[products].apply_pst='N'";
        }

        if(!empty($active_modules['Product_Options'])) {
                $join['classes'] = "$sql_tbl[classes].productid = $sql_tbl[products].productid";
                $join["variants"] = "$sql_tbl[variants].productid = $sql_tbl[products].productid";
                if($current_area == 'C' && $config["General"]["disable_outofstock_products"] == "Y") {
                        $join["variants"] .= " AND $sql_tbl[variants].avail > 0";
                }
                $join["pricing v_pricing"] = "v_pricing.variantid = $sql_tbl[variants].variantid AND v_pricing.quantity = 1 AND v_pricing.membership IN ('','".addslashes(@$user_account['membership'])."')";
                $add_fields[] = "IF($sql_tbl[variants].variantid IS NOT NULL,'Y','') as is_variant";
                $add_fields[] = "IF($sql_tbl[classes].classid IS NOT NULL,'Y','') as is_product_options";
                $add_fields[] = "MIN(v_pricing.price) as v_price";
        }

        if (!empty($data["sort_field"])) {

                # Sort the search results...

                $direction = ($data["sort_direction"] ? "DESC" : "ASC");
                switch ($data["sort_field"]) {
                        case "productcode":
                                $sort_string = "$sql_tbl[products].productcode $direction";
                                break;
                        case "title":
                                $sort_string = "searchscore desc, $sql_tbl[products].product $direction"; // Add score to sort - LNJ
                                break;
                        case "orderby":
                                $sort_string = "$sql_tbl[products_categories].orderby $direction";
                                break;
                        case "quantity":
                                $sort_string = "$sql_tbl[products].avail $direction";
                                break;
                        case "price":
                                if (!empty($active_modules["Special_Offers"]) && !empty($search_data["products"]["show_special_prices"])) {
                                        $sort_string = "x_special_price $direction, price $direction";
                                }
                                else {
                                        $sort_string = "price $direction";
                                }
                                break;
                        default:
                                $sort_string = "searchscore desc,$sql_tbl[products].product";  // Add score to sort - LNJ
                }
        } else {
                $sort_string = "searchscore desc,$sql_tbl[products].product"; // Add score to sort - LNJ
        }
        if(!empty($data['sort_condition'])) {
                $sort_string = $data['sort_condition'];
        }

        if (($current_area == "C" || $current_area == "B") && $config["General"]["disable_outofstock_products"] == "Y") {
                $search_condition .= " AND ($sql_tbl[products].avail>0 OR $sql_tbl[products].product_type NOT IN ('','N')) ";
        }

        if (!empty($from_tbl) and is_array($from_tbl))
                $from_tbl = ", ".implode(", ", array_keys($from_tbl));

        #
        # Generate LEFT JOIN string
        #
        $join_string = '';
        if(!empty($join) && @is_array($join)) {
                foreach($join as $k => $v) {
                        list($name, $as) = explode(" ", $k);
                        if(!empty($as))
                                $as = " as ".$as;
                        $join_string .= " LEFT JOIN ".$sql_tbl[$name].$as." ON $v ";
                }
        }

        #
        # Generate HAVING string
        #
        $having_string = '';
        if(!empty($having)) {
                $having_string = " HAVING ".implode(" AND ", $having);
        }


        #
        # Generate additional fields string
        #
        $add_fields_string = '';
    $scorestr="";
    // Add score to fields - LNJ
    if (!empty($data["by_title"]) && count($search_words)>0) {
          $scorestr.="if($sql_tbl[products].product like '%". $data["substring"] ."%',5,0) + ";  //Add high score for exact match - LNJ
          $topscore=4; // Yeah I know HARDCODED - LNJ
          $scoredesc=$topscore/count($search_words); //Get decrementing number for scores - LNJ
          foreach($search_words as $search_word){
              $scorestr.="if($sql_tbl[products].product like '%". $search_word ."%',$topscore,0) + "; //add individual word score - LNJ
              $topscore=$topscore-$scoredesc; //Descrement individual score for word - LNJ
          }
    }
    if (!empty($data["by_shortdescr"]) && count($search_words)>0) {
          $scorestr.="if($sql_tbl[products].descr like '%". $data["substring"] ."%',3,0) + ";  //Add high score for exact match - LNJ
          $topscore=2;
          $scoredesc=$topscore/count($search_words);  //Get decrementing number for scores - LNJ
          foreach($search_words as $search_word){
              $scorestr.="if($sql_tbl[products].descr like '%". $search_word ."%',$topscore,0) + "; //add individual word score - LNJ
              $topscore=$topscore-$scoredesc;//Descrement individual score for word - LNJ
          }
    }
    if (!empty($data["by_longdescr"]) && count($search_words)>0) {
          $scorestr.="if($sql_tbl[products].fulldescr like '%". $data["substring"] ."%',3,0) + ";    //Add high score for exact match - LNJ
          $topscore=2;
          $scoredesc=$topscore/count($search_words);  //Get decrementing number for scores - LNJ
          foreach($search_words as $search_word){
              $scorestr.="if($sql_tbl[products].fulldescr like '%". $search_word ."%',$topscore,0) + "; //add individual word score - LNJ
              $topscore=$topscore-$scoredesc;//Descrement individual score for word - LNJ
          }

    }

    $add_fields[]=$scorestr . " 0 as searchscore";  // Add this field to the list - LNJ
        if(!empty($add_fields) && @is_array($add_fields)) {
                $add_fields_string = ", ".implode(", ", $add_fields);
        }
       
    #
    # Calculate the number of rows in the search results
    #
        db_query("SET OPTION SQL_BIG_SELECTS=1");
        $_res = db_query("SELECT COUNT($sql_tbl[products].productid), MIN($sql_tbl[pricing].price) as price $add_fields_string FROM $sql_tbl[products], $sql_tbl[pricing] $from_tbl $join_string WHERE $search_condition GROUP BY $sql_tbl[products].productid $having_string");
        $total_items = db_num_rows($_res);
        db_free_result($_res);

        if ($total_items > 0) {
               
                $page = $search_data["products"]["page"];

                #
                # Prepare the page navigation
                #
                if(!isset($objects_per_page)) {
                        if ($current_area == "C" || $current_area == "B")
                                $objects_per_page = $config["Appearance"]["products_per_page"];
                        else
                                $objects_per_page = $config["Appearance"]["products_per_page_admin"];
                }

                $total_nav_pages = ceil($total_items/$objects_per_page)+1;

                include $xcart_dir."/include/navigation.php";

                #
                # Perform the SQL query and getting the search results
                #

                if (!empty($search_data["is_modify"])) {
                #
                # Get the products and go to modify them
                #
                        $products = func_query("SELECT $sql_tbl[products].productid, MIN($sql_tbl[pricing].price) as price $add_fields_string FROM $sql_tbl[products], $sql_tbl[pricing] $from_tbl $join_string WHERE $search_condition GROUP BY $sql_tbl[products].productid $having_string");
                        if (is_array($products)) {
                                x_session_register("store_productids");
                                $store_productids = array();
                                foreach($products as $v)
                                        $store_productids[$v['productid']] = true;
                                func_header_location("product_modify.php?mode=return");
                        }
                }
                else
                        $products = func_query("SELECT $sql_tbl[products].*, MIN($sql_tbl[pricing].price) as price $add_fields_string FROM $sql_tbl[products], $sql_tbl[pricing] $from_tbl $join_string WHERE $search_condition GROUP BY $sql_tbl[products].productid $having_string ORDER BY $sort_string, $sql_tbl[products].product ASC LIMIT $first_page, $objects_per_page");

                if (!empty($products) and ($current_area == "C" || $current_area == "B")) {
                        x_session_register("cart");

                        foreach ($products as $k=>$v) {

                                if($v['is_variant'] == 'Y') {
                                        $in_cart_variants = array();
                                        $in_cart_where = ", $sql_tbl[variants].avail";
                                        if(!empty($cart['products'])) {
                                                foreach($cart['products'] as $cv) {
                                                        if($cv['productid'] == $v['productid']) {
                                                                $in_cart_variants[func_get_variantid($cv['options'])] = $cv['amount'];
                                                        }
                                                }
                                        }
                                        if(!empty($in_cart_variants)) {
                                                $in_cart_where = ", ($sql_tbl[variants].avail-(CASE $sql_tbl[variants].variantid";
                                                foreach($in_cart_variants as $kv => $vv) {
                                                        $in_cart_where .= " WHEN $kv THEN $vv";
                                                }
                                                $in_cart_where .= " ELSE 0 END)) as avail";
                                        }
                                        $variant_cnt = intval(func_query_first_cell("SELECT COUNT(*) FROM $sql_tbl[classes] WHERE productid = '$v[productid]' AND is_modifier = ''"));
                                        $var_ex = func_create_hash_keys(func_query("SELECT $sql_tbl[variants].variantid, MIN($sql_tbl[pricing].price) as price $in_cart_where FROM $sql_tbl[pricing], $sql_tbl[variants], $sql_tbl[variant_items], $sql_tbl[class_options], $sql_tbl[classes] LEFT JOIN $sql_tbl[product_options_ex] ON $sql_tbl[class_options].optionid = $sql_tbl[product_options_ex].optionid WHERE $sql_tbl[pricing].quantity = 1 AND $sql_tbl[pricing].membership = '' AND $sql_tbl[pricing].variantid = $sql_tbl[variants].variantid AND $sql_tbl[variants].variantid = $sql_tbl[variant_items].variantid AND $sql_tbl[variant_items].optionid = $sql_tbl[class_options].optionid AND $sql_tbl[class_options].classid = $sql_tbl[classes].classid AND $sql_tbl[class_options].avail = 'Y' AND $sql_tbl[classes].avail = 'Y' AND $sql_tbl[pricing].productid = '$v[productid]' GROUP BY $sql_tbl[product_options_ex].exceptionid, $sql_tbl[pricing].variantid HAVING SUM(IF($sql_tbl[product_options_ex].optionid IS NULL, 0, 1)) = '$variant_cnt' ".(($config["General"]["disable_outofstock_products"] == "Y") ? " AND avail > 0" : "")), "variantid");
                                        $var_ex = (empty($var_ex) ? array() : array_keys($var_ex));
                                        $var = func_query_first("SELECT $sql_tbl[variants].variantid, $sql_tbl[variants].weight, $sql_tbl[variants].productcode, MIN($sql_tbl[pricing].price) as price $in_cart_where FROM $sql_tbl[pricing], $sql_tbl[variants], $sql_tbl[variant_items], $sql_tbl[class_options], $sql_tbl[classes] WHERE $sql_tbl[pricing].quantity = 1 AND $sql_tbl[pricing].membership = '' AND $sql_tbl[pricing].variantid = $sql_tbl[variants].variantid AND $sql_tbl[variants].variantid = $sql_tbl[variant_items].variantid AND $sql_tbl[variant_items].optionid = $sql_tbl[class_options].optionid AND $sql_tbl[class_options].classid = $sql_tbl[classes].classid AND $sql_tbl[class_options].avail = 'Y' AND $sql_tbl[classes].avail = 'Y' AND $sql_tbl[pricing].productid = '$v[productid]' AND $sql_tbl[variants].variantid NOT IN ('".implode("','", $var_ex)."') GROUP BY $sql_tbl[pricing].variantid ".(($config["General"]["disable_outofstock_products"] == "Y") ? " HAVING avail > 0" : "")." ORDER BY price LIMIT 1");
                                        if(empty($var) && $config["General"]["disable_outofstock_products"] == "Y") {
                                                $var = func_query_first("SELECT $sql_tbl[variants].variantid, $sql_tbl[variants].weight, $sql_tbl[variants].productcode, MIN($sql_tbl[pricing].price) as price $in_cart_where FROM $sql_tbl[pricing], $sql_tbl[variants], $sql_tbl[variant_items], $sql_tbl[class_options], $sql_tbl[classes] WHERE $sql_tbl[pricing].quantity = 1 AND $sql_tbl[pricing].membership = '' AND $sql_tbl[pricing].variantid = $sql_tbl[variants].variantid AND $sql_tbl[variants].variantid = $sql_tbl[variant_items].variantid AND $sql_tbl[variant_items].optionid = $sql_tbl[class_options].optionid AND $sql_tbl[class_options].classid = $sql_tbl[classes].classid AND $sql_tbl[class_options].avail = 'Y' AND $sql_tbl[classes].avail = 'Y' AND $sql_tbl[pricing].productid = '$v[productid]' AND $sql_tbl[variants].variantid NOT IN ('".implode("','", $var_ex)."') GROUP BY $sql_tbl[pricing].variantid ORDER BY price LIMIT 1");
                                        }
                                        if(!empty($var)) {
                                                $v = func_array_merge($v, $var);
                                                $products[$k] = $v;
                                        }
                                }

                                if($v['is_product_options']) {
                                        $poptions = func_query("SELECT MIN(IF($sql_tbl[class_options].modifier_type = '%', ".$v['price']."*$sql_tbl[class_options].price_modifier/100, $sql_tbl[class_options].price_modifier)) as add_price FROM $sql_tbl[classes], $sql_tbl[class_options] WHERE $sql_tbl[classes].productid = '$v[productid]' AND $sql_tbl[classes].classid = $sql_tbl[class_options].classid AND $sql_tbl[classes].is_modifier = 'Y' AND $sql_tbl[classes].avail = 'Y' GROUP BY $sql_tbl[classes].classid ORDER BY add_price");
                                        if(!empty($poptions)) {
                                                foreach($poptions as $po) {
                                                        $v['price'] += $po['add_price'];
                                                }
                                                $products[$k] = $v;
                                        }
                                }

                                if(!empty($active_modules['Feature_Comparison'])) {
                                        $products[$k]['is_clist'] = func_check_comparison($v['productid']);
                                }

                                $in_cart = 0;
                                if(!empty($cart['products']) && $v['is_variant'] != 'Y') {
                                        foreach($cart['products'] as $cv) {
                                                if($cv['productid'] == $v['productid'])
                                                                $in_cart += $cv['amount'];
                                        }
                                        $products[$k]['avail'] -= $in_cart;
                                }
                                if($products[$k]['avail'] < 0) {
                                        $products[$k]['avail'] = 0;
                                }

                                $products[$k]["tmbn_url"] = func_get_thumbnail_url($v["productid"]);
                                if(!empty($v['product_lng']))
                                        $products[$k]['product'] = $v['product_lng'];
                                if(!empty($v['descr_lng']))
                                        $products[$k]['descr'] = $v['descr_lng'];
                                if(!empty($v['fulldescr_lng']))
                                        $products[$k]['fulldescr'] = $v['fulldescr_lng'];
                                unset($products[$k]['product_lng'], $products[$k]['descr_lng'], $products[$k]['fulldescr_lng']);

                                if (!empty($active_modules["Special_Offers"]) && !empty($search_data["products"]["show_special_prices"])) {
                                        include $xcart_dir."/modules/Special_Offers/search_results_calculate.php";
                                }
                                else {
                                        $products[$k]["taxes"] = func_get_product_taxes($products[$k], $login);
                                }

                                if($products[$k]['descr'] == strip_tags($products[$k]['descr']))
                                        $products[$k]['descr'] = str_replace("\n","
",$products[$k]['descr']);
                                if($products[$k]['fulldescr'] == strip_tags($products[$k]['fulldescr']))
                                        $products[$k]['fulldescr'] = str_replace("\n","
",$products[$k]['fulldescr']);
                        }

                        if (!empty($active_modules["Special_Offers"]) && empty($search_data["products"]["show_special_prices"])) {
                                func_offers_check_products($login, $current_area, $products);
                        }
                }
               
                # Assign the Smarty variables
                $smarty->assign("navigation_script","search.php?mode=search");
                $smarty->assign("products", $products);
                $smarty->assign("first_item", $first_page+1);
                $smarty->assign("last_item", min($first_page+$objects_per_page, $total_items));
        }

        $smarty->assign("total_items",$total_items);
        $smarty->assign("mode", $mode);
       
        if ($flag_save)
                x_session_save("search_data");
       
}

if (empty($search_data["products"]) && $current_area == 'C') {
        $search_data["products"]['productcode'] = $config['Search_products']['search_products_sku_d'];
        $search_data["products"]['price_min'] = preg_replace("/-.*$/", "", $config['Search_products']['search_products_price_d']);
        $search_data["products"]['price_max'] = preg_replace("/^.*-/", "", $config['Search_products']['search_products_price_d']);
        $search_data["products"]['weight_min'] = preg_replace("/-.*$/", "", $config['Search_products']['search_products_weight_d']);
        $search_data["products"]['weight_max'] = preg_replace("/^.*-/", "", $config['Search_products']['search_products_weight_d']);
        $search_data["products"]['categoryid'] = $config['Search_products']['search_products_category_d'];
}

if (!empty($active_modules['Feature_Comparison']) && $current_area != 'C' && $current_area != 'P') {
        $fclasses = func_query("SELECT $sql_tbl[feature_classes].*, IF($sql_tbl[feature_classes_lng].class IS NOT NULL, $sql_tbl[feature_classes_lng].class, $sql_tbl[feature_classes].class) as class FROM $sql_tbl[feature_classes] LEFT JOIN $sql_tbl[feature_classes_lng] ON $sql_tbl[feature_classes].fclassid = $sql_tbl[feature_classes_lng].fclassid AND $sql_tbl[feature_classes_lng].code = '$shop_language' WHERE $sql_tbl[feature_classes].avail = 'Y' ORDER BY $sql_tbl[feature_classes].orderby");
        if(!empty($fclasses)) {
                $smarty->assign("fclasses", $fclasses);
        }
}

$smarty->assign("search_prefilled", $search_data["products"]);

if($active_modules['Manufacturers']) {
        $manufacturers = func_query("SELECT * FROM $sql_tbl[manufacturers] WHERE avail = 'Y' ORDER BY orderby,manufacturer");
        if($manufacturers) {
                array_unshift($manufacturers, array("manufacturerid" => '0', "manufacturer" => func_get_langvar_by_name("lbl_no_manufacturer")));
                $tmp = explode("\n", $config['Search_products']['search_products_manufacturers_d']);
                foreach($manufacturers as $k => $v) {
                        if(@in_array($v['manufacturerid'], (array)$search_data["products"]['manufacturers']) || (in_array($v['manufacturerid'], $tmp) && $current_area == 'C'))
                                $manufacturers[$k]['selected'] = 'Y';
                }
                if($manufacturers)
                        $smarty->assign("manufacturers", $manufacturers);
        }
}

if($active_modules['Extra_Fields']) {
    $extra_fields = func_query("SELECT * FROM $sql_tbl[extra_fields] WHERE active = 'Y' ORDER BY field");
    if($extra_fields) {
                $tmp = explode("\n", $config['Search_products']['search_products_extra_fields']);
        foreach($extra_fields as $k => $v) {
                        if(!in_array($v['fieldid'], $tmp) && $current_area == 'C') {
                                unset($extra_fields[$k]);
                                continue;
                        }
            if($search_data["products"]['extra_fields'][$v['fieldid']])
                $extra_fields[$k]['selected'] = 'Y';
        }
                if($extra_fields)
                $smarty->assign("extra_fields", $extra_fields);
    }
}

if ($current_area != 'C')
        include_once $xcart_dir."/include/categories.php";

$search_categories = $smarty->get_template_vars("allcategories");
if ($current_area == "C" && !empty($active_modules["Fancy_Categories"])) {
        if(!function_exists("func_categories_sort_abc")) {
                function func_categories_sort_abc($a, $b) {
                        return strcmp($a["category_path"], $b["category_path"]);
                }
        }
        usort($search_categories, "func_categories_sort_abc");
}
$smarty->assign("search_categories", $search_categories);
unset($search_categories);

if (!defined('IS_ROBOT'))
        $smarty->assign("sort_fields", $sort_fields);

$smarty->assign("main","search");

$from_tbl = $condition = $join = $add_fields = $having = array();
$search_condition = "";
unset($from_tbl, $condition, $join, $add_fields, $having, $search_condition);
?>



Ok, I tried this with X-Cart 4.0.16 and it doesn't seem to work despite claims that it works with this version. When I enter a search query (any search query), it simply loads up the main home page again.. :?:


All times are GMT -8. The time now is 02:42 AM.

Powered by vBulletin Version 3.5.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.