覆盖Magento类

时间:2010-11-26 11:12:45

标签: php magento override

我试图以这种方式用我的MyCompany_Mymodule_Block_View覆盖Mage_Catalog_Block_Product_View:

<?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>

有人能帮助我发现这种错误吗?

2 个答案:

答案 0 :(得分:1)

从技术上讲,你不应该把这种控制逻辑放在Block类中。如果你遵循MVC模式,那么最好再看一下控制器并检查那里的类别。

幸运的是,您甚至不需要这样做,因为已经有free extension

答案 1 :(得分:0)

嗨,我很抱歉不能不确切地看出出了什么问题。但请确保错误报告已启用。你也尝试评论你的一些代码,看看它是否仍然有效。

您的代码和方法也很少。您尝试实现的逻辑应位于控制器而不是视图中。此外,控制器触发了很多事件。也许有一个适合您的要求。

块类Mage_Catalog_Block_Product_View被更多类扩展。并且您不希望每次加载任何模板时都运行检查,特别是因为您正在查询数据库。

此外,方法checkPrivateCategories采用类别ID数组,然后使用foreach循环使用集合查询每个类别ID以查找一个实体。您应该使用一个集合查询数据库一次,然后检查所有结果。

检查$ product-&gt; getCategoryCollection()

即便如此,这可能不是你想要的答案,我希望它会有所帮助