Index: openacs-4/packages/search/www/search.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/search/www/search.tcl,v diff -u -r1.18 -r1.19 --- openacs-4/packages/search/www/search.tcl 12 Jun 2005 21:21:51 -0000 1.18 +++ openacs-4/packages/search/www/search.tcl 8 Nov 2005 18:24:08 -0000 1.19 @@ -9,6 +9,9 @@ {num:integer 0} {dfs:trim ""} {dts:trim ""} + {search_package_id ""} + {scope ""} + {object_type "all"} } set page_title "Search Results" @@ -23,20 +26,34 @@ set user_id [ad_conn user_id] set driver [ad_parameter -package_id $package_id FtsEngineDriver] -array set info [acs_sc_call FtsEngineDriver info [list] $driver] +if {[callback::impl_exists -impl $driver -callback search::driver_info]} { + array set info [lindex [callback -impl $driver search::driver_info] 0] +# array set info [list package_key intermedia-driver version 1 automatic_and_queries_p 1 stopwords_p 1] +} else { + array set info [acs_sc_call FtsEngineDriver info [list] $driver] +} +set dotlrn_package_id [dotlrn::get_package_id] +set is_guest_p [search::is_guest_p] +# Ugly .LRNism: guests must not search for people. Here's the security +# check that makes sure they cannot fiddle around with the URL +if {$is_guest_p && [string equal $object_type "phb_person"]} { + ad_return_error "Security Breakin!" "Security Alert. This incident has been logged." +} if { [array get info] == "" } { ReturnHeaders ns_write "[_ search.lt_FtsEngineDriver_not_a]" ad_script_abort } -if {[string is space $q] } { +if {[string equal "" [string trim $q]]} { set query {} set empty_p 1 set url_advanced_search "advanced-search" - ad_return_template + ad_return_template + # FIXME DAVEB I don't understand why I can't call ad_script_abort here instead of return.... + # if I call ad_script_abort the adp is never rendered return } else { set empty_p 0 @@ -68,7 +85,7 @@ set dt [db_exec_plsql get_dt "select now() + '$symbol2interval($dts)'::interval"] } -set q [string tolower $q] +#set q [string tolower $q] set urlencoded_query [ad_urlencode $q] if { $offset < 0 } { set offset 0 } @@ -82,9 +99,24 @@ } set t0 [clock clicks -milliseconds] + +# TODO calculate subsite or dotlrn package_ids +if {![string equal "this" $scope]} { + # don't send package_id if its not searching this package + set search_package_id "" +} else { + set search_node_id [site_node::get_node_id_from_object_id -object_id $search_package_id] + if {[string equal "dotlrn" [site_node::get_element -node_id $search_node_id -element package_key]]} { + set search_package_id [site_node::get_children -node_id $search_node_id -element package_id] + } +} + if {[callback::impl_exists -impl $driver -callback search::search]} { # DAVEB TODO Add subsite to the callback def? - array set result [lindex [callback -impl $driver search::search -query $q -offset $offset -limit $limit -user_id $user_id -df $df] 0] + # FIXME do this in the intermedia driver! +# set final_query_string [db_string final_query_select "select site_wide_search.im_convert(:q) from dual"] + + array set result [lindex [callback -impl $driver search::search -query $q -offset $offset -limit $limit -user_id $user_id -df $df -package_ids $search_package_id -object_type $object_type] 0] } else { array set result [acs_sc_call FtsEngineDriver search $params $driver] } @@ -93,7 +125,11 @@ if { $t == "Feeling Lucky" && $result(count) > 0} { set object_id [lindex $result(ids) 0] set object_type [acs_object_type $object_id] - set url [acs_sc_call FtsContentProvider url [list $object_id] $object_type] + if {[callback::impl_exists -impl -callback search::url]} { + set url [callback -impl $object_type search::url -object_id $object_id] + } else { + set url [acs_sc_call FtsContentProvider url [list $object_id] $object_type] + } ad_returnredirect $url ad_script_abort } @@ -126,13 +162,22 @@ set object_id [lindex $result(ids) $__i] set object_type [acs_object_type $object_id] - ns_log notice "\n------\nDAVEB search\n object_id='${object_id}' object_type='${object_type}'\n-----\n" - array set datasource [acs_sc_call FtsContentProvider datasource [list $object_id] $object_type] + if {[callback::impl_exists -impl $object_type -callback search::datasource]} { + array set datasource [lindex [callback -impl $object_type search::datasource -object_id $object_id] 0] + set url_one [lindex [callback -impl $object_type search::url -object_id $object_id] 0] + } else { + ns_log notice "SEARCH search/www/search.tcl callback::datasource::${object_type} not found" + array set datasource [acs_sc_call FtsContentProvider datasource [list $object_id] $object_type] + set url_one [acs_sc_call FtsContentProvider url [list $object_id] $object_type] + } search::content_get txt $datasource(content) $datasource(mime) $datasource(storage_type) - set title_summary [acs_sc_call FtsEngineDriver summary [list $q $datasource(title)] $driver] - set txt_summary [acs_sc_call FtsEngineDriver summary [list $q $txt] $driver] - set url_one [acs_sc_call FtsContentProvider url [list $object_id] $object_type] - + if {[callback::impl_exists -impl $driver -callback search::summary]} { + set title_summary [lindex [callback -impl $driver search::summary -query $q -text $datasource(title)] 0] + set txt_summary [lindex [callback -impl $driver search::summary -query $q -text $txt] 0] + } else { + set title_summary [acs_sc_call FtsEngineDriver summary [list $q $datasource(title)] $driver] + set txt_summary [acs_sc_call FtsEngineDriver summary [list $q $txt] $driver] + } template::multirow append searchresult $title_summary $txt_summary $url_one } @@ -180,4 +225,3 @@ } set choice_bar [search::choice_bar $items $links $values $current_result_page] -