2012-07-05 141 views
6

我想做以上。 我过去覆盖了很多文件...块,模型,帮手....但这个逃避了我。Magento覆盖控制器

有人能看到什么即时做错了什么: (IVE编辑这段代码...包括一些recomendations现在...)

继承人我的文件夹结构(2个控制器的位置作为测试):

/Idigital/Idgeneral/etc/config.xml 
/Idigital/Idgeneral/controllers/Checkout/CartController.php 
/Idigital/Idgeneral/controllers/CartController.php 

赫雷什我的config.xml:

<?xml version="1.0"?> 
<config> 
<modules> 
    <idigital_idgeneral> 
    <version>0.1.0</version> 
    </idigital_idgeneral> 
</modules> 
<global> 
<blocks> 
     <idgeneral><class>Idigital_Idgeneral_Block</class></idgeneral> 
    </blocks> 
</global> 

<frontend> 
    <routers> 
       <checkout> 
        <use>standard</use> 
        <args> 
         <modules> 
          <Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral> 
         </modules> 
        </args> 
       </checkout> 
      </routers> 
     <layout> 
     <updates> 
      <idgeneral> 
       <file>idigital.xml</file> 
      </idgeneral> 
     </updates> 
    </layout> 
</frontend> 
</config> 

IHAVE放置我的控制器文件在2个地点进行测试。 而继承人我的第一个控制器文件的顶部:

require_once 'Mage/Checkout/controllers/CartController.php'; 
class Idigital_Idgeneral_Checkout_CartController extends Mage_Checkout_CartController 
{ 


public function testAction() 
{ 
    var_dump('inside checkout/cart/test');exit; 
} 

/** 
* Add product to shopping cart action 
*/ 
public function addAction() 
{ 
    blah... 
} 

答我的第二个控制器:

require_once 'Mage/Checkout/controllers/CartController.php'; 
class Idigital_Idgeneral_CartController extends Mage_Checkout_CartController 
{ 


public function testAction() 
{ 
    var_dump('inside cart/test');exit; 
} 

/** 
* Add product to shopping cart action 
*/ 
public function addAction() 
{ 
    blah... 
} 

当我访问:/结帐/车/加 林定向到法师控制器...不是我的本地人。 (我在每个var_dump stmts ..我可以看到哪些是跑了)。

当我访问/结帐/车/测试 - 我得到一个404 当我访问/车/添加或购物车/测试 - 我得到一个404 当我访问idgeneral /车/测试或idgeneral /车/加 - 我得到一个404

+0

我刚刚测试了您的代码后修订#3代码对裸体CE 1.6.2.0。请求'checkout/cart/test'适用于我,并显示预期结果(checkout/cart/test“'”内的'string(25)')。你的模块激活码('app/etc/modules/whatever.xml')是怎么看的? – 2012-07-06 09:06:26

+0

尝试刷新缓存 – 2012-12-12 08:55:27

回答

6
<Idigital_Idgeneral before="Mage_Checkout">Idgeneral_Checkout</Idigital_Idgeneral> 

应该

<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral> 

或尝试了移动定制控制器

../Idigital/Idgeneral/controllers/CartController.php 

,并使用

<Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral</Idigital_Idgeneral> 

也有在你的<modules>标签位置错误。它应该是:

<config> 
    <modules> 
     <idigital_idgeneral> 
      <version>0.1.0</version> 
     </idigital_idgeneral> 
    </modules> 
    <global> 
    ... 
    </global> 

    <frontend> 
     .... 
    </frontend> 
... 
</config> 

<modules>不应该是内部<global>

下面是关于如何转储Magento的看到作为XML的配置树一个很好的教程:http://alanstorm.com/magento_config

+0

嗨。 thx,我会试试这个。我已经把我的控制器放在一个水平(所以它现在在两个地方,只是我可以测试)为什么你建议使用'Idgeneral_Idgeneral'如果你的意思是:'Idigital_Idgeneral'...那么是的,我意识到这一点。并尝试过。 我会尝试所有的建议,并回复你。控制者似乎很痛苦。 :( – ShaunTheSheep 2012-07-05 20:04:53

+1

我不好,你说得对,应该是Idigital_Idgeneral。如果你将Idigital_Idgeneral与控制器结合起来,应该可以工作。你可以尝试添加一个自定义动作,并点击/结帐/购物车/ customaction,看看它是否点亮 – Roscius 2012-07-05 20:37:46

+0

嗨,我尝试了所有这些建议,没有什么作用,添加一个测试动作也没有工作......并且我尝试了以上所有建议......并且每次都清除缓存(这也是禁用的) 什么一个痛苦!! 鉴于我的测试行动没有工作,必须有一个与路由问题....任何其他建议? – ShaunTheSheep 2012-07-05 22:36:20

0

嗯......它WONT覆盖结帐推车控制器。

因此,我在本文底部附近的链接中使用了PRODUCT VIEW ...中的URL REWRITE。他们说,其正确的方法...

http://www.excellencemagentoblog.com/magento-add-product-to-cart-ajax

if(!url){ 
     url = jQuery('#product_addtocart_form').attr('action'); 
} 
url = url.replace("checkout/cart","idgeneral/cart"); 

为我工作。让我开裂。基本上称为MY控制器..而不是结帐控制器。

感谢您的帮助ROSCIUS ...赞赏。

我也不得不改变我的配置....我的路由器部分现在看起来是这样的:

<routers> 
     <!-- THIS PART REGISTERS OUR CONTROLLERS FOLDER FOR USE --> 
     <idgeneral> 
      <use>standard</use> 
      <args> 
       <module>Idigital_Idgeneral</module> 
       <frontName>idgeneral</frontName> 
      </args> 
     </idgeneral> 

     <!-- THIS PART WONT WORK TO OVERWRITE OUR MAGE CONTROLLER --> 
     <checkout> 
      <use>standard</use> 
      <args> 
       <modules> 
        <Idigital_Idgeneral before="Mage_Checkout">Idigital_Idgeneral_Checkout</Idigital_Idgeneral> 
       </modules> 
      </args> 
     </checkout> 
    </routers> 
+0

也许我可以将标记添加到我的config.xml? – ShaunTheSheep 2012-07-06 08:39:18

7
  1. 创建你的模块文件夹和文件

    app/code/local/MyNameSpace/MyModule/etc/config.xml 
    app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php 
    app/etc/modules/MyNameSpace_All.xml 
    
  2. 编辑/ etc /config.xml和创建应用程序/代码/本地/ MyNameSpace/MyModule/etc/config.xml与以下内容:

    <?xml version="1.0"?> 
    <config> 
    <modules> 
        <MyNameSpace_MyModule> 
         <version>0.1.0</version> 
        </MyNameSpace_MyModule> 
    </modules> 
    <global> 
        <!-- This rewrite rule could be added to the database instead --> 
        <rewrite> 
         <!-- This is an identifier for your rewrite that should be unique --> 
         <!-- THIS IS THE CLASSNAME IN YOUR OWN CONTROLLER --> 
         <mynamespace_mymodule_checkout_cart> 
          <from><![CDATA[#^/checkout/cart/#]]></from> 
          <!-- 
           - mymodule matches the router frontname below 
           - checkout_cart matches the path to your controller 
    
           Considering the router below, "/mymodule/checkout_cart/" will be 
           "translated" to "/MyNameSpace/MyModule/controllers/Checkout/CartController.php" (?) 
          --> 
          <to>/mymodule/checkout_cart/</to> 
         </mynamespace_mymodule_checkout_cart> 
        </rewrite> 
    </global> 
    <!-- 
    If you want to overload an admin controller this tag should be <admin> instead, 
    or <adminhtml> if youre overloading such stuff (?) 
    --> 
    <frontend> 
        <routers> 
         <mynamespace_mymodule> 
          <!-- should be set to "admin" when overloading admin stuff (?) --> 
          <use>standard</use> 
          <args> 
           <module>MyNameSpace_MyModule</module> 
           <!-- This is used when "catching" the rewrite above --> 
           <frontName>mymodule</frontName> 
          </args> 
         </mynamespace_mymodule> 
        </routers> 
    </frontend> 
    

    注意:当我覆盖目录/产品控制器时,上述不适用于我。我不得不使用:

      <from><![CDATA[#^catalog/product/#]]></from> 
          <to>mymodule/mycontroller</to> 
    

    (注意缺少的前导斜杠)

    由于Magento的1.3,你可以你的模块只需添加到前端路由器。重写不neccessary更多:

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

    请注意,before=”Mage_Checkout”将载入您的控制器第一(如果可用),如果没有回落到Magento的。

    如果控制器是在另一个文件夹,你就必须修改代码:
    app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php.

更换

<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule</MyNameSpace_MyModule>

<MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule> 
  1. 编辑'controllers/Checkout/CartController.php'

    具有以下内容创建app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php:(到的indexAction(唯一的变化)被添加error_log中()调用):

    <?php 
         # Controllers are not autoloaded so we will have to do it manually: 
         require_once 'Mage/Checkout/controllers/CartController.php'; 
         class MyNameSpace_MyModule_Checkout_CartController extends 
             Mage_Checkout_CartController 
        { 
        # Overloaded indexAction 
        public function indexAction() { 
        # Just to make sure 
        error_log('Yes, I did it!'); 
        parent::indexAction(); 
        } 
        } 
    
    1. 编辑'app/etc/modules/MyNameSpace_All.xml' (这是为了激活你的模块)

      真正 当地

  2. 编辑'app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml'并添加以下使用相同的更新句柄作为前:

    <mynamespace_mymodule_checkout_cart_index> 
        <update handle="checkout_cart_index"/> 
        </mynamespace_mymodule_checkout_cart_index> 
    

    (请注意,这些标签似乎情况敏感。尝试使用全部小写字母,如果这不适合你)

    [Hendy:当我用这个Wiki或这里描述的方法覆盖目录/产品/视图时,我不必这样做。然而,使用“CMS方式”时,我不得不手动更新的手柄。]

    以上项目未(乔纳森·中号卡瓦略2009-02-19)为我工作

    我发现,文件改变是应用程序/设计/前端/ [MyInterface的]/[mytheme的] /layout/mymodule.xml

    添加下列行:


    1. 将您的浏览器指向/ checkout/cart/ 在您的PHP错误日志中,您应该找到'是的,我做到了!'。

    您需要对重写正则表达式进行更精确的处理,因为错误很难找到。

1

这是控制器的包括路径上的一点通知。

这包括路径如果Magento的编译器模式开启时可能会导致错误

require_once 'Mage/Checkout/controllers/CartController.php'; 

相反的,它是用

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

好将更加安全。

3

我在这里离开这里为下一个可怜的开发人员被迫与这个jalopy一起工作。这里的许多说明都粘贴在magento docs之上,它们的来源是一个扭曲的迷宫。好了足够的投诉...

这在版本1.8

为我工作创建命名空间和模块: /应用/代码/本地/ myNameSpace对象/ MyModule的

创建你的模块配置: /应用/code/local/MyNameSpace/MyModule/etc/config.xml

<?xml version="1.0" ?> 
<config> 
<modules> 
    <MyNameSpace_MyModule> 
     <version>0.1.0</version> 
    </MyNameSpace_MyModule> 
</modules> 
<frontend> 
    <routers> 
     <checkout> 
      <args> 
       <modules> 
        <MyNameSpace_MyModule before="Mage_Checkout">MyNameSpace_MyModule_Checkout</MyNameSpace_MyModule> 
       </modules> 
      </args> 
     </checkout> 
    </routers> 
</frontend> 

创建你的控制器: /app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php

<?php 

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

class MyNameSpace_MyModule_Checkout_CartController extends Mage_Checkout_CartController 
{ 
    public function indexAction() { 
     // /var/log/debug.log should log the output 
     Mage::log('cart index override', null, 'debug.log'); 

     // Call the parent class 
     parent::indexAction(); 
    } 
} 

启用新的模块: /app/etc/modules/MyNameSpace_All.xml

<?xml version="1.0" ?> 
<config> 
    <modules> 
    <MyNameSpace_MyModule> 
     <active>true</active> 
     <codePool>local</codePool> 
    </MyNameSpace_MyModule> 
    </modules> 
</config> 

这就是所需的所有多数民众赞成。现在去庆祝吧,你只是打磨了一个烂摊子! ;)