【问题标题】:Multiple Origin Zip Codes in Magento CheckoutMagento Checkout 中的多个来源邮政编码
【发布时间】:2011-04-14 18:04:55
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: magento shipping zipcode ups


    【解决方案1】:

    首先,您需要将自定义属性添加到将在购物车中使用的属性列表中。 在stackoverflow上遵循这些答案: How to add custom uploaded images to cart in 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;
    }
    

    【讨论】:

    • 嗨,Ivan - 我明白你说的要添加它 - 我的属性是 origin_zip。我是否只使用该标识符,然后它会在购物车中可用?我将如何获得该物品?那么,我应该从哪里开始迭代购物车并获取给定产品的属性?谢谢!
    • 嗨,Ivan - 谢谢你的例子 - 你的男人。对于其他想知道的人(因为我对此感到困惑),配置不会进入运输模块 config.xml,而是进入 Checkout config.xml 文件夹。我把它和运输模块一起放进去,想知道为什么我拿不到它,但是当我把它放在结帐时,它马上就装满了。再次感谢。
    【解决方案2】:

    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。

    希望有帮助!

    谢谢, 乔

    【讨论】:

    • 嗨乔 - 好电话。我们所做的是通过 UPS 模块将其复制到我们自己的自定义运输模块中,现在我们正在努力修改邮政编码部分以适应此目的。一旦我们让它工作,我会在这里发表评论,让您(和任何其他感兴趣的人)知道我们是否能够操纵该调用以使其工作。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2011-04-11
    • 2013-01-01
    • 1970-01-01
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多