按类别对产品排序(在 parent 类别视图中)
Sort products by category (in parent category view)
我有一个非常独特的问题。
我有一家商店,在这样的设置中有多个类别
Collection
.... Shorts (products: small 16 - RED and small 20 - BLUE)
.... Dress (products: blue: 16 , Green 19)
如果我在商店里打开Collection,我会得到这样的物品
Blue 16
Green 19
small 16 - RED
small 20 - BLUE
我希望我的输出是这样的:
small 16 - RED
small 20 - BLUE
Blue 16
Green 19
我怎样才能得到这个结果?抱歉,我没有提供任何代码,因为我不知道应该如何实现这个
我认为你应该从管理员创建一个属性,
从 Admin->Catalog->Attributes->Manage Attributes.
创建属性 custom_order
产品列表中使用的设置 = 是
用于产品列表中的排序 = 是
为每个产品单独分配位置值。
然后转到管理->目录->管理类别。
select一个类别,点击显示设置选项卡,
设置"Default Product Listing Sort By"custom_order
我在做类似的事情。
在 Magento 管理中,您可以手动设置产品在类别页面上的显示顺序。
- 目录 -> 管理类别(select 您的类别)
- 在 "Category Products" 选项卡下,您会看到一个 table,其中包含分配给该类别的所有产品,在最右侧有一列名为 "Position"。您可以在此处输入一个整数值,数字越小,产品在类别页面上的排名就越高。
1 在 catalog_block_product_list_collection 事件上创建观察者
<events>
<catalog_block_product_list_collection>
<observers>
<namespace_module>
<class> namespace_module/observer</class>
<method>collectionList</method>
</namespace_module >
</observers>
</catalog_block_product_list_collection>
</events>
2 创建 class Namespace_Module_Model_Observer
class Namespace_Module_Model_Observer
{
public function collectionList($observer)
{
/** @var Mage_Catalog_Model_Category $currentCategory */
$currentCategory = Mage::registry('current_category');
$children = Mage::getResourceModel('catalog/category')->getChildrenIds($currentCategory);
if (!$children) {
return $this;
}
$children = implode(',', $children);
/** @var Mage_Catalog_Model_Resource_Product_Collection $collection */
$collection = $observer->getCollection();
$attr = $this->_getAttribute('name');
$collection->getSelect()
->join(
array('c' => $this->_getResource()->getTableName('catalog_category_product')),
"c.product_id = e.entity_id AND c.category_id IN ($children)",
array('child_category_id' => 'category_id')
)
->join(
array('ac' => $this->_getResource()->getTableName('catalog_category_entity_' . $attr['backend_type'])),
"c.category_id = ac.entity_id AND ac.attribute_id = {$attr['attribute_id']}",
array('child_category_name' => 'value')
)
->order('child_category_name DESC');
return $this;
}
protected function _getAttribute($attributeCode, $static = true, $entityTypeId = 3)
{
$readAdapter = $this->_getReadAdapter();
$select = $readAdapter->select()
->from($this->_getResource()->getTableName('eav/attribute'))
->reset(Zend_Db_Select::COLUMNS)
->columns(array('attribute_id', 'backend_type'))
->where('entity_type_id = ?', $entityTypeId)
->where('attribute_code = ?', $attributeCode)
->limit(1);
if (!$static) {
$select->where('backend_type != ?', 'static');
}
$entityId = $readAdapter->query($select)->fetch();
return $entityId;
}
protected function _getResource()
{
return Mage::getSingleton('core/resource');
}
protected function _getReadAdapter()
{
return $this->_getResource()->getConnection('core_read');
}
}
这里我们设置集合按子类别名称排序,您可以将其更改为类别id或将任何类别属性添加到集合中并按此属性排序
->order('child_category_name DESC');
这只是如何快速按子类别对产品集合进行排序的示例,当然您可以在工具栏中添加选项并对集合进行动态排序
我有一个非常独特的问题。
我有一家商店,在这样的设置中有多个类别
Collection
.... Shorts (products: small 16 - RED and small 20 - BLUE)
.... Dress (products: blue: 16 , Green 19)
如果我在商店里打开Collection,我会得到这样的物品
Blue 16
Green 19
small 16 - RED
small 20 - BLUE
我希望我的输出是这样的:
small 16 - RED
small 20 - BLUE
Blue 16
Green 19
我怎样才能得到这个结果?抱歉,我没有提供任何代码,因为我不知道应该如何实现这个
我认为你应该从管理员创建一个属性,
从 Admin->Catalog->Attributes->Manage Attributes.
创建属性custom_order
产品列表中使用的设置 = 是 用于产品列表中的排序 = 是
为每个产品单独分配位置值。
然后转到管理->目录->管理类别。
select一个类别,点击显示设置选项卡,
设置"Default Product Listing Sort By"custom_order
我在做类似的事情。
在 Magento 管理中,您可以手动设置产品在类别页面上的显示顺序。
- 目录 -> 管理类别(select 您的类别)
- 在 "Category Products" 选项卡下,您会看到一个 table,其中包含分配给该类别的所有产品,在最右侧有一列名为 "Position"。您可以在此处输入一个整数值,数字越小,产品在类别页面上的排名就越高。
1 在 catalog_block_product_list_collection 事件上创建观察者
<events>
<catalog_block_product_list_collection>
<observers>
<namespace_module>
<class> namespace_module/observer</class>
<method>collectionList</method>
</namespace_module >
</observers>
</catalog_block_product_list_collection>
</events>
2 创建 class Namespace_Module_Model_Observer
class Namespace_Module_Model_Observer
{
public function collectionList($observer)
{
/** @var Mage_Catalog_Model_Category $currentCategory */
$currentCategory = Mage::registry('current_category');
$children = Mage::getResourceModel('catalog/category')->getChildrenIds($currentCategory);
if (!$children) {
return $this;
}
$children = implode(',', $children);
/** @var Mage_Catalog_Model_Resource_Product_Collection $collection */
$collection = $observer->getCollection();
$attr = $this->_getAttribute('name');
$collection->getSelect()
->join(
array('c' => $this->_getResource()->getTableName('catalog_category_product')),
"c.product_id = e.entity_id AND c.category_id IN ($children)",
array('child_category_id' => 'category_id')
)
->join(
array('ac' => $this->_getResource()->getTableName('catalog_category_entity_' . $attr['backend_type'])),
"c.category_id = ac.entity_id AND ac.attribute_id = {$attr['attribute_id']}",
array('child_category_name' => 'value')
)
->order('child_category_name DESC');
return $this;
}
protected function _getAttribute($attributeCode, $static = true, $entityTypeId = 3)
{
$readAdapter = $this->_getReadAdapter();
$select = $readAdapter->select()
->from($this->_getResource()->getTableName('eav/attribute'))
->reset(Zend_Db_Select::COLUMNS)
->columns(array('attribute_id', 'backend_type'))
->where('entity_type_id = ?', $entityTypeId)
->where('attribute_code = ?', $attributeCode)
->limit(1);
if (!$static) {
$select->where('backend_type != ?', 'static');
}
$entityId = $readAdapter->query($select)->fetch();
return $entityId;
}
protected function _getResource()
{
return Mage::getSingleton('core/resource');
}
protected function _getReadAdapter()
{
return $this->_getResource()->getConnection('core_read');
}
}
这里我们设置集合按子类别名称排序,您可以将其更改为类别id或将任何类别属性添加到集合中并按此属性排序
->order('child_category_name DESC');
这只是如何快速按子类别对产品集合进行排序的示例,当然您可以在工具栏中添加选项并对集合进行动态排序