1

我正在编写一个 Spree 扩展程序,以允许购物车/订单中的某些项目相互链接。

“镶嵌”产品可以与“中心石”产品相关联。最终,将有强制执行哪些事物可以相互引用的约束,但这并不重要。

以下是我如何更改 LineItem 以包含自引用:

Spree::LineItem.class_eval do

    has_one :center_stone, class_name: "LineItem", foreign_key: "setting_id"
    belongs_to :setting, class_name: "LineItem"
end

...以及相应的数据库迁移:

class AddSettingRefToLineItems < ActiveRecord::Migration
  def change
    add_reference :spree_line_items, :setting, index: true, foreign_key: true
  end
end

接下来我需要完成的是修改产品页面上的“添加到购物车”表单,以便添加到购物车的商品可以与购物车中已经存在的商品相关联。我该怎么做呢?


用例示例

产品 A 和产品 B 都在我的购物车中。我正在查看产品 C 的页面。我想查看选项:

  • 添加到产品 A
  • 添加到产品 B
  • 单独加入购物车

单击这些选项中的任何一个,都会像往常一样为产品 C 创建一个 Spree::LineItem。如果单击前两个选项,我还希望产品 C 的 setting_id 的 LineItem 引用我购物车中产品 A 的 LineItem。

4

1 回答 1

0

正如所发现的,主要问题是:如何自定义 Spree 的“添加到卡片”功能。

您需要自定义视图

Deface::Override.new(:virtual_path => 'spree/products/_cart_form',
                 :name => 'centerproduct_cart_form',
                 :replace => "<what to replace>",
                 :erb => "<with what to replace>")

这应该转到您的app/overrides/centerproduct_cart_form.rb文件(您可以更改文件名,只需确保name上面代码示例中的参数也将更改为相同的值)。

您可以通过查看视图的源代码来弄清楚what to replace和部分:with what to replace

https://github.com/spree/spree/blob/master/frontend/app/views/spree/products/_cart_form.html.erb

于 2015-08-06T22:44:41.720 回答