Kurumsal 1.14.1 Kategori sayfalarında 35 sn artı yükleme süresine neden olan renk örnekleri


23

Yeni dahili Renk Örnekleri özelliğini en son yeni site yapımızda uyguladık. Kategori sayfalarındaki renk örneklerini etkinleştirdiğimizde, sayfa yükleme süresi 2 saniyeden 38 + saniyeye çıkar.

Başka birinin bu sorunu yaşayıp yaşamadığını ve eğer öyleyse bize olası çözümlerin bir göstergesi olabilir mi diye merak ediyordum

EE 1.14.1 ve CE 1.9.1'i standart rwd temasına uygulanmış ve aktif başka modüller olmadan 36 yapılandırılabilir ürünle denedik.

Bu sorun, bir kullanıcı her kategoriyi aradığında veya filtrelediğinde sayfanın tekrar durması için önbelleğe alınması ile çözülemez.


Bunu çoğaltamam. Lütfen bize yüklenen eklentilerin türü, tema vb. Konusunda biraz daha yön verin. Lütfen temanızı devre dışı bırakarak, yerel modülleri devre dışı bırakıp yeniden deneyerek Magento hata ayıklama işlemini izleyin .
philwinkle,

Kullandığımız özellikler, renk örnekleri ve ürün başına 8'den fazla olmayan ve çoğu durumda 4'ten fazla olmayan renk örnekleridir. Bu, örnek veriler yüklü ve özel renk örnekleriyle birlikte 10 yapılandırılabilir ürün içeren boş bir magento CE 1.9.1 kurulumunda çalıştırılmaktadır. katma. Biz kesinlikle renk örnekleri ile ilişkili olarak daha fazla eklediğimiz sitenin yavaşlar. Lütfen kullanıcılar aramaya filtre uygulayabildiğinden ve bir kullanıcının aramasını değiştirdiğinde çılgınca bir yükleme süresine sahip olamayacağımızdan, önbelleğe alma işleminin kapatıldığını unutmayın. Zaman ayırdığınız için teşekkürler :)
Dave Bevington

Yanıtlar:


22

Sağ. Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping işlevinde sorunu tespit ediyorum.

Üzerinde bazı değişiklikler yapıyorum. Bu performansı arttırır.

Deneyin:

  1. Kopya /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.phpiçin /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. Açık /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.phpdosyaya taşımak bu kodu (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);

    foreachdöngü öncesine kadar .

Değişen yöntem şudur:

 /**
 * 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
}

Liste sayfalarında etkin olan renk örneklerinde de aynı sorunu yaşıyordum ve bu durum işleri hızlandırmaya yardımcı oldu, bu yüzden teşekkürler!
Marlon Creative,

Ben de aynı sorunu buldum. çözümlenmesi sayfa yüklenmesini 2,5 dakikadan 7 saniyeye çıkardı.
Andrew Kett,

Bu renk örnekleri, özellikle çok fazla eşleştirilebilir ürününüz olduğunda kategorileri yavaşlatır. Андрей М. 'in çözümü yapılandırılabilir ürünlerle dolu bir kategorideki yüklemeyi 10 ile 3 saniye arasında kesin! Teşekkür ederim!
user1895954 11:15

1! Bunu paylaştığın için teşekkürler. Her biri çeşitli seçeneklerle yapılandırılabilir bir çok şey kullanıyoruz ve artık renk örneklerini kullanamadık ...
Marc

1! Kesinlikle mükemmel cevap, yükleme süresi 28 saniyeden 3 saniyeye çıktı! Teşekkür ederim!!
KI

4

Çok fazla öznitelik seçeneğiniz olduğunda performansı yapılandırılabilir renk örneklerini iyileştirmenin ek yolu.

Örneğin, 2000 seçeneğiniz varsa ve katalog listesinde 36 ürün gösterirseniz, bu durumda yöntem Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()her super_attributes seçenek etiketine katılır ve 2000 * 36 = 72000 satır alırsınız.

Bu yöntemi yeniden yazdım ve 72000 yerine yalnızca 2000 satır yüklüyor

<?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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.