我正在优化magento商店,我遇到了一些帖子,建议对具有大量SKU的商店使用Flat Product Catalog。
由于我有超过10K的产品,我想我会尝试一下。但是,在使用平面产品目录时,只会在产品对象中加载少数几个属性(例如,SKU,名称,简短描述)。我的模板在搜索/浏览视图中显示了一些其他属性,例如制造商和颜色。
有没有办法将这些属性添加到平面产品目录表中,以便可以访问它们?
答案 0 :(得分:44)
1.4.xx,只需进入“平面产品目录”中要使用的属性,并确保“在产品列表中使用”属性为设为是。进行更改后,重新索引“平面产品数据”
以下属性会导致该属性包含在“Flat Product Catalog”中:
"Use in Layered Navigation" = Yes
"Used in Product Listing" = Yes
"Used for Sorting in Product Listing" = Yes
答案 1 :(得分:10)
我也一直在解决这个问题,我将其描述为“无法在平面模式下访问产品集合属性”或“addAttributeToSelect无法在平面模式下工作”。
我找到了一个“干净”的解决方案:
请注意 - 在下面的代码中我使用了相关的产品系列,但这适用于任何产品系列(特别是从Mage_Eav_Model_Entity_Collection_Abstract
继承的任何产品)
代码失败:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->addAttributeToSelect( 'my_custom_attribute' )
;
在平面模式下,如果该属性不在平面表中,则上述代码无法添加该属性。
工作代码:
$_product = Mage::getModel('catalog/product')->loadByAttribute( 'sku', 'ABC123' );
$coll = $_product->getTypeInstance()->getAssociatedProductCollection()
->joinAttribute( 'my_custom_attribute', 'catalog_product/my_custom_attribute', 'entity_id', null, 'left' )
->addAttributeToSelect( 'my_custom_attribute' )
;
joinAttribute
方法为查询添加联接。即使这复制了已经在平面表中的属性,它仍然有效。
请注意,我在那里使用了left
加入,以确保在未在这些产品上设置my_custom_attribute
时获取产品。如果您只对设置了inner
的行感兴趣,则可以更改my_custom_attribute
的内容。
(在CE 1.6.2.0中测试)
答案 2 :(得分:5)
其他人已经提供了通常足够的答案(将产品列表中的使用设置为是),但是我发现了一个边缘案例,在我搜索同样的东西时会很有用。
如果要将自定义源模型用于要包含在平面产品表中的自定义属性,则必须覆盖源模型类中的getFlatColums()
。是的,我知道它拼错了,但那是你原生的Magento。
<强>示例强>:
public function getFlatColums() {
return array($this->getAttribute()->getAttributeCode() => array(
'type' => 'tinyint',
'unsigned' => true,
'is_null' => true,
'default' => null,
'extra' => null
));
}
答案 3 :(得分:2)
如果要在使用平面产品表(例如过滤产品集合)时使用模块中的属性,可以将其添加到模块的Module_File.xml
<?xml version="1.0"?>
<config>
<modules>
<Your_Module>
<active>true</active>
<codePool>local</codePool>
</Your_Module>
</modules>
<frontend>
<product>
<collection>
<attributes>
<your_custom_attribute /> <!-- This is the attribute name -->
</attributes>
</collection>
</product>
</frontend>
</config>