我们在最新的新站点构建中实现了新的内置色板功能。在类别页面上启用色板时,页面加载时间从2秒变为38 +秒。
我想知道是否还有其他人遇到过这个问题,是否可以给我们指出任何可能的解决方案?
我们已经尝试了EE 1.14.1和CE 1.9.1,并在标准rwd主题上使用了36种可配置产品和色板,并且没有其他模块处于活动状态。
每次用户搜索或过滤类别时,都无法通过缓存来解决此问题,页面再次陷入停顿。
我们在最新的新站点构建中实现了新的内置色板功能。在类别页面上启用色板时,页面加载时间从2秒变为38 +秒。
我想知道是否还有其他人遇到过这个问题,是否可以给我们指出任何可能的解决方案?
我们已经尝试了EE 1.14.1和CE 1.9.1,并在标准rwd主题上使用了36种可配置产品和色板,并且没有其他模块处于活动状态。
每次用户搜索或过滤类别时,都无法通过缓存来解决此问题,页面再次陷入停顿。
Answers:
对。我在Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping函数上检测到问题。
我对此进行一些更改。这样可以提高性能。
复制/app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.php
到
/app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php
。
在/app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php
文件移动代码(ll.88-91)
// normalize to all lower case before we start using them
$optionLabels = array_map(function ($value) {
return array_map('Mage_ConfigurableSwatches_Helper_Data::normalizeKey', $value);
}, $optionLabels);
直到foreach
循环之前。
/**
* Set child_attribute_label_mapping on products with attribute label -> product mapping
* Depends on following product data:
* - product must have children products attached
*
* @param array $parentProducts
* @param $storeId
* @return void
*/
public function attachConfigurableProductChildrenAttributeMapping(array $parentProducts, $storeId)
{
$listSwatchAttr = Mage::helper('configurableswatches/productlist')->getSwatchAttribute();
$parentProductIds = array();
/* @var $parentProduct Mage_Catalog_Model_Product */
foreach ($parentProducts as $parentProduct) {
$parentProductIds[] = $parentProduct->getId();
}
$configAttributes = Mage::getResourceModel('configurableswatches/catalog_product_attribute_super_collection')
->addParentProductsFilter($parentProductIds)
->attachEavAttributes()
->setStoreId($storeId)
;
$optionLabels = array();
foreach ($configAttributes as $attribute) {
$optionLabels += $attribute->getOptionLabels();
}
// normalize to all lower case before we start using them
$optionLabels = array_map(function ($value) {
return array_map('Mage_ConfigurableSwatches_Helper_Data::normalizeKey', $value);
}, $optionLabels);
foreach ($parentProducts as $parentProduct) {
$mapping = array();
$listSwatchValues = array();
/* @var $attribute Mage_Catalog_Model_Product_Type_Configurable_Attribute */
foreach ($configAttributes as $attribute) {
/* @var $childProduct Mage_Catalog_Model_Product */
if (!is_array($parentProduct->getChildrenProducts())) {
continue;
}
foreach ($parentProduct->getChildrenProducts() as $childProduct) {
// product has no value for attribute, we can't process it
if (!$childProduct->hasData($attribute->getAttributeCode())) {
continue;
}
$optionId = $childProduct->getData($attribute->getAttributeCode());
// if we don't have a default label, skip it
if (!isset($optionLabels[$optionId][0])) {
continue;
}
// using default value as key unless store-specific label is present
$optionLabel = $optionLabels[$optionId][0];
if (isset($optionLabels[$optionId][$storeId])) {
$optionLabel = $optionLabels[$optionId][$storeId];
}
// initialize arrays if not present
if (!isset($mapping[$optionLabel])) {
$mapping[$optionLabel] = array(
'product_ids' => array(),
);
}
$mapping[$optionLabel]['product_ids'][] = $childProduct->getId();
$mapping[$optionLabel]['label'] = $optionLabel;
$mapping[$optionLabel]['default_label'] = $optionLabels[$optionId][0];
$mapping[$optionLabel]['labels'] = $optionLabels[$optionId];
if ($attribute->getAttributeId() == $listSwatchAttr->getAttributeId()
&& !in_array($mapping[$optionLabel]['label'], $listSwatchValues)
) {
$listSwatchValues[$optionId] = $mapping[$optionLabel]['label'];
}
} // end looping child products
} // end looping attributes
foreach ($mapping as $key => $value) {
$mapping[$key]['product_ids'] = array_unique($mapping[$key]['product_ids']);
}
$parentProduct->setChildAttributeLabelMapping($mapping)
->setListSwatchAttrValues($listSwatchValues);
} // end looping parent products
}
当您有很多属性选项时,提高性能的可配置色板的其他方法。
例如,如果您有2000个选项并在目录列表中显示36个产品,则在这种情况下,方法Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()
将加入到每个super_attributes选项标签中,并且您将获得2000 * 36 = 72000行。
我重写了此方法,它仅加载2000行而不是72000
<?php
/**
* Load attribute option labels for current store and default (fallback)
*
* @return $this
*/
protected function _loadOptionLabels()
{
if ($this->count()) {
$labels = $this->_getOptionLabels();
foreach ($this->getItems() as $item) {
$item->setOptionLabels($labels);
}
}
return $this;
}
/**
* Get Option Labels
*
* @return array
*/
protected function _getOptionLabels()
{
$attributeIds = $this->_getAttributeIds();
$select = $this->getConnection()->select();
$select->from(array('options' => $this->getTable('eav/attribute_option')))
->join(
array('labels' => $this->getTable('eav/attribute_option_value')),
'labels.option_id = options.option_id',
array(
'label' => 'labels.value',
'store_id' => 'labels.store_id',
)
)
->where('options.attribute_id IN (?)', $attributeIds)
->where(
'labels.store_id IN (?)',
array(Mage_Catalog_Model_Abstract::DEFAULT_STORE_ID, $this->getStoreId())
);
$resultSet = $this->getConnection()->query($select);
$labels = array();
while ($option = $resultSet->fetch()) {
$labels[$option['option_id']][$option['store_id']] = $option['label'];
}
return $labels;
}
/**
* Get Attribute IDs
*
* @return array
*/
protected function _getAttributeIds()
{
$attributeIds = array();
foreach ($this->getItems() as $item) {
$attributeIds[] = $item->getAttributeId();
}
$attributeIds = array_unique($attributeIds);
return $attributeIds;
}