Như đã giải thích trong các bình luận, tôi không nghĩ có một cách để làm điều này bằng cách sử dụng các trang cms vì bạn không có mô hình lớp liên quan đến danh sách sản phẩm mới. Bạn chỉ có các mô hình lớp cho bối cảnh danh mục và bối cảnh tìm kiếm.
Giải pháp của tôi (đã được thử nghiệm và hoạt động) liên quan đến việc viết một mô-đun sẽ liệt kê tất cả các sản phẩm được đánh dấu là mới trong một trang và có một mô hình lớp xử lý bộ sưu tập sản phẩm mới.
Ở đây đi. hãy chuẩn bị nó một cái dài
Tôi gọi phần mở rộng StackExchange_NewProducts
nhưng cảm thấy tự do để thay đổi tên.
Bạn sẽ cần các tệp sau:
app/etc/modules/StackExchange_NewProducts.xml
- hồ sơ khai báo:
<?xml version="1.0"?>
<config>
<modules>
<StackExchange_NewProducts>
<codePool>local</codePool>
<active>true</active>
<depends>
<Mage_Catalog />
</depends>
</StackExchange_NewProducts>
</modules>
</config>
app/code/local/StackExchange/NewProducts/etc/config.xml
- tập tin cấu hình
<?xml version="1.0"?>
<config>
<modules>
<StackExchange_NewProducts>
<version>1.0.0</version>
</StackExchange_NewProducts>
</modules>
<global>
<models>
<stackexchange_newproducts>
<class>StackExchange_NewProducts_Model</class>
</stackexchange_newproducts>
</models>
<blocks>
<stackexchange_newproducts>
<class>StackExchange_NewProducts_Block</class>
</stackexchange_newproducts>
</blocks>
<helpers>
<stackexchange_newproducts>
<class>StackExchange_NewProducts_Helper</class>
</stackexchange_newproducts>
</helpers>
<events>
<controller_front_init_routers> <!-- create a custom router to handle the 'new-products' url -->
<observers>
<stackexchange_newproducts>
<class>StackExchange_NewProducts_Controller_Router</class>
<method>initControllerRouters</method>
</stackexchange_newproducts>
</observers>
</controller_front_init_routers>
</events>
</global>
<frontend>
<routers> <!-- declare a router -->
<newproducts>
<use>standard</use>
<args>
<module>StackExchange_NewProducts</module>
<frontName>newproducts</frontName>
</args>
</newproducts>
</routers>
<layout>
<updates>
<stackexchange_newproducts>
<file>stackexchange_newproducts.xml</file>
</stackexchange_newproducts>
</updates>
</layout>
</frontend>
</config>
app/code/local/StackExchange/NewProducts/Controller/Router.php
- bộ định tuyến tùy chỉnh xử lý url new-products
và ánh xạ nó tới bộ điều khiển và hành động
<?php
class StackExchange_NewProducts_Controller_Router extends Mage_Core_Controller_Varien_Router_Abstract
{
const NEW_PRODUCTS_URL_KEY = 'new-products';
public function initControllerRouters($observer)
{
$front = $observer->getEvent()->getFront();
$front->addRouter('stackexchange_newproducts', $this);
return $this;
}
public function match(Zend_Controller_Request_Http $request)
{
if (!Mage::isInstalled()) {
Mage::app()->getFrontController()->getResponse()
->setRedirect(Mage::getUrl('install'))
->sendResponse();
exit;
}
$urlKey = trim($request->getPathInfo(), '/');
if ($urlKey == self::NEW_PRODUCTS_URL_KEY) {
$request->setModuleName('newproducts')
->setControllerName('index')
->setActionName('index');
$request->setAlias(
Mage_Core_Model_Url_Rewrite::REWRITE_REQUEST_PATH_ALIAS,
$urlKey
);
return true;
}
return false;
}
}
app/code/local/StackExchange/NewProducts/controllers/IndexController.php
- bộ điều khiển thực tế hiển thị các sản phẩm mới
<?php
class StackExchange_NewProducts_IndexController extends Mage_Core_Controller_Front_Action
{
public function indexAction()
{
$this->loadLayout();
$this->renderLayout();
}
}
app/code/local/StackExchange/NewProducts/Helper/Data.php
- người trợ giúp chung mô-đun
<?php
class StackExchange_NewProducts_Helper_Data extends Mage_Core_Helper_Abstract
{
}
app/design/frontend/base/default/layout/stackexchange_newproducts.xml
- tệp bố trí mô-đun xác định nội dung của trang
<?xml version="1.0"?>
<layout>
<newproducts_index_index>
<reference name="root">
<action method="setTemplate">
<template>page/2columns-left.phtml</template>
</action>
</reference>
<reference name="left">
<block type="stackexchange_newproducts/layer_new" name="catalog.leftnav" before="-" template="catalog/layer/view.phtml" />
</reference>
<reference name="content">
<block type="core/template" name="new_products_container" as="new_products_container" template="stackexchange_newproducts/container.phtml">
<action method="setTitle" translate="title" module="stackexchange_newproducts">
<title>New Products</title>
</action>
<block type="stackexchange_newproducts/new" name="new_product" as="new_products" template="catalog/product/list.phtml">
<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="addColumnCountLayoutDepend"><layout>empty</layout><count>6</count></action>
<action method="addColumnCountLayoutDepend"><layout>one_column</layout><count>5</count></action>
<action method="addColumnCountLayoutDepend"><layout>two_columns_left</layout><count>4</count></action>
<action method="addColumnCountLayoutDepend"><layout>two_columns_right</layout><count>4</count></action>
<action method="addColumnCountLayoutDepend"><layout>three_columns</layout><count>3</count></action>
<action method="setToolbarBlockName"><name>product_list_toolbar</name></action>
</block>
</block>
</reference>
</newproducts_index_index>
</layout>
app/code/local/StackExchange/NewProducts/Block/New.php
- khối sẽ kết xuất bộ sưu tập sản phẩm mới:
<?php
class StackExchange_NewProducts_Block_New extends Mage_Catalog_Block_Product_List
{
public function __construct()
{
parent::__construct();
}
public function getModuleName()
{
return 'Mage_Catalog';
}
protected function _getProductCollection()
{
if (is_null($this->_productCollection)) {
$this->_productCollection = $this->getLayer()->getProductCollection();
}
return $this->_productCollection;
}
public function getLayer()
{
$layer = Mage::registry('current_layer');
if ($layer) {
return $layer;
}
return Mage::getSingleton('stackexchange_newproducts/layer');
}
}
app/code/local/StackExchange/NewProducts/Block/Layer/New.php
- khối lớp sẽ được hiển thị ở phía bên trái (bộ lọc)
<?php
class StackExchange_NewProducts_Block_Layer_New extends Mage_Catalog_Block_Layer_View
{
public function getLayer()
{
if (!$this->hasData('_layer')){
$layer = Mage::getSingleton('stackexchange_newproducts/layer');
$this->setData('_layer', $layer);
}
return $this->getData('_layer');
}
protected function _initBlocks()
{
parent::_initBlocks();
$this->_attributeFilterBlockName = 'stackexchange_newproducts/layer_filter_attribute';
$this->_priceFilterBlockName = 'stackexchange_newproducts/layer_filter_price';
$this->_decimalFilterBlockName = 'stackexchange_newproducts/layer_filter_decimal';
}
protected function _prepareLayout()
{
$stateBlock = $this->getLayout()->createBlock($this->_stateBlockName)
->setLayer($this->getLayer());
$this->setChild('layer_state', $stateBlock);
$filterableAttributes = $this->_getFilterableAttributes();
foreach ($filterableAttributes as $attribute) {
if ($attribute->getAttributeCode() == 'price') {
$filterBlockName = $this->_priceFilterBlockName;
} elseif ($attribute->getBackendType() == 'decimal') {
$filterBlockName = $this->_decimalFilterBlockName;
} else {
$filterBlockName = $this->_attributeFilterBlockName;
}
$this->setChild($attribute->getAttributeCode() . '_filter',
$this->getLayout()->createBlock($filterBlockName)
->setLayer($this->getLayer())
->setAttributeModel($attribute)
->init());
}
$this->getLayer()->apply();
return $this;
}
}
bây giờ mỗi loại thuộc tính cần một khối bộ lọc liên quan đến nó:
app/code/local/StackExchange/NewProducts/Block/Layer/Filter/Attribute.php
- khối bộ lọc chung cho các thuộc tính
<?php
class StackExchange_NewProducts_Block_Layer_Filter_Attribute extends Mage_Catalog_Block_Layer_Filter_Attribute
{
public function __construct()
{
parent::__construct();
$this->_filterModelName = 'stackexchange_newproducts/layer_filter_attribute';
}
}
app/code/local/StackExchange/NewProducts/Block/Layer/Filter/Decimal.php
- khối bộ lọc cho các thuộc tính thập phân
<?php
class StackExchange_NewProducts_Block_Layer_Filter_Decimal extends Mage_Catalog_Block_Layer_Filter_Decimal
{
public function __construct()
{
parent::__construct();
$this->_filterModelName = 'stackexchange_newproducts/layer_filter_decimal';
}
}
app/code/local/StackExchange/NewProducts/Block/Layer/Filter/Price.php
- khối bộ lọc cho thuộc tính giá
<?php
class StackExchange_NewProducts_Block_Layer_Filter_Price extends Mage_Catalog_Block_Layer_Filter_Price
{
public function __construct()
{
parent::__construct();
$this->_filterModelName = 'stackexchange_newproducts/layer_filter_price';
}
}
app/code/local/StackExchange/NewProducts/Model/Layer.php
- mô hình lớp để xử lý các sản phẩm mới
<?php
class StackExchange_NewProducts_Model_Layer extends Mage_Catalog_Model_Layer
{
public function getStateKey()
{
if ($this->_stateKey === null) {
$this->_stateKey = 'STORE_'.Mage::app()->getStore()->getId()
. '_NEW_PRODUCTS_'
. '_CUSTGROUP_' . Mage::getSingleton('customer/session')->getCustomerGroupId();
}
return $this->_stateKey;
}
public function getStateTags(array $additionalTags = array())
{
$additionalTags = array_merge($additionalTags, array('new_products'));
return $additionalTags;
}
public function getProductCollection()
{
if (isset($this->_productCollections['new_products'])) {
$collection = $this->_productCollections['new_products'];
} else {
$collection = $this->_getCollection();
$this->prepareProductCollection($collection);
$this->_productCollections['new_products'] = $collection;
}
return $collection;
}
public function prepareProductCollection($collection)
{
$collection
->addAttributeToSelect(Mage::getSingleton('catalog/config')->getProductAttributes())
->addMinimalPrice()
->addFinalPrice()
->addTaxPercents()
->addUrlRewrite();
Mage::getSingleton('catalog/product_status')->addVisibleFilterToCollection($collection);
Mage::getSingleton('catalog/product_visibility')->addVisibleInCatalogFilterToCollection($collection);
return $this;
}
protected function _getCollection()
{
$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::getModel('catalog/product')->getCollection()
->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');
return $collection;
}
}
Giống như mỗi thuộc tính cần một khối cho các bộ lọc, nó cũng cần một mô hình để xử lý các bộ lọc:
app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Attribute.php
- mô hình bộ lọc thuộc tính chung
<?php
class StackExchange_NewProducts_Model_Layer_Filter_Attribute extends Mage_Catalog_Model_Layer_Filter_Attribute
{
protected function _createItem($label, $value, $count = 0)
{
return Mage::getModel('stackexchange_newproducts/layer_filter_item')
->setFilter($this)
->setLabel($label)
->setValue($value)
->setCount($count);
}
}
app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Decimal.php
- mô hình bộ lọc thuộc tính thập phân
<?php
class StackExchange_NewProducts_Model_Layer_Filter_Decimal extends Mage_Catalog_Model_Layer_Filter_Attribute
{
protected function _createItem($label, $value, $count = 0)
{
return Mage::getModel('stackexchange_newproducts/layer_filter_item')
->setFilter($this)
->setLabel($label)
->setValue($value)
->setCount($count);
}
}
app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Price.php
- mô hình bộ lọc thuộc tính giá
<?php
class StackExchange_NewProducts_Model_Layer_Filter_Price extends Mage_Catalog_Model_Layer_Filter_Price
{
protected function _createItem($label, $value, $count = 0)
{
return Mage::getModel('stackexchange_newproducts/layer_filter_item')
->setFilter($this)
->setLabel($label)
->setValue($value)
->setCount($count);
}
}
app/code/local/StackExchange/NewProducts/Model/Layer/Filter/Item.php
- các bộ lọc yêu cầu một bộ sưu tập các đối tượng mục. đây là đối tượng mục - không chắc chắn nếu điều này là cần thiết. Tôi nghĩ rằng mô hình mục danh mục mặc định có thể được sử dụng.
<?php
class StackExchange_NewProducts_Model_Layer_Filter_Item extends Mage_Catalog_Model_Layer_Filter_Item
{
}
app/design/frontend/base/default/template/stackexchange_newproducts/container.phtml
- một tệp mẫu hoạt động như một thùng chứa cho các sản phẩm mới để bạn có thể đặt tiêu đề và hiển thị thông báo phiên.
<?php if ($this->getTitle()) : ?>
<div class="page-title category-title">
<h1><?php echo $this->getTitle() ?></h1>
</div>
<?php endif;?>
<?php echo $this->getMessagesBlock()->getGroupedHtml() ?>
<?php echo $this->getChildHtml();?>
Đó là nó. Xóa bộ nhớ cache sau khi bạn tạo tất cả các tệp và vô hiệu hóa quá trình biên dịch.
Đây là một ảnh chụp màn hình về phía nó trông như thế nào
. (sử dụng ce 1.7 với dữ liệu mẫu)