我所拥有的是一个拥有多个不同用户角色的网站。通常只有管理员和用户。我有多个不同的用户(零售,贸易等)。
客户想要的是,每件产品都有单独的运费。用户的实际成本不同(因此,如果零售价为10美元,则交易运费可能为8美元)。如果选择了多个产品,则第一个产品将100%发货,每个附加产品将发货50%。此价格根据客户的送货地点而有所不同。它也根据项目的类别而有所不同(例如,他们有座位类别和鱼箱类别。座位类别可能是15美元,鱼箱可能是17美元。
我的想法是每个类别都有自己的运输类别,然后运输方式只是位置。这样可以正常工作,但棘手的部分是如何根据用户登录进行调整。我给出的价格与零售运输和贸易运输之间的差异一致(贸易运输总是零售运输的80%)。
基本上,如果我能找到运费计算的位置,那将是多么美妙的事情。这样我可以测试用户是否是交易客户并将值更改为实际值* .80,否则该值是正常的。
如果你们中的任何一个人都没有时间帮助我,我将非常感激。
答案 0 :(得分:4)
基本上,如果我能找到它的话,那将是多么伟大的事情 运费计算完成。
计算在Spree::Calculator::Shipping
类(FlatRate
,'PerItem`等)中完成 - 请检查source。
你可能想要自定义计算器(或装饰现有方法),所以在models/spree/calculator/shipping/my_custom_method.rb
中添加文件:
module Spree
module Calculator::Shipping
class MyCustomMethod < ShippingCalculator
preference :amount, :decimal, default: 0
preference :something_i_need, :string, default: :foo #and so on, those preferences will be ready to set/change in admin panel
def self.description
Spree.t(:my_custom_method) # just a label
end
# here is where magic happens
def compute_package(package)
package.order.shipment_total
end
end
end
end
正如您所看到的,在compute_package
对象上调用方法package
,该对象有几种有用的方法(source),但您可以直接调用package.order
来获取所有line_items
shipments
1}},user
,订单initializers/shipping_methods.rb
以及计算有效金额所需的所有内容。
如果您想创建新方法,请不要忘记将其注册,以便它显示在管理面板中,以便您可以更改设置 - 当然,如果您愿意,可以以编程方式执行此操作:
Rails.application.config.spree.calculators.shipping_methods << Spree::Calculator::Shipping::MyCustomMethod
:
SentMessageTableViewCell *sentMessageCell;
sentMessageCell = [tableView dequeueReusableCellWithIdentifier:@"SentChatMessage"];
if(sentMessageCell == nil)
{
NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"SentChatMessage" owner:self options:nil];
sentMessageCell = [topLevelObjects objectAtIndex:0];
}
sentMessageCell.message = message.body;
[sentMessageCell initWithMessage:message.body andDateTimeStamp:sendDateTimeStamp];
return sentMessageCell;
答案 1 :(得分:0)
好的,这就是我到目前为止所做的。
在app / models / spree / calculator / shipping / per_item.rb中 (我从\ vendor \ bundle \ ruby \ 1.9.1 \ gems \ spree_core-2.4.7 \ app \ models \ spree \ calculator \ shipping \ per_item.rb复制的狂欢标准模型)
require_dependency spree/shipping_calculator
module Spree
module Calculator::Shipping
class PerItem < ShippingCalculator
preference :amount, :decimal, default: 0
preference :currency, :string, default: ->{ Spree::Config[:currency] }
def self.description
Spree.t(:shipping_flat_rate_per_item)
end
def compute_package(package)
if package.contents.sum(&:quantity) > 1
compute_from_multiple(package.contents.sum(&:quantity))
else
compute_from_single(package.contents.sum(&:quantity))
end
end
def compute_from_multiple(quantity)
(self.preferred_amount / 2) + ((self.preferred_amount * quantity) / 2
end
def compute_from_single(quantity)
self.preferred_amount * quantity
end
end
这将测试购物车中的商品数量,如果超过1,则会一件商品100%发货,其余50%发货。
我现在无法弄清楚如何访问当前用户。
例如
if current_spree_user.has_spree_role?("admin")
(self.preferred_amount / 2) + ((self.preferred_amount * quantity) / 2)
else
((self.preferred_amount / 2) + ((self.preferred_amount * quantity) / 2)) * 0.87
end
这会出错:
undefined local variable or method `spree_current_user'
有谁知道如何在模型中检查当前用户???