2013-02-13 10 views
9

Używam Spree 1.3.1 i próbuję dostosować stronę show Taxon.Filtr wyszukiwania Szprew dla właściwości i wariantów

Chciałbym, aby zwróciła produkty zawarte w bieżącym Taxonie, ewentualnie przefiltrowane przez nieruchomość lub wartość opcji.

Załóżmy na przykład, że widzę Taxon kolekcji bielizny. Chciałbym odfiltrować pokazane produkty, podając określony rozmiar (option_type). W tym przypadku powinienem wymienić tylko produkty, które mają warianty o żądanym rozmiarze.

Chciałbym również móc filtrować produkty według właściwości "dopasowanie". Filtrowanie według dopasowania poślizgu, powinienem być w stanie wymienić tylko produkty wewnątrz obecnego Taxona, które mają wymaganą właściwość.

To Taxon kontroler pokaz działania:

Spree::TaxonsController.class_eval do 

    def show 
     @taxon = Spree::Taxon.find_by_permalink!(params[:id]) 
     return unless @taxon 

     @searcher = Spree::Config.searcher_class.new(params) 
     @searcher.current_user = try_spree_current_user 
     @searcher.current_currency = current_currency 
     @products = @searcher.retrieve_products 

     respond_with(@taxon) 
    end 


end 

jaki sposób należy go zmodyfikować, aby pasowały do ​​moich potrzeb?

Odpowiedz

7

Częściowo rozwiązałem pytanie.

I okazało się, że muszę opuścić kontrolera, jak to jest, magia jest wykonywana w pliku lib/Spree/product_filters.rb gdzie dodało ten nowy filtr produktów:

if Spree::Property.table_exists? 
    Spree::Product.add_search_scope :fit_any do |*opts| 
     conds = opts.map {|o| ProductFilters.fit_filter[:conds][o]}.reject {|c| c.nil?} 
     scope = conds.shift 
     conds.each do |new_scope| 
     scope = scope.or(new_scope) 
     end 
     Spree::Product.with_property("fit").where(scope) 
    end 

    def ProductFilters.fit_filter 
     fit_property = Spree::Property.find_by_name("fit") 
     fits = Spree::ProductProperty.where(:property_id => fit_property).pluck(:value).uniq 
     pp = Spree::ProductProperty.arel_table 
     conds = Hash[*fits.map { |b| [b, pp[:value].eq(b)] }.flatten] 
     { :name => "Fits", 
     :scope => :fit_any, 
     :conds => conds, 
     :labels => (fits.sort).map { |k| [k, k] } 
     } 
    end 
    end 

Potem dodanej nowy filtr do modelu Taxon dekorator z tym:

Spree::Taxon.class_eval do 

    def applicable_filters 
    fs = [] 
    fs << Spree::Core::ProductFilters.fit_filter if Spree::Core::ProductFilters.respond_to?(:fit_filter) 
    fs 
    end 


end 

Jeszcze nie znalazłem się, jak utworzyć filtr dla wariantów, które mają określoną wartość opcji.

3

Mówisz o filtrowanie wartości liczbowej, pisałem filtr dla zakresów opcji:

def ProductFilters.ov_range_test(range1, range2) 
    ov = Arel::Table.new("spree_option_values") 
    cast = Arel::Nodes::NamedFunction.new "CAST", [ ov[:presentation].as("integer")] 
    comparaisons = cast.in(range1..range2) 
    comparaisons 
end 

Spree::Product.add_search_scope :screenSize_range_any do |*opts| 
    conds = opts.map {|o| Spree::ProductFilters.screenSize_filter[:conds][o]}.reject {|c| c.nil?} 
    scope = conds.shift 
    conds.each do |new_scope| 
    scope = scope.or(new_scope) 
    end 
    option_values=Spree::OptionValue.where(scope).joins(:option_type).where(OptionType.table_name => {:name => "tailleEcran"}).pluck("#{OptionValue.table_name}.id") 
    Spree::Product.where("#{Product.table_name}.id in (select product_id from #{Variant.table_name} v left join spree_option_values_variants ov on ov.variant_id = v.id where ov.option_value_id in (?))", option_values) 
end 

def ProductFilters.screenSize_filter 
    conds = [ [ "20p ou moins",ov_range_test(0,20)], 
    [ "20p - 30p",ov_range_test(20,30)], 
    [ "30p - 40p" ,ov_range_test(30,40)], 
    [ "40p ou plus",ov_range_test(40,190)]] 
    { :name => "taille", 
    :scope => :screenSize_range_any, 
    :options => :tailleEcran, 
    :conds => Hash[*conds.flatten], 
    :labels => conds.map {|k,v| [k,k]} 
    } 
end 

Można zobaczyć ten jeden też dla określonych wartości dyskretnych: https://gist.github.com/Ranger-X/2511088

+0

Hi guys. Czy jest jakiś dokument mówiący o tym zwyczaje. Dzięki :) . Przeczytałem twoją odpowiedź, ale nie mogę zrozumieć, jak ją zdefiniowałem –

Powiązane problemy