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());
}
}
}
4条答案
按热度按时间6ljaweal1#
我遇到了同样的问题,并实现了一个小的代码更改,使其工作。
基本上忘记了促销规则。禁用它。它似乎不能正常工作时,适用于免费送货到个别项目的运费表。航运规则似乎优先和计算的基础上购物车总额。
诀窍是在运费模块进行计算时,从购物车总额中减去免费送货项目。
在我的例子中,在一个特定类别(id:15)中的所有东西都是免费送货的,但是你可以修改逻辑来满足你的需要。
您需要修改以下文件(或将其复制到本地代码库以正确执行操作)。
app\code\core\Mage\Shipping\Model\Carrier\Tablerate.php
更改:
对此:
w46czmvw2#
在您的销售规则中,将“免费送货”设置为“仅限匹配的物品”。
xtupzzrd3#
如果我没理解错你的问题,解决方案真的很容易和快速,这里是我如何解决它:
在文件中:php(/app/code/core/ Mage /SalesRule/Model/)搜索字符串“case Mage_SalesRule_Model_Rule::FREE_SHIPPING_ITEM:“以及“break;“添加这个简单的东西“$item-〉setWeight(0);“
这将迫使该项目的重量为0,所以没有航运价格将计算它,如果您禁用免费送货选项的帽子项目,重量是考虑和一切工作正常。
z9zf31ra4#
我知道这个问题已经得到了回答和接受,但是我想提供一种方法,如果可能的话,不需要编程或更改核心文件就可以做到这一点
如果您想将物品创建为“虚拟”物品,您可以将虚拟物品排除在运费之外
如果项目已创建
使用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
运输方式,也仅适用于此运输方式