++ Index: openacs-4/packages/ecommerce/www/product-search.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/www/product-search.tcl,v diff -u -r1.9 -r1.10 --- openacs-4/packages/ecommerce/www/product-search.tcl 1 Mar 2005 00:01:31 -0000 1.9 +++ openacs-4/packages/ecommerce/www/product-search.tcl 10 Aug 2008 12:47:31 -0000 1.10 @@ -1,6 +1,10 @@ ad_page_contract { @param search_text @param combocategory_id:optional + @param category_id:optional + @param subcategory_id:optional + @param rows_per_page:optional How many products to display on the page + @param start_row:optional Where to begin from @param usca_p:optional This page searches for products either within a category (if specified) or @@ -17,6 +21,8 @@ {combocategory_id ""} {category_id ""} {subcategory_id ""} + {rows_per_page:naturalnum {[ad_parameter -package_id [ec_id] ProductsToDisplayPerPage ecommerce]}} + {start_row:naturalnum "0"} usca_p:optional } @@ -48,8 +54,11 @@ # filter overflow attempts from really long search strings set search_text "[string range $search_text 0 100 ]" +# filter extra spaces +regsub -all -- {\s+} $search_text { } search_text +set search_text "[string trim $search_text]" -ec_create_new_session_if_necessary [export_url_vars category_id search_text] cookies_are_not_required +ec_create_new_session_if_necessary [export_url_vars category_id subcategory_id search_text] cookies_are_not_required if { [string compare $user_session_id "0"] != 0 } { db_dml insert_search_text_to_session_info "insert into ec_user_session_info (user_session_id, category_id, search_text) values (:user_session_id, :category_id, :search_text)" } @@ -66,6 +75,7 @@ if { ![empty_string_p $subcategory_id] && $subcategory_id > 0} { set query_string [db_map search_subcategory] + set query_count_string [db_map search_count_subcategory] # select p.product_name, p.product_id, p.dirname, p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score # from ec_products_searchable p, ec_subcategory_product_map c # where c.subcategory_id=:subcategory_id @@ -75,6 +85,7 @@ } else { if { ![empty_string_p $category_id] } { set query_string [db_map search_category] + set query_count_string [db_map search_count_category] # select p.product_name, p.product_id, p.dirname, p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score # from ec_products_searchable p, ec_category_product_map c # where c.category_id=:category_id @@ -83,6 +94,7 @@ # order by score desc } else { set query_string [db_map search_all] + set query_count_string [db_map search_count_all] # select p.product_name, p.product_id, p.dirname, p.one_line_description,pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) as score # from ec_products_searchable p # where pseudo_contains(p.product_name || p.one_line_description || p.detailed_description || p.search_keywords, :search_text) > 0 @@ -91,27 +103,86 @@ } set search_string "" -set search_count 0 +set page_count 0 + +# set search_count equal to count(*) of query + +# getting the count of search results requires a second db hit, +# which becomes magnitudes faster than the tcl filtering that used to be in this loop +db_1row get_search_count $query_count_string + +set have_how_many_more_p "f" +set end_row_of_next_page [expr $start_row + (2 * $rows_per_page)] db_foreach get_product_listing_from_search $query_string { - incr search_count - append search_string " -+ + @search_results;noquote@ -
-
|
- [ec_linked_thumbnail_if_it_exists $dirname "t" "t"] | -
$product_name | +[ec_linked_thumbnail_if_it_exists $dirname "t" "t"] | +
$one_line_description | +|
[ec_price_line $product_id $user_id ""] | +
$search_count [ec_decode $search_count "1" "item found." "items found, most relevant first."]
" + if { $start_row != 0 || $search_count > $rows_per_page } { + if { [info exists last_row_this_page] } { + append search_results "Showing items [expr $start_row + 1] to $last_row_this_page.
" + } else { + append search_results "Display scope out of range of search results.
" + } + } + append search_results "${search_string}${prev_link}${separator}${next_link}" +} +set context_bar [template::adp_parse [acs_root_dir]/packages/[ad_conn package_key]/www/contextbar [list context_addition [list "[ec_system_name] search results"]]] +set ec_system_owner [ec_system_owner] + +db_release_unused_handles +ad_return_template + + +if { $search_count == 0 } { + set search_results "No products found." +} else { set search_results "$search_count [ec_decode $search_count "1" "item found." "items found, most relevant first."]
$search_string" } set context_bar [template::adp_parse [acs_root_dir]/packages/[ad_conn package_key]/www/contextbar [list context_addition [list "[ec_system_name] search results"]]]