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

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

1 голос
/ 26 ноября 2010

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

К счастью, вам даже не нужно этого делать, потому что есть бесплатное расширение , которое уже делает.

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

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

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

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

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

check $ product-> getCategoryCollection ()

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

...