2013-02-13 12 views
9

मैं स्प्री 1.3.1 चला रहा हूं और मैं टैक्सन शो पेज को कस्टमाइज़ करने की कोशिश कर रहा हूं।गुणों और प्रकारों के लिए स्प्री खोज फ़िल्टर

मैं वर्तमान टैक्सन के अंदर मौजूद उत्पादों को वापस लौटना चाहता हूं, अंत में एक संपत्ति द्वारा या एक विकल्प मूल्य द्वारा फ़िल्टर किया गया।

उदाहरण के लिए मान लें कि मैं अंडरवियर संग्रह का टैक्सन देख रहा हूं। मैं एक निश्चित आकार (option_type) प्रदान करके दिखाए गए उत्पादों को फ़िल्टर करना चाहता हूं। इस मामले में मुझे केवल उन उत्पादों को सूचीबद्ध करना चाहिए जिनके पास अनुरोधित आकार के साथ वेरिएंट हैं।

मैं भी "फिट" संपत्ति द्वारा उत्पादों को फ़िल्टर करने में सक्षम होना चाहता हूं। पर्ची फिट द्वारा फ़िल्टरिंग, मुझे केवल मौजूदा टैक्सन के अंदर उत्पादों को सूचीबद्ध करने में सक्षम होना चाहिए जिनके पास आवश्यक संपत्ति है।

इस टैक्सोन नियंत्रक शो कार्रवाई है:

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 

कैसे मैं इसे अपने आवश्यकताओं के अनुसार संशोधित करना चाहिए?

उत्तर

7

मैंने आंशिक रूप से प्रश्न हल किया।

मुझे पता चला कि मैं नियंत्रक छोड़ने के लिए के रूप में यह, जादू lib/होड़/product_filters.rb फ़ाइल जहाँ मैं इस नए उत्पाद फिल्टर जोड़ा में किया जाता है की जरूरत है:

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 

तो मैं जोड़ा इस के साथ टैक्सोन मॉडल डेकोरेटर के लिए नए फिल्टर:

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 

फिर भी मैं बाहर नहीं मिला है वेरिएंट कोई विशिष्ट विकल्प मान वाले के लिए एक फ़िल्टर बनाने का तरीका।

3

आप संख्यात्मक मान को फ़िल्टर के बारे में बात करते हैं, मैं विकल्प पर्वतमाला के लिए एक फिल्टर लिखा है:

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 

तुम भी इस एक देख सकते हैं, असतत विशिष्ट मानों के लिए: https://gist.github.com/Ranger-X/2511088

+0

हाय दोस्तों। क्या इस रिवाज के बारे में कोई दस्तावेज है। धन्यवाद :) । मैंने आपका जवाब पढ़ा लेकिन मैं समझ नहीं पा रहा हूं कि मैं कैसे परिभाषित करता हूं –

संबंधित मुद्दे