我可以使用Magento实现以下目标:
我正在使用价格与目的地的表费率系统。我有一个购物车价格规则免费送货的产品属性free_shipping - >设置是。
如果你在篮子里有正常的产品或在篮子里免费送货产品,这种方法很好。但是,如果您同时拥有正常产品和免费送货产品。它根据订单总额计算运费,包括免费送货的产品。
如何更正此问题,因此当两种产品都存在于购物篮中时,运费仅适用于不包括免费送货的产品订单总数?
这是否有Magento插件?提前谢谢。
答案 0 :(得分:2)
在您的销售规则中,将免费送货设置为“仅限于匹配项目”。
答案 1 :(得分:2)
我遇到了同样的问题并实施了一个小代码更改以使其正常工作。
基本上忘记了促销规则。禁用它。在将免费送货应用于单个商品时,它似乎无法与运费表一起正常工作。运输规则似乎优先,并根据购物车总数计算。
诀窍是在运费模块进行计算时从购物车总额中减去免运费项目。
在我的情况下,特定类别(id:15)内的所有内容都是免费的。但您可以修改逻辑以满足您的需求。
您需要修改以下文件(或将其复制到本地代码库以正确执行操作)。
应用\代码\核心\法师\邮费\模型\载波\ Tablerate.php
改变这一点:
public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
if (!$this->getConfigFlag('active')) {
return false;
}
// exclude Virtual products price from Package value if pre-configured
if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {
foreach ($request->getAllItems() as $item) {
if ($item->getParentItem()) {
continue;
}
if ($item->getHasChildren() && $item->isShipSeparately()) {
foreach ($item->getChildren() as $child) {
if ($child->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
}
}
} elseif ($item->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
}
}
}
对此:
public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
if (!$this->getConfigFlag('active')) {
return false;
}
// exclude Virtual products price from Package value if pre-configured
//And Exclude items which should have Free Shipping
if (!$this->getConfigFlag('include_virtual_price') && $request->getAllItems()) {
$freeshipping_category_id = 15;
foreach ($request->getAllItems() as $item) {
if ($item->getParentItem()) {
continue;
}
if ($item->getHasChildren() && $item->isShipSeparately()) {
foreach ($item->getChildren() as $child) {
if ($child->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
}
//If it's in the free shipping, remove it's value from the basket
$arr_category_ids = $child->getProduct()->getCategoryIds();
if ( in_array($freeshipping_category_id, $arr_category_ids) ) {
$request->setPackageValue($request->getPackageValue() - $child->getBaseRowTotal());
}
}
} elseif ($item->getProduct()->isVirtual()) {
$request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
}
//If it's in the free shipping category, remove it's value from the basket
$arr_category_ids = $item->getProduct()->getCategoryIds();
if ( in_array($freeshipping_category_id, $arr_category_ids) ) {
$request->setPackageValue($request->getPackageValue() - $item->getBaseRowTotal());
}
}
}
答案 2 :(得分:1)
如果我理解你的问题,解决方案非常简单快捷,我就是这样解决的:
在文件中:Validator.php(/ app / code / core / Mage / SalesRule / Model /) 在“break”之前搜索字符串“case Mage_SalesRule_Model_Rule :: FREE_SHIPPING_ITEM:”添加这个简单的东西“$ item-> setWeight(0);”
这将强制项目的重量为0,因此不会计算运费价格,如果您禁用帽子项目的免费送货选项,则会考虑重量并且一切正常。
答案 3 :(得分:0)
我知道这个问题已得到回答和接受,但我想提供一种方法来做到这一点,无需编程,或者尽可能改变核心文件
如果您要将商品创建为“虚拟”商品,则可以从运费中排除虚拟商品
如果已创建项目
使用phpMyAdmin等程序转到您的数据库并导航至catalog_product_entity
,找到您的产品SKU并将type_id
更改为virtual
如果未创建项目
在产品创建的第一步(而不是Virtual Product
或Simple Product
等)中将项目设为Bundled Product
。
从运费中排除Virtual Products
导航至System > Configuration > Shipping Methods
并在Table Rates
标题集Include Virtual Products in Price Calculation
下否
Table Rates
送货方式