2010-11-26 282 views
0

我想用我的這種方式MyCompany_Mymodule_Block_View覆蓋Mage_Catalog_Block_Product_View:覆蓋Magento的類

<?php 



class MyCompany_Mymodule_Block_View extends Mage_Catalog_Block_Product_View { 



    /** 

    * Add meta information from product to head block 

    * 

    * @see  Mage_Catalog_Block_Product_View::_prepareLayout() 

    * @return Mage_Catalog_Block_Product_View 

    */ 

    protected function _prepareLayout() { 

     $product = $this->getProduct(); 

     $logged_in = Mage::getSingleton('customer/session')->isLoggedIn(); 

     $groupId = Mage::getSingleton('customer/session')->getCustomerGroupId(); 

     if($this->checkPrivateCategories($product->getCategoryIds())){ 

      if($logged_in && $groupId == 1){ 

#    die('The user can see the product'); 

      }else{ 

       header('location: /customer/account/login'); 

       die; 

      } 

     } 



     return parent::_prepareLayout(); 

    } 





    private function checkPrivateCategories($categories){ 

     if(is_array($categories)){ 

      foreach($categories as $category){ 



       $collection = Mage::getModel('catalog/category')->getCollection(); 

       /* @var $collection Mage_Catalog_Model_Resource_Eav_Mysql4_Category_Collection */ 

       $collection 

        ->addAttributeToFilter('private', true) 

        ->addIdFilter(array($category)) 

        ->load(); 

       $data = $collection->getData(); 

       if(!empty($data)){ 

        if ($data[0]['private']){ 

         return true ; 

        } 

       } 

      } 

     } 

     return false; 

    } 

} 

我想檢查是否選擇該產品是一種特定類別中,如果答案是肯定的我將用戶重定向到客戶登錄頁面。

現在,如果我直接編輯核心類,代碼將正常工作。如果我嘗試用我的自定義類覆蓋Mage_Catalog_Block_Product_View,那麼我會在產品詳細信息頁面的空白部分找到它。該類已被正確調用,但沒有html答案。

這是Config.xml中提取:

  <blocks> 
      <mymodule> 
       <class>MyCompany_Mymodule_Block</class> 
      </mymodule> 
      <catalog> 
       <rewrite> 
        <product_view>MyCompany_Mymodule_Block_View</product_view> 
       </rewrite> 
      </catalog> 

     </blocks> 

是否有人可以幫助我發現這個謎?

+0

你怎麼能說它正在加載塊類? – 2010-11-26 11:35:06

回答

0

嗨,我很抱歉不能不知道究竟是怎麼回事。但請確保提供錯誤報告。你也試過評論你的一些代碼,看看它是否仍然有效。

你的代碼和你的方法也很少。您試圖實現的邏輯應該位於控制器內而不是視圖內。此外,控制器觸發了不少事件。也許有一個適合你的要求。

塊類Mage_Catalog_Block_Product_View被擴展了幾個類。而且你不想在每次模板被加載時運行你的檢查,特別是因爲你正在查詢數據庫。

而且它看起來像法checkPrivateCategories花費類別ID的數組,然後使用一個foreach循環來查詢數據庫使用集合找到一個實體每個類別ID。您應該使用一個集合查詢數據庫一次,然後檢查所有結果。

檢查$產品 - > getCategoryCollection()

即使如此這可能是不是你要找的答案,我希望這將有助於

1

從技術上講,你不應該把這種控制邏輯在Block類中。如果你遵循MVC模式,那麼最好是看一個控制器,然後檢查那裏的類別。

幸運的是,你甚至都不需要做,因爲有一個free extension它已經這樣做了。