【问题标题】:Magento Redirect Loop - Cart Controller OverideMagento 重定向循环 - 购物车控制器覆盖
【发布时间】:2013-07-08 11:37:38
【问题描述】:

我创建了一个模块,如果客户是新客户或在过去 24 小时内未订购,则可以将折扣代码添加到客户购物车中,这是为一家为员工提供午餐的公司,他们每个人都会收到一个子公司一天使用 £3.00。

所以我有:

app/code/local/Brave/Subsidary/controllers/CartControlller.php

<?php

require_once Mage::getModuleDir('controllers', 'Mage_Checkout').DS.'CartController.php';

class Brave_Subsidary_CartController extends Mage_Checkout_CartController {

    const DISCOUNTCODE = 'BCOMSTAFF';

    public function addAction() {
        parent::addAction();
        $this->autoApplySubsidaryDiscount();
    }

    public function indexAction() {
        parent::addAction();
        $this->autoApplySubsidaryDiscount();
    }

    public function autoApplySubsidaryDiscount() {

        $customer = Mage::getSingleton('customer/session')->getCustomer();
        $orders = Mage::getResourceModel('sales/order_collection')
        ->addFieldToSelect('*')
        ->addFieldToFilter('customer_id', $customer->getId()); 

        if(!$orders->getSize()) {

            // New Customer...     
            $this->applyDiscountCoupon();

        } else {

            // Check last order date
            $orderCollection = Mage::getModel('sales/order')->getCollection()
            ->addFilter('customer_id', $customer->getId())
            ->setOrder('created_at', Varien_Data_Collection_Db::SORT_ORDER_DESC);

            $newestOrder = $orderCollection->getFirstItem();

            $dateToday = Mage::getModel('core/date')->timestamp(time());
            $lastOrderDate = Mage::getModel('core/date')->timestamp(strtotime($newestOrder->getData('created_at')));

            // only apply if last order was more than 24hrs ago..
            if( $dateToday > $lastOrderDate ) {

                $this->applyDiscountCoupon();   

            }

        }

    }

    public function applyDiscountCoupon() {
        Mage::getSingleton("checkout/session")->setData("coupon_code",self::DISCOUNTCODE);
        Mage::getSingleton('checkout/cart')->getQuote()->setCouponCode(self::DISCOUNTCODE)->save();     
    }

}
?> 

app/code/local/Brave/Subsidary/etc/config.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Brave_Subsidary>
            <version>0.1.0</version>
        </Brave_Subsidary>
    </modules>
    <frontend>
        <routers>
            <checkout>
                <use>standard</use>
                <args>
                    <modules>
                        <Brave_Subsidary before="Mage_Checkout">Brave_Subsidary</Brave_Subsidary>
                    </modules>
                </args>
            </checkout>
        </routers>
    </frontend>
</config>

然后是我的模块文件: app/etc/modules/Brave_Subsidary.xml

<?xml version="1.0" encoding="UTF-8"?>
<config>
    <modules>
        <Brave_Subsidary>
            <active>true</active>
            <codePool>local</codePool>
        </Brave_Subsidary>
    </modules>
</config> 

问题是我在购物车页面或将商品添加到购物车时遇到了重定向循环,这可能是一个非常简单的问题,但尝试谷歌搜索任何相关的东西都是大海捞针!

FireFox 告诉我的错误是:

Firefox 检测到服务器正在以永远不会完成的方式重定向对该地址的请求。

【问题讨论】:

  • 我可以确认折扣码已正确应用,因为当我禁用模块时,折扣码显示为已应用。

标签: php magento http-redirect


【解决方案1】:

问题是:

您正在调用 parent:addAction() ,它重定向回 indexAction ,这是您的 indexAction 再次调用 parent:addAction ......因此重定向循环。

错误代码:

   public function indexAction() {
        parent::addAction();
        $this->autoApplySubsidaryDiscount();
    }

您不能在上面看到的自定义 indexAction 中调用 addAction!

解决方案:

  1. 删除

    公共函数 indexAction() { 父::addAction(); $this->autoApplySubsidaryDiscount(); }

  2. 改变

    公共函数 addAction() { $this->autoApplySubsidaryDiscount(); 父::addAction();
    }

完成。

但更好的方式是重写控制器是使用观察者......但我猜那是另一个线程:)

【讨论】:

  • 非常感谢,我可以补充一下 indexAction 也需要在那里,但只需将其更改为: public function indexAction() { $this->autoApplySubsidaryDiscount();父::indexAction(); }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-18
  • 1970-01-01
  • 1970-01-01
  • 2013-05-27
相关资源
最近更新 更多