0

我正在为客户开发 Magento 店面。他们使用 dropshippers,因此单个邮政编码对我们没有多大帮助。我们确实为客户发货的最常见的邮政编码设置了它,因此,在许多情况下,它是可以的。

但是,在某些情况下,需要使用不同的原产地邮政编码。在更罕见的情况下,我们将有多个来源邮政编码。当有一个不同于主要的 zip 时,我们将其存储在一个名为“origin zip”的属性中(创意,是吗?)

我应该在哪里进行修改?我们只使用 UPS 运输方式,而我要做的是,在计算运输之前,抓取购物车中可能存在的任何原产地拉链(我想我们已经有了这部分),但随后,取决于结果,我可能需要遍历运输计算并将这些值加在一起 ​​- 即,如果他们订购了一个具有原始邮政编码的产品,而另一个没有原始邮政编码的产品,则必须计算第一个,然后第二个,然后将它们加在一起。

如果有人能指出我们需要修改哪些 php 文件或类的正确方向,我将不胜感激。

4

2 回答 2

1

首先,您需要将自定义属性添加到将在购物车中使用的属性列表。按照stackoverflow上的这些答案: 如何在magento 1.4.1.1中将自定义上传的图像添加到购物车?

然后您需要创建您的自定义运输方式,可能是从您的方式扩展而来。它应该遍历从运输请求中收到的物品并检查不同的 zip 来源,然后分别计算它们的费率。

我希望对您来说,创建一个扩展现有运输方式功能的模块不会有问题。

干杯!

更新 要将您的属性添加到购物车项目中加载的产品,请使用以下配置:

<config>
     <global>
          <sales>
               <quote>
                    <item>
                        <product_attributes>
                             <origin_zip />
                        </product_attributes>
                    </item>
               </quote>
          </sales>
     </global>
</config>

然后在运输方法模型中使用类似这样的东西(以 USPS 为例):

public function collectRates(Mage_Shipping_Model_Rate_Request $request)
{
    if (!$this->getConfigFlag('active')) {
        return false;
    }

    $defaultOriginZip = Mage::getStoreConfig('shipping/origin/postcode', $this->getStore());

    $requestDataByOriginZip = array();
    // Walking through quote items
    foreach ($request->getAllItems() as $quoteItem) {
        // If virtual or not shippable separately, it should be skipped
        if ($quoteItem->isVirtual() || $quoteItem->isDummy(true)) {
            continue;
        }
        // Retrieving origin zip code
        if ($quoteItem->getProduct()->getOriginZip()) {
            $zipCodeForCalculation = $quoteItem->getProduct()->getOriginZip();
        } else {
            $zipCodeForCalculation = $defaultOriginZip;
        }

        if (!isset($requestDataByOriginZip[$zipCodeForCalculation])) {
            // Default values initialization for this zip code
            $requestDataByOriginZip[$zipCodeForCalculation] = array(
                'orig_postcode' => $zipCodeForCalculation,
                'package_weight' => 0,
                'package_value' => 0,
                // etc...
            );
        }

        $requestDataByOriginZip[$zipCodeForCalculation]['package_weight'] += $quoteItem->getRowWeight();
        $requestDataByOriginZip[$zipCodeForCalculation]['package_value'] += $quoteItem->getBaseRowTotal();
        // Etc...
    }

    $results = array();
    foreach ($requestDataByOriginZip as $requestData) {
       $requestByZip = clone $request; // Cloning to prevent changing logic in other shipment methods.
       $requestByZip->addData($requestData);
       $this->setRequest($requestByZip);
       // Returns rate result for current request
       $results[] = $this->_getQuotes();
    }

    $yourMergedResult = Mage::getModel('shipping/rate_result');

    foreach ($results as $result) {
       // Logic for merging the rate prices....
    }

    return $yourMergedResult;
}
于 2011-04-14T19:45:28.907 回答
1

usa/shipping_ups是处理这些请求的,特别是该方法setRequest似乎有你需要的东西:

    if ($request->getOrigPostcode()) {
        $r->setOrigPostal($request->getOrigPostcode());
    } else {
        $r->setOrigPostal(Mage::getStoreConfig('shipping/origin/postcode', $this->getStore()));
    }  

如果您可以将 orig_postcode 添加到运输请求,UPS 将根据该来源返回报价。

一种方法是覆盖Mage_Shipping_Model_Rate_Request并添加一个名为getOrigPostcode. 由于是一个真实的方法,这将覆盖默认的 Magento getter/setter 行为。让此方法查询请求的内容以找出需要使用的 zip。

希望有帮助!

谢谢,乔

于 2011-04-14T19:55:32.243 回答