Перезапись / перегрузка класса контроллера в Magento - PullRequest
0 голосов
/ 24 ноября 2010

Я пытаюсь перегрузить / перезаписать класс CategoryController в Magento, но каждый раз сталкиваюсь с ошибкой 404.Я следовал многим рекомендациям, которые нашел в сети, но, похоже, все еще не работает.

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 / Catalogue / 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";
}
}

Это первый раз, когда я пытался перегрузить контроллер, поэтому я даже не уверен, правильно ли я это делаю.Последнее, что я хочу сделать, это добавить код в ядро ​​...

Заранее спасибо.

Ответы [ 3 ]

1 голос
/ 25 ноября 2010
0 голосов
/ 24 ноября 2010

Когда я перегружаю контроллеры, я не перегружаю их напрямую, это было проблематично для меня в прошлом.Таким образом, ваш config.xml правильный.

контроллер / Каталог / 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

Оригинальный контроллер не был заменен, просто заменен.Если требуется действие, отличное от view, маршрутизатор не найдет его ни в вашем классе, ни у его предков, и по умолчанию Mage_Catalog_CategoryController, который все еще доступен.

0 голосов
/ 24 ноября 2010

Я думаю, ваша проблема LHM_CategoryLanding_Catalog. Вероятно, это должно быть LHM_CategoryLanding там, где у вас есть папка контроллеров.

Вы пытаетесь указать, какой модуль использовать, поэтому модуль LHM_CategoryLanding не LHM_CategoryLanding_Catalog.

...