Overwriting / Overloading a controller class in Ma

2019-09-06 07:49发布

问题:

I'm trying to overload / overwrite the CategoryController class in Magento, but am coming up against a 404 error every time. I've followed many guidelines that I've found on the net but still seem to be coming up short.

etc/config.xml

<?xml version="1.0"?><config>
<modules>
    <LHM_CategoryLanding>
        <version>0.1.0</version>
    </LHM_CategoryLanding>
</modules>
<!--<global>
    <rewrite>
        <lhm_categorylanding_catalog_category>
            <from><![CDATA[#^/catalog/category/#]]></from>
            <to>categorylanding/catalog_category/</to>
        </lhm_categorylanding_catalog_category>
    </rewrite>
</global>-->
<frontend>
    <routers>
        <catalog>
            <args>
                <modules>
                    <LHM_CategoryLanding before="Mage_Catalog">LHM_CategoryLanding_Catalog</LHM_CategoryLanding>
                </modules>
            </args>
        </catalog>
        <!--
        <lhm_categorylanding>
            <use>standard</use>
            <args>
                <module>LHM_CategoryLanding</module>
                <frontName>categorylanding</frontName>
            </args>
        </lhm_categorylanding>
        -->
    </routers>
</frontend>
</config>

controller/Catalog/CategoryController.php

<?php

// This is needed since Varien used a layout that is not easily auto-loadable
require_once("Mage/Catalog/controllers/CategoryController.php");

class LHM_CategoryLanding_Catalog_CategoryController extends Mage_Catalog_CategoryController
{
/**
 * Initialize requested category object
 *
 * @return Mage_Catalog_Model_Category
 */
protected function _initCatagory()
{
    Mage::dispatchEvent('catalog_controller_category_init_before', array('controller_action'=>$this));
    $categoryId = (int) $this->getRequest()->getParam('id', false);
    if (!$categoryId) {
        return false;
    }

    $category = Mage::getModel('catalog/category')
        ->setStoreId(Mage::app()->getStore()->getId())
        ->load($categoryId);

    if (!Mage::helper('catalog/category')->canShow($category)) {
        return false;
    }
    Mage::getSingleton('catalog/session')->setLastVisitedCategoryId($category->getId());
    Mage::register('current_category', $category);
    try {
        Mage::dispatchEvent('catalog_controller_category_init_after', array('category'=>$category, 'controller_action'=>$this));
    } catch (Mage_Core_Exception $e) {
        Mage::logException($e);
        return false;
    }
    return $category;
}

/**
 * Category view action
 */
public function viewAction()
{

    if ($category = $this->_initCatagory()) {

        Mage::getModel('catalog/design')->applyDesign($category, Mage_Catalog_Model_Design::APPLY_FOR_CATEGORY);
        Mage::getSingleton('catalog/session')->setLastViewedCategoryId($category->getId());

        $update = $this->getLayout()->getUpdate();
        $update->addHandle('default');

        if (!$category->hasChildren()) {
            $update->addHandle('catalog_category_layered_nochildren');
        }

        $this->addActionLayoutHandles();            

        $update->addHandle($category->getLayoutUpdateHandle());
        $update->addHandle('CATEGORY_'.$category->getId());

        if ($category->getPageLayout()) {
                $this->getLayout()->helper('page/layout')
                    ->applyHandle($category->getPageLayout());
        }

        $this->loadLayoutUpdates();

        $update->addUpdate($category->getCustomLayoutUpdate());

        $this->generateLayoutXml()->generateLayoutBlocks();

        if ($category->getPageLayout()) {
            $this->getLayout()->helper('page/layout')
                ->applyTemplate($category->getPageLayout());
        }

        if ($root = $this->getLayout()->getBlock('root')) {
            $root->addBodyClass('categorypath-'.$category->getUrlPath())
                ->addBodyClass('category-'.$category->getUrlKey());
        }

        $this->_initLayoutMessages('catalog/session');
        $this->_initLayoutMessages('checkout/session');

        /* START ===== Pete T additional code. Need to put this in override!! */
        if($category->getLevel()==2){
            $category->setDisplayMode('PAGE');
        }
        /* END ======= */

        $this->renderLayout();

    }
    elseif (!$this->getResponse()->isRedirect()) {
        $this->_forward('noRoute');
    }
}

protected function _getRealModuleName()
{
    return "LHM_CategoryLanding";
}
}

This is the first time I've tried to overload a controller so I'm not even sure if I'm doing it right. The last thing I want to be doing is adding code to the core...

Thanks in advance.

回答1:

Try referencing this: http://prattski.com/2010/06/24/magento-overriding-core-files-blocks-models-resources-controllers/



回答2:

When I'm overloading controllers I don't overload them directly, that has been problematic for me in the past. So your config.xml is correct.

controller/Catalog/CategoryController.php

<?php

// No need for an include/require - it will only break when Compilation is enabled.

class LHM_CategoryLanding_Catalog_CategoryController extends Mage_Core_Controller_Front_Action
{
// Continue as normal

The original controller hasn't been replaced, just superseded. If an action other than view is required the router will not find it in your class, nor it's ancestors, and default to Mage_Catalog_CategoryController which is still accessible.



回答3:

I think, your problem is LHM_CategoryLanding_Catalog. It probably should be LHM_CategoryLanding where you have your controllers folder in there.

You are trying to tell it what module to use so the module is LHM_CategoryLanding not LHM_CategoryLanding_Catalog.