Magento override controller

后端 未结 5 862
你的背包
你的背包 2021-01-05 12:13

I would like to do the above. Ive overridden many files in the past...block, model, helper....but this one eludes me.

Can anyone see what im doing wrong here: (ive e

相关标签:
5条回答
  • 2021-01-05 12:17

    Well...it WONT override the checkout cart controller.

    So i used the URL REWRITE in the PRODUCT VIEW...from this link...near the bottom of the article. They say its a proper method...

    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");
    

    That worked for me. Allows me to get cracking. Basically calls MY controller..instead of checkout controller.

    Thanks for the help ROSCIUS...appreciated.

    I also had to change my config....my routers section now looks like this:

    <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 讨论(0)
  • This is a little notification on the include path of the controller.

    This include path can cause errors if the Magento Compiler mode is turned on.

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

    Instead of that it is good to use

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

    It will be safer.

    0 讨论(0)
  • 2021-01-05 12:22
    <Idigital_Idgeneral before="Mage_Checkout">Idgeneral_Checkout</Idigital_Idgeneral>
    

    Should be

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

    or try moving your custom controller up to

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

    and use

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

    There is also an error in your <modules> tag location. It should be:

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

    i.e <modules> shouldn't be inside <global>

    Here's a good tutorial on how to dump the config tree that Magento sees as XML: http://alanstorm.com/magento_config

    0 讨论(0)
  • 2021-01-05 12:28

    I'm leaving this here for the next poor developer forced to work with this jalopy. Much of the instructions here are pasted from the magento docs which like its source, is a twisted labyrinth of misdirection. Okay enough complaints...

    This worked for me in version 1.8

    Create your namespace and module: /app/code/local/MyNameSpace/MyModule

    Create your module config: /app/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>
    

    Create your controller: /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();
        }
    }
    

    Enable your new module: /app/etc/modules/MyNameSpace_All.xml

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

    That's all thats needed. Now go celebrate, you just polished a turd! ;)

    0 讨论(0)
    1. Create your module folders and files

      app/code/local/MyNameSpace/MyModule/etc/config.xml
      app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php
      app/etc/modules/MyNameSpace_All.xml
      
    2. Edit /etc/config.xml and Create app/code/local/MyNameSpace/MyModule/etc/config.xml with the following content:

      <?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>
      

      Note: The above didn’t work for me when I override catalog/product controller. I had to use:

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

      (notice the missing leading slash)

      Since Magento 1.3 you can simply add your module to the frontend router. Rewrites are not neccessary any more:

        <?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>
      

      Please note that before=”Mage_Checkout” will load your controller first if available and fall back to Magento’s if not.

      If the controller is in another folder, you’ll have to modify the code:
      app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php.

    Replace

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

    with

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

      Create app/code/local/MyNameSpace/MyModule/controllers/Checkout/CartController.php with the following content: (the only change to indexAction() is adding an error_log() call):

          <?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. Edit 'app/etc/modules/MyNameSpace_All.xml' (This is to activate your module)

        true local

    2. Edit 'app/design/frontend/[myinterface]/[mytheme]/layout/checkout.xml' and add the following to use the same update handle as before:

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

      (Note that these tags seem to be case sensitive. Try using all lowercase if this isn’t working for you)

      [by Hendy: When I override catalog/product/view using the method described in this Wiki or here, I didn’t have to do the above. However, when using the 'cms way', I had to update the handle manually.]

      The above item did not work for me (2009-02-19 by Jonathan M Carvalho)

      I discovered that the file to change is app/design/frontend/[myinterface]/[mytheme]/layout/mymodule.xml

      Add the following lines:


      1. Point your browser to /checkout/cart/ In your PHP error log, you should find ‘Yes, I did it!’.

      You need to be extra precise with the rewrite regular expression because errors are very hard to find.

    0 讨论(0)
提交回复
热议问题