2010-11-24 28 views
0

MagentoでCategoryControllerクラスをオーバーロード/上書きしようとしていますが、毎回404エラーに対処しています。私はネット上で見つけた多くのガイドラインに従ってきましたが、まだまだ短くなっているようです。Magentoでコントローラークラスを上書き/オーバーロードする

など/ 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> 

コントローラ/カタログ/ 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"; 
} 
} 

これは、私は私もよく分からないので、コントローラをオーバーロードしようとしたのは初めてですもし私がそれを正しければ。私がしたい最後のことは、コアにコードを追加することです...

ありがとうございます。

答えて

0

あなたの問題はLHM_CategoryLanding_Catalogだと思います。おそらくLHM_CategoryLandingにあなたのコントローラフォルダがあるはずです。

モジュールが使用するモジュールを教えようとしているので、モジュールはLHM_CategoryLandingではありません。LHM_CategoryLanding_Catalogです。

0

私はコントローラを過負荷にしていますが、私はそれらを直接オーバーロードしません。それは過去に私にとって問題でした。だからあなたの​​3210は正しいです。

コントローラ/カタログ/ 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

は実際にあなただけの書き換え方法を使用するための方法を上書きしている場合、コントローラに過負荷をかけるための好ましい方法ではありません。以前のモジュールメソッドを使用する新しいアクションを追加したい場合は、どうしたらいいかわかりますか? –

関連する問題