Tôi đã tạo một mô-đun để ghi đè \ Mage_ConfigurableSwatches_Model_Resource_Catalog_ Productt_Attribution_Super_Collection :: _ loadOptionLabels bằng cách sau:
protected function _loadOptionLabels()
{
if ($this->count()) {
$attributeIds = array();
$productId = false;
$filterLabels = false;
foreach ($this->_items as $item) {
$attributeIds[] = $item->getAttributeId();
$id = $item->getProductId();
$productId[$id] = $id;
}
if (is_array($productId) && $attributeIds) {
$filterLabels = true;
}
if ($filterLabels) {
$productIntTable = 'catalog_product_entity_int';
$select = $this->getConnection()->select()
->from(array('l' => $this->getTable('catalog/product_super_link')), array('i.value'))
->join(
array('i' => Mage::getSingleton('core/resource')->getTableName($productIntTable)),
'i.entity_id = l.product_id'
)
->where('l.parent_id IN (?)', array_keys($productId))
->where('i.attribute_id IN (?)', $attributeIds);
$optionIdsToSelect = $this->getConnection()->fetchCol($select);
}
$select = $this->getConnection()->select()
->from(
array('attr' => $this->getTable('catalog/product_super_attribute')),
array(
'product_super_attribute_id' => 'attr.product_super_attribute_id',
)
)
->join(
array('opt' => $this->getTable('eav/attribute_option')),
'opt.attribute_id = attr.attribute_id',
array(
'attribute_id' => 'opt.attribute_id',
'option_id' => 'opt.option_id',
)
)
->join(
array('lab' => $this->getTable('eav/attribute_option_value')),
'lab.option_id = opt.option_id',
array(
'label' => 'lab.value',
'store_id' => 'lab.store_id',
)
)
->where('attr.product_super_attribute_id IN (?)', array_keys($this->_items));
if ($filterLabels) {
$select->where('opt.option_id IN (?)', $optionIdsToSelect);
}
$result = $this->getConnection()->fetchAll($select);
Mage::getSingleton('core/resource_iterator')->walk(
$select,
array(function($args){
$data = $args['row'];
$item = $this->getItemById($data['product_super_attribute_id']);
if (!is_array($labels = $item->getOptionLabels())) {
$labels = array();
}
$labels[$data['option_id']][$data['store_id']] = $data['label'];
$item->setOptionLabels($labels);
})
);
}
return $this;
}
Tôi đã lọc truy vấn và thay thế foreach bằng iterator.
Nó mang lại cho tôi khoảng 24 đến 40 hồ sơ cho mỗi sản phẩm, thay vì 23.000. :)
Mô-đun này cũng thực hiện các cuộc gọi không cần thiết trong danh sách sản phẩm khi bạn không có thiết lập để hiển thị bất cứ điều gì trong danh sách sản phẩm. Có thể viết lại Mage_ConfigurableSwatches_Model_Observer :: productListCollectionLoadAfter để kiểm tra xem configswatches / general / product_list_attribution có tải thuộc tính nào không.