1

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"}}

クラスを効果的にするために何をすべきか教えてください。

4

1 に答える 1

0

私はこれが今正しいと思います:

   <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

コードで行ったことは block を書き直すことMage_Catalog_Block_Product_Newですが、ホームページでは this one を使用しますMage_Catalog_Block_Product_Widget_New。すでに拡張
されていると言うでしょうが、この最後のブロックを上書きしたとしても、ウィジェット ブロックは元のブロックを引き続き拡張します。Mage_Catalog_Block_Product_Widget_NewMage_Catalog_Block_Product_New

于 2013-11-11T08:27:18.477 に答える