2010-11-26 3 views
0

я пытаюсь переопределить Mage_Catalog_Block_Product_View с моим MyCompany_Mymodule_Block_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> 

ли кто-нибудь может помочь мне открыть этот MISTERY?

+0

Как вы можете сказать, что это загрузка класса Block? – 2010-11-26 11:35:06

ответ

0

Привет, Извините, я не могу точно понять, что происходит. Но убедитесь, что отчет об ошибках включен. Также вы попытались комментировать какой-то код и посмотреть, все ли работает.

Также немного вещей на вашем коде и вашем подходе. Логика, которую вы пытаетесь реализовать, должна находиться внутри контроллера вместо представления. Также триггер контроллера имеет довольно много событий. Возможно, есть тот, который соответствует вашим требованиям.

Класс блока Mage_Catalog_Block_Product_View расширяется еще несколькими классами. И вы не хотите запускать проверку каждый раз, когда какой-либо шаблон загружается, особенно если вы запрашиваете базу данных.

Также похоже, что метод checkPrivateCategories принимает массив идентификаторов категорий, а затем использует цикл foreach для запроса базы данных для каждого идентификатора категории с помощью коллекции для поиска одного объекта. Вы должны вместо этого запросить базу данных один раз с одной коллекцией, а затем проверить результат для всех.

чек $ продукт-> getCategoryCollection()

Даже так что это, вероятно, не ответ, который вы искали, я надеюсь, что это поможет

1

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

К счастью, вам даже не нужно это делать, потому что есть free extension, который уже делает.

Смежные вопросы