2013-02-13 3 views
9

Sto utilizzando Spree 1.3.1 e sto tentando di personalizzare la pagina di presentazione Taxon.Filtro di ricerca spree per proprietà e varianti

Mi piacerebbe che restituisse i prodotti contenuti nel Taxon corrente, eventualmente filtrati da una proprietà o da un valore di opzione.

Per esempio diciamo che sto vedendo il Taxon di una collezione di biancheria intima. Mi piacerebbe filtrare i prodotti mostrati, fornendo una certa dimensione (option_type). In questo caso dovrei elencare solo i prodotti che hanno varianti con la dimensione richiesta.

Vorrei anche poter filtrare i prodotti con la proprietà "fit". Filtrando per adattamento, dovrei essere in grado di elencare solo i prodotti all'interno del Taxon corrente che hanno la proprietà richiesta.

Questo è il Taxon regolatore azione Mostra:

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 

Come dovrei modificarlo secondo le mie esigenze?

risposta

7

Ho parzialmente risolto la domanda.

ho scoperto che ho bisogno di lasciare il controller così com'è, la magia è fatta nel file lib/Spree/product_filters.rb in cui ho aggiunto questo nuovo filtro di prodotto:

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 

Poi ho aggiunto il nuovo filtro al modello Taxon decoratore con questo:

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 

Ancora non ho trovato il modo di creare un filtro per le varianti che hanno un valore di un'opzione specifica.

3

Lei parla di filtraggio sul valore numerico, ho scritto un filtro per i campi opzionali:

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 

Si può vedere anche questo, per i valori specifici discreti: https://gist.github.com/Ranger-X/2511088

+0

Hi guys. C'è qualche baldoria di documenti che dice di questa usanza. Grazie :) . Leggo la tua risposta ma non riesco a capire come la definisco –