Index: openacs-4/packages/ecommerce/tcl/ecds-procs.tcl
===================================================================
RCS file: /usr/local/cvsroot/openacs-4/packages/ecommerce/tcl/ecds-procs.tcl,v
diff -u -r1.7 -r1.8
--- openacs-4/packages/ecommerce/tcl/ecds-procs.tcl 3 Dec 2008 09:31:49 -0000 1.7
+++ openacs-4/packages/ecommerce/tcl/ecds-procs.tcl 22 Dec 2008 01:06:34 -0000 1.8
@@ -2009,19 +2009,91 @@
} {
if { $items_per_page > 0 && $item_count > 0 && $first_item_displayed > 0 && $first_item_displayed <= $item_count } {
- set nbr_of_pages [expr { ( $item_count + $items_per_page - 1 ) / $items_per_page } ]
+ set bar_list [list]
+ set end_page [expr { ( $item_count + $items_per_page - 1 ) / $items_per_page } ]
+
set current_page [expr { ( $first_item_displayed + $items_per_page - 1 ) / $items_per_page } ]
- set outer_limit [expr { $nbr_of_pages + 1 } ]
+
+ # first row of current page \[expr { (( $current_page - 1) * $items_per_page ) + 1 } \]
+
+ # create bar_list with no pages beyond end_page
+
+ if { $item_count > [expr { $items_per_page * 81 } ] } {
+ # use exponential page referencing
+ set relative_step 0
+ set next_bar_list [list]
+ set prev_bar_list [list]
+ # 0.69314718056 = log(2)
+ set max_search_points [expr { int( ( log( $end_page ) / 0.69314718056 ) + 1 ) } ]
+ for {set exponent 0} { $exponent <= $max_search_points } { incr exponent 1 } {
+ # exponent refers to a page, relative_step refers to a relative row
+ set relative_step_row [expr { int( pow( 2, $exponent ) ) } ]
+ set relative_step_page $relative_step_row
+ lappend next_bar_list $relative_step_page
+ set prev_bar_list [linsert $prev_bar_list 0 [expr { -1 * $relative_step_page } ]]
+ }
+
+ # template_bar_list and relative_bar_list contain page numbers
+ set template_bar_list [concat $prev_bar_list 0 $next_bar_list]
+ set relative_bar_list [lsort -unique -increasing -integer $template_bar_list]
+
+ # translalte bar_list relative values to absolute rows
+ foreach {relative_page} $relative_bar_list {
+ set new_page [expr { int ( $relative_page + $current_page ) } ]
+ if { $new_page < $end_page } {
+ lappend bar_list $new_page
+ }
+ }
+
+ } elseif { $item_count > [expr { $items_per_page * 10 } ] } {
+ # use linear, stepped page referencing
+
+ set next_bar_list [list 1 2 3 4 5]
+ set prev_bar_list [list -5 -4 -3 -2 -1]
+ set template_bar_list [concat $prev_bar_list 0 $next_bar_list]
+ set relative_bar_list [lsort -unique -increasing -integer $template_bar_list]
+ # translalte bar_list relative values to absolute rows
+ foreach {relative_page} $relative_bar_list {
+ set new_page [expr { int ( $relative_page + $current_page ) } ]
+ if { $new_page < $end_page } {
+ lappend bar_list $new_page
+ }
+ }
+ # add absolute page references
+ for {set page_number 10} { $page_number <= $end_page } { incr page_number 10 } {
+ lappend bar_list $page_number
+ set bar_list [linsert $bar_list 0 [expr { -1 * $page_number } ] ]
+ }
+
+ } else {
+ # use complete page reference list
+ for {set page_number 1} { $page_number <= $end_page } { incr page_number 1 } {
+ lappend bar_list $page_number
+ }
+ }
+
+ # add absolute reference for first page, last page
+ lappend bar_list $end_page
+ set bar_list [linsert $bar_list 0 1]
+
+ # clean up list
+ # now we need to sort and remove any remaining nonpositive integers and duplicates
+ set filtered_bar_list [lsort -unique -increasing -integer [lsearch -all -glob -inline $bar_list {[0-9]*} ]]
+ # delete any cases of page zero
+ set zero_index [lsearch $filtered_bar_list 0]
+ set bar_list [lreplace $filtered_bar_list $zero_index $zero_index]
+
+ # generate code (this part should be moved to ecommerce/lib))
set prev_bar $separator
set next_bar $separator
- for {set page 1} {$page < $outer_limit} {incr page 1} {
+ foreach page $bar_list {
set start_item [expr { ( ( $page - 1 ) * $items_per_page ) + 1 } ]
if { $page < $current_page } {
append prev_bar " $page $separator"
} elseif { $page eq $current_page } {
set current_bar " $page "
} elseif { $page > $current_page } {
- if { $page < $nbr_of_pages } {
+ if { $page < $end_page } {
append next_bar " $page $separator"
} else {
append next_bar " $page "
@@ -2031,8 +2103,8 @@
set bar_list [list $prev_bar $current_bar $next_bar]
} else {
ns_log Warning "ecds_pagination_by_items: parameter value(s) out of bounds for base_url $base_url $item_count $items_per_page $first_item_displayed"
- set bar_list [list 1 $first_item_displayed $item_count]
}
+
return $bar_list
}
@@ -2083,3 +2155,41 @@
ecds_sort_subcategory_list $category_id
}
}
+
+ad_proc -private ecds_keyword_search_update {
+ product_id
+ {extras_list ""}
+} {
+ adds certain custom field values to ec_products.search_keywords, returns 1 if updated, otherwise returns 0
+} {
+ if { $extras_list eq "" } {
+ set extras_list [list brandname brandmodelnumber unspsccode vendorsku vendorabbrev]
+ }
+ set success 0
+
+ db_0or1row select_product_keywords_and_extras "select a.search_keywords, b.brandname, b.brandmodelnumber, b.unspsccode, b.vendorsku, b.vendorabbrev from ec_products a, ec_custom_product_field_values b where a.product_id = b.product_id and a.product_id = :product_id"
+
+ # if extras are not in search_keywords, add them
+ if { [info exists search_keywords ] } {
+ set keywords [string tolower $search_keywords]
+ } else {
+ set keywords ""
+ }
+ foreach extra $extras_list {
+ if { ![info exists $extra] } {
+ set $extra ""
+ ns_log Warning "ecds_search_keywords_update: working on product_id $product_id, no info for $extra"
+ } else {
+ set extra_value [string tolower [expr $$extra]]
+ if { [string length $extra_value] > 0 && [string first $extra_value $keywords] eq -1 } {
+ set search_keywords [string range "${search_keywords}, ${extra_value}" 0 3998]
+ set success 1
+ }
+ }
+ }
+ if { $success } {
+ # upate search_keywords
+ db_dml update_search_keywords "update ec_products set search_keywords = :search_keywords where product_id = :product_id"
+ }
+ return $success
+}