【问题标题】:Magento widget(product_new) OverrideMagento 小部件(product_new)覆盖
【发布时间】:2013-11-11 16:27:18
【问题描述】:

我想在 Magento 1.7 中为 product_new 小部件添加类别过滤器。 我尝试了以下方法。

1.模块声明。

<config>
    <modules>
        <module_name>
            <active>true</active>
            <codePool>local</codePool>
        </module_name>
    </modules> </config>

2.在config.xml中添加以下内容

<config>    
    <modules>
        <module_name>
            <version>0.1.0</version>
        </module_name>
    </modules>

    <global>
        <blocks>
            <catalog>
                <rewrite>
                    <product_new>Module_Name_Block_Product_New</product_new>
                </rewrite>
            </catalog>
        </blocks>    
    </global>    
</config>

3。覆盖产品新类

class Module_Name_Block_Product_New extends Mage_Catalog_Block_Product_New
{

    /**
     * Prepare collection with new products and applied page limits.
     *
     * return Mage_Catalog_Block_Product_New
     */
    protected function _beforeToHtml()
    {
      $todayStartOfDayDate  = Mage::app()->getLocale()->date()
            ->setTime('00:00:00')
            ->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);

        $todayEndOfDayDate  = Mage::app()->getLocale()->date()
            ->setTime('23:59:59')
            ->toString(Varien_Date::DATETIME_INTERNAL_FORMAT);

        $collection = Mage::getResourceModel('catalog/product_collection');
        $collection->setVisibility(Mage::getSingleton('catalog/product_visibility')->getVisibleInCatalogIds());


        $collection = $this->_addProductAttributesAndPrices($collection)
            ->addStoreFilter()
            ->addAttributeToFilter('news_from_date', array('or'=> array(
                0 => array('date' => true, 'to' => $todayEndOfDayDate),
                1 => array('is' => new Zend_Db_Expr('null')))
            ), 'left')
            ->addAttributeToFilter('news_to_date', array('or'=> array(
                0 => array('date' => true, 'from' => $todayStartOfDayDate),
                1 => array('is' => new Zend_Db_Expr('null')))
            ), 'left')
            ->addAttributeToFilter(
                array(
                    array('attribute' => 'news_from_date', 'is'=>new Zend_Db_Expr('not null')),
                    array('attribute' => 'news_to_date', 'is'=>new Zend_Db_Expr('not null'))
                    )
              )
            //->addAttributeToSort('news_from_date', 'desc')

            ->setPageSize($this->getProductsCount())
            ->setCurPage(1);

            if($categoryId=$this->getData('category_id')){
                $category = Mage::getModel('catalog/category')->load($categoryId);
                $collection->addCategoryFilter($category)->addAttributeToSort('position','asc');
            }            
        $collection->addAttributeToSort('news_from_date', 'desc');
        $this->setProductCollection($collection);

        return parent::_beforeToHtml();      

    }
 }

4。之后,当我在 HOME CMS 页面中调用新产品小部件时,它会为我提供所有类别中的所有新产品,简而言之,我的新课程无效,但仍会调用核心课程。下面是小部件块。

 {{widget type="catalog/product_widget_new" products_count="9"  category_id="124"   template="catalog/product/widget/new/content/new_grid.phtml"}}

谁能指导我应该做些什么改变才能使我的课程有效。

【问题讨论】:

    标签: php magento


    【解决方案1】:

    我认为现在是正确的:

       <blocks>
            <catalog>
                <rewrite>
                    <product_new>Module_Name_Block_Product_New</product_new>
                </rewrite>
            </catalog>
        </blocks>    
    

    应该是

        <blocks>
            <catalog>
                <rewrite>
                    <product_widget_new>Module_Name_Block_Product_New</product_widget_new>
                </rewrite>
            </catalog>
        </blocks>    
    

    你的类声明应该是:

    class Module_Name_Block_Product_New extends Mage_Catalog_Block_Product_Widget_New
    

    您在代码中所做的是重写 Mage_Catalog_Block_Product_New 块,但您在主页中使用了这个 Mage_Catalog_Block_Product_Widget_New
    我知道你会说Mage_Catalog_Block_Product_Widget_New 已经扩展了Mage_Catalog_Block_Product_New,但是即使你已经覆盖了最后一个,小部件块仍然扩展了原来的那个。

    【讨论】:

    • 谢谢 Marius.. 它工作了 :) 在启用提示后我可以看到我的新块名称。但是我的 __beforeToHtml() 函数没有被覆盖。类别过滤器仍然没有得到应用。是因为它保护了功能吗??
    • 在你的新块中重写 _beforeToHtml 函数:Module_Name_Block_Product_New
    • 我已经在我的新块 Module_Name_Block_Product_New 中重写了 _beforeHTML ,但它仍然没有使用核心的 _beforeHTML 函数。对此有任何想法吗? .. 感谢您的帮助。
    • 它完成了。我只是将返回类型从 parent::_beforeHTML() 更改为 $this。感谢马吕斯的帮助。
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 2012-04-10
    • 2019-08-22
    • 2017-10-31
    • 2019-03-12
    • 1970-01-01
    • 2010-12-30
    • 2017-11-24
    相关资源
    最近更新 更多