diff --git a/app/assets/javascripts/store/solr_sort_by.js.coffee b/app/assets/javascripts/store/solr_sort_by.js.coffee new file mode 100644 index 0000000..04a248d --- /dev/null +++ b/app/assets/javascripts/store/solr_sort_by.js.coffee @@ -0,0 +1,3 @@ +$ -> + $('#product_sort_by').change -> + window.location.href = @value \ No newline at end of file diff --git a/app/helpers/spree/base_helper_decorator.rb b/app/helpers/spree/base_helper_decorator.rb index ccbcc75..e826786 100644 --- a/app/helpers/spree/base_helper_decorator.rb +++ b/app/helpers/spree/base_helper_decorator.rb @@ -6,4 +6,11 @@ def link_to_facet(name, value, count) request.params.delete(:page) link_to("#{value} (#{count})", url_for(request.params.merge({:facets => facets_hash}))) end + + # hate to clutter up teh BaseHelper with this one-time + def sort_by_options_list + # generate list + options = ::PRODUCT_SORT_FIELDS.map { |k, v| [t(k), url_for(request.params.merge({:sort => k}))] } + options_for_select(options, url_for(request.params.merge({ :sort => params[:sort] || ::PRODUCT_SORT_FIELDS.keys.first }))) + end end diff --git a/app/views/spree/products/_sort_bar.html.erb b/app/views/spree/products/_sort_bar.html.erb new file mode 100644 index 0000000..e99e20f --- /dev/null +++ b/app/views/spree/products/_sort_bar.html.erb @@ -0,0 +1 @@ +
Sort by: <%= select_tag("product_sort_by", sort_by_options_list) %>
\ No newline at end of file diff --git a/config/initializers/solr_config.rb b/config/initializers/solr_config.rb index 61db128..263035e 100644 --- a/config/initializers/solr_config.rb +++ b/config/initializers/solr_config.rb @@ -11,3 +11,14 @@ PRODUCT_SOLR_FACETS = [:price_range, :taxon_names, :brand_property, :color_option, :size_option] end + +unless defined?(PRODUCT_SORT_FIELDS) + PRODUCT_SORT_FIELDS = { + "price_asc" => ["spree_variants.price", "asc"], + "price_desc" => ["spree_variants.price", "desc"], + "date_asc" => ["spree_products.available_on", "asc"], + "date_desc" => ["spree_products.available_on", "desc"], + "name_asc" => ["spree_products.name", "asc"], + "name_desc" => ["spree_products.name", "desc"] + } +end \ No newline at end of file diff --git a/lib/spree/search/solr.rb b/lib/spree/search/solr.rb index dc5d2e3..20846bb 100644 --- a/lib/spree/search/solr.rb +++ b/lib/spree/search/solr.rb @@ -8,10 +8,18 @@ def get_products_conditions_for(base_scope, query) :browse => @properties[:facets_hash].map{|k,v| "#{k}:#{v}"}, :zeros => false } + search_options = {:facets => facets, :limit => 25000, :lazy => true} - if order_by_price - search_options.merge!(:order => (order_by_price == 'descend') ? "price desc" : "price asc") + + # if order_by_price + # search_options.merge!(:order => (order_by_price == 'descend') ? "price desc" : "price asc") + # end + + if not @properties[:sort].nil? and PRODUCT_SORT_FIELDS.has_key? @properties[:sort] + sort_option = ::PRODUCT_SORT_FIELDS[@properties[:sort]] + base_scope = base_scope.order("#{sort_option[0]} #{sort_option[1].upcase}") end + full_query = query + " AND is_active:(true)" if taxon taxons_query = taxon.self_and_descendants.map{|t| "taxon_ids:(#{t.id})"}.join(" OR ") @@ -27,22 +35,25 @@ def get_products_conditions_for(base_scope, query) @properties[:products] = products @properties[:suggest] = nil begin - if suggest = result.suggest - suggest.sub!(/\sAND.*/, '') - @properties[:suggest] = suggest if suggest != query - end + if suggest = result.suggest + suggest.sub!(/\sAND.*/, '') + @properties[:suggest] = suggest if suggest != query + end rescue + end @properties[:facets] = parse_facets_hash(result.facets) base_scope.where(["spree_products.id IN (?)", products.map(&:id)]) + # base_scope.order("spree_products.name DESC") end def prepare(params) super @properties[:facets_hash] = params[:facets] || {} @properties[:manage_pagination] = false - @properties[:order_by_price] = params[:order_by_price] + @properties[:sort] = params[:sort] || nil + # @properties[:order_by_price] = params[:order_by_price] end private diff --git a/lib/spree_solr_search.rb b/lib/spree_solr_search.rb index 2cf71ad..f038285 100644 --- a/lib/spree_solr_search.rb +++ b/lib/spree_solr_search.rb @@ -5,6 +5,8 @@ module Spree::SolrSearch module SpreeSolrSearch class Engine < Rails::Engine + engine_name 'spree_solr_search' + initializer "spree.solr_search.preferences", :after => "spree.environment" do |app| Spree::SolrSearch::Config = Spree::SolrSearchConfiguration.new Spree::Config.searcher_class = Spree::Search::Solr