2016-1-17 博客文章增加了markdown格式,由MD标记

2016-03-14 22:18:00

magento也自带此功能,可是magento设置新品是要填写每个产品的news_from_date和news_to_date这两个属性的值,对于大批量上新来说,此功能感觉是毫无用处。


目前我掌握到了两种方法:

第一种:新建新品分类,然后把新品都绑定到这个分类上。

第二种:自定义页面,自定义业务逻辑。


新建新品分类:

这个方法虽说比较死,但是解决问题的最简单最快速的方法。也是我在第一阶段采用的方法。现在老板不想每次上新品时还要另外给绑定到新品分类上,同时也觉得以前旧的新品,应该不再展示在这个新品版块里。所以现在就只能采用第二种方法了。


自定义页面展示新品:

此方法需要新建模块。在实践过程中遇到诸多问题,为了方便查阅,现记录下来。

展示产品,自然也是应该用到magento自带的list,和grid这两种方式,亲自去写css,那工作量就不小了,也不是程序员工作的意义所在


覆写block:

class Mage_Catalog_Block_Product_New extends Mage_Catalog_Block_Product_Abstract{}
class Mage_Catalog_Block_Product_List extends Mage_Catalog_Block_Product_Abstract{}

其中New类是关于magento自带的新品功能。List类则是分类产品展示功能。如果不怕写css,大可直接复写New类,不过,还得另外添加如下工具栏。

toolbar.png


override block配置文件:

<global>
    <blocks>
    <!-- 经过实践,这段一定要写,不然后面产品无法展示-->
    <drunk_catalog>
    <class>Drunk_Catalog_Block</class>
    </drunk_catalog>
    <catalog>
    <rewrite>
    <product_list>Drunk_Catalog_Block_Product_New</product_list>
    </rewrite>
    </catalog>
    </blocks>
</global>


新建Block类:

class Drunk_Catalog_Block_Product_New extends Mage_Catalog_Block_Product_List
    {
        public function __construct(){
            parent::__construct();
        }
    }



创建CMS页面:

接下来就要在我们自定义页面里用到我们这个自定义的New类。

在后台CMS/Page下添加新页面,在design里填上如下内容:

<reference name="content">
        <block type="drunk_catalog/product_new" name="product_new" template="catalog/product/newproduct_list.phtml">
            <action method="setCategoryId"><category_id></category_id></action>
            <action method="setStartId"><start_id>11000</start_id></action>
            <block type="catalog/product_list_toolbar" name="product_list_toolbar" template="catalog/product/list/toolbar.phtml">
                <block type="page/html_pager" name="product_list_toolbar_pager"/>
            </block>
            <action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
        </block>
</reference>


表示在页面content区域调用我们自定义的页面。block里就有获取product集合的方法,新品的业务逻辑主要就写在其中啦。


业务逻辑覆写:

主要覆写list类里_getProductCollection这个方法。

其中俺遇到几个不熟悉点如下:


如何筛选多个分类的所有产品:

    $categoryIdParam = $this->getCategoryId();
    $categoryArr = explode(",", $categoryIdParam);
    $products = Mage::getModel("catalog/product")->getCollection();
    $products->joinField('category_id',
            'catalog/category_product',
            'category_id',
            'product_id=entity_id',
            null,
            'left'
    );
    $newArr = array_filter($categoryArr);
    $products
    ->addAttributeToFilter('category_id', array('in' => array(implode(",", $newArr))))
    ->setOrder("entity_id", "desc");


$this->getCategoryId()获取的就是上面xml内容其中的参数值,如下:

<action method="setCategoryId"><category_id>34</category_id></action>



如何筛选出库存不为0的产品:

Mage::getSingleton('cataloginventory/stock')
->addInStockFilterToCollection($new_collection)

这里collection不用返回,筛选效果就已经添加到collection上了。具体是如何做到的,暂时还没深究。


醉酒三问:

1.如何筛选出news_to_date为空或没过期的产品?

->addFieldToFilter('news_to_date', array(array(
                0 => array('date' => true, 'gt' => $todayStartOfDayDate),
                1 => array('is' => new Zend_Db_Expr('null')))
            ), 'left')


本来上面代码是可行的,可是news_to_date是我临时启用的,产品并没有关于这个属性的记录,从而导致上面筛选语句失效。不知道有何较好的解决方法。


2.如何限制collection的数量?

单纯限制数量,自然很好解决。例如如下:

$collection->getSelect()->limit(100);


可是这样限制,会导致模板接受到的collection类型发生变化,从而不能遍历,即产品无法展示。

setCurPage,setPageSize


也尝试加到collection上了,可是毫无影响。关于其中分页的实现,还得继续研究。