所以我正在与 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
我试图抛出的所有东西要么破坏它,要么不断显示没有产品的选项......在这里真的很茫然。