From 1207062f7cd28fae836ac3ec9b4e97768146970c Mon Sep 17 00:00:00 2001 From: Rohan Mitchell Date: Wed, 20 Jun 2012 14:20:07 +1000 Subject: [PATCH] Filter products by distributor --- app/models/spree/taxon_decorator.rb | 8 +++++++ app/views/spree/shared/_filters.html.erb | 28 ++++++++++++++++++++++++ config/initializers/spree.rb | 5 +++++ lib/spree/product_filters.rb | 21 ++++++++++++++++++ spec/lib/spree/product_filters_spec.rb | 10 +++++++++ 5 files changed, 72 insertions(+) create mode 100644 app/models/spree/taxon_decorator.rb create mode 100644 app/views/spree/shared/_filters.html.erb create mode 100644 lib/spree/product_filters.rb create mode 100644 spec/lib/spree/product_filters_spec.rb diff --git a/app/models/spree/taxon_decorator.rb b/app/models/spree/taxon_decorator.rb new file mode 100644 index 0000000000..66a419978e --- /dev/null +++ b/app/models/spree/taxon_decorator.rb @@ -0,0 +1,8 @@ +Spree::Taxon.class_eval do + # Indicate which filters should be used for this taxon + def applicable_filters + fs = [] + fs << Spree::ProductFilters.distributor_filter if Spree::ProductFilters.respond_to? :distributor_filter + fs + end +end diff --git a/app/views/spree/shared/_filters.html.erb b/app/views/spree/shared/_filters.html.erb new file mode 100644 index 0000000000..da86fcaaf9 --- /dev/null +++ b/app/views/spree/shared/_filters.html.erb @@ -0,0 +1,28 @@ +<% filters = @taxon ? @taxon.applicable_filters : [Spree::ProductFilters.distributor_filter] %> +<% unless filters.empty? %> + <%= form_tag '', :method => :get, :id => 'sidebar_products_search' do %> + <% params[:search] ||= {} %> + <%= hidden_field_tag 'per_page', params[:per_page] %> + <% filters.each do |filter| %> + <% labels = filter[:labels] || filter[:conds].map {|m,c| [m,m]} %> + <% next if labels.empty? %> + + <% end %> + <%= submit_tag t(:search), :name => nil %> + <% end %> +<% end %> diff --git a/config/initializers/spree.rb b/config/initializers/spree.rb index be19f36a72..2f4632a8e2 100644 --- a/config/initializers/spree.rb +++ b/config/initializers/spree.rb @@ -5,6 +5,11 @@ # # In order to initialize a setting do: # config.setting_name = 'new value' + + +require 'spree/product_filters' + + Spree.config do |config| # Example: # Uncomment to override the default site name. diff --git a/lib/spree/product_filters.rb b/lib/spree/product_filters.rb new file mode 100644 index 0000000000..8cc8e60387 --- /dev/null +++ b/lib/spree/product_filters.rb @@ -0,0 +1,21 @@ +module Spree + module ProductFilters + if Spree::Distributor.table_exists? + Spree::Product.scope :distributor_any, + lambda {|*opts| + conds = opts.map {|o| ProductFilters.distributor_filter[:conds][o]}.reject {|c| c.nil?} + Spree::Product.joins(:distributors).conditions_any(conds) + } + + def ProductFilters.distributor_filter + distributors = Spree::Distributor.all.map(&:name).compact.uniq + conds = Hash[*distributors.map { |d| [d, "#{Spree::Distributor.table_name}.name = '#{d}'"] }.flatten] + { :name => "Distributor", + :scope => :distributor_any, + :conds => conds, + :labels => (distributors.sort).map { |k| [k, k] } + } + end + end + end +end diff --git a/spec/lib/spree/product_filters_spec.rb b/spec/lib/spree/product_filters_spec.rb new file mode 100644 index 0000000000..29c7d2c688 --- /dev/null +++ b/spec/lib/spree/product_filters_spec.rb @@ -0,0 +1,10 @@ +require 'spec_helper' + +describe Spree::ProductFilters do + context "distributor filter" do + it "provides filtering for all distributors" do + 3.times { create(:distributor) } + Spree::ProductFilters.distributor_filter[:labels].should == Spree::Distributor.all.map { |d| [d.name, d.name] } + end + end +end