0

所以我正在与 Spree 的分支 Solidus 合作。现在我有一个颜色选项的过滤器,但是无论类别中是否启用了产品,它都会显示每种颜色。例如,我们不希望用户选择“灰色”然后看到没有灰色产品。

到目前为止,这是有效的,但没有隐藏空:

lib/spree/product_filters.rb

module Spree::Core::ProductFilters

  Spree::OptionType.where("name like '%color%'").each do |ot|
    filter_name = ot.name.underscore.parameterize

    Spree::Product.add_search_scope filter_name do |*opts|
      Spree::Product.joins(variants: :option_values).where(option_values: { presentation: opts.first })
    end

    define_singleton_method("#{filter_name}_filter") do
      conds = ot.option_values.pluck(:presentation)
      {
        name: ot.presentation,
        scope: filter_name,
        type: 'color',
        labels: conds.map { |key, _value| [key, key] }
      }
    end
  end
end

并且在

app/helpers/spree/taxon_filters_helper.rb

module Spree
  module TaxonFiltersHelper
    def applicable_filters_for(_taxon)
      dynamic_filters = Spree::OptionType.where("name like '%color%'").map { |ot| "#{ot.name.underscore.parameterize}_filter".to_sym }
      [:brand_filter, :price_filter].concat(dynamic_filters).map do |filter_name|
        Spree::Core::ProductFilters.send(filter_name) if Spree::Core::ProductFilters.respond_to?(filter_name)
      end.compact
    end
  end
end

我试图抛出的所有东西要么破坏它,要么不断显示没有产品的选项......在这里真的很茫然。

4

0 回答 0