Enterprise 1.14.1 Swatches ก่อให้เกิด 35 วินาทีรวมทั้งความเร็วในการโหลดในหน้าหมวดหมู่


23

เราได้นำคุณสมบัติ inbuilt Swatches ใหม่ในการสร้างเว็บไซต์ใหม่ล่าสุดของเราเมื่อเราเปิดใช้งาน swatches ในหน้าหมวดหมู่เวลาในการโหลดหน้าเว็บจะเปลี่ยนจาก 2 วินาทีเป็น 38 + วินาที

ฉันสงสัยว่ามีคนอื่นเคยมีปัญหานี้หรือไม่และถ้าเป็นเช่นนั้นจะให้ข้อบ่งชี้วิธีแก้ปัญหาที่เป็นไปได้กับเรา

เราได้ลอง EE 1.14.1 และ CE 1.9.1 ด้วยผลิตภัณฑ์ที่กำหนดค่าได้ 36 รายการโดยใช้ swatches ในธีม rwd มาตรฐานและไม่มีโมดูลอื่นที่ใช้งานได้

ปัญหานี้ไม่สามารถแก้ไขได้โดยการแคชเนื่องจากทุกครั้งที่ผู้ใช้ค้นหาหรือกรองหมวดหมู่หน้าเว็บจะหยุดชะงักอีกครั้ง


ฉันไม่สามารถทำซ้ำได้ โปรดระบุทิศทางเพิ่มเติมเกี่ยวกับประเภทของปลั๊กอินที่ติดตั้งชุดรูปแบบ ฯลฯ โปรดทำตามขั้นตอนการดีบัก Magentoโดยปิดการใช้งานธีมของคุณปิดการใช้งานโมดูลในเครื่องและลองอีกครั้ง
philwinkle

คุณลักษณะที่เรากำลังใช้คือชุดสีและขนาดไม่เกิน 8 ต่อรายการและในกรณีส่วนใหญ่ไม่เกิน 4 สิ่งนี้กำลังดำเนินการในการติดตั้ง magento CE 1.9.1 เปล่าพร้อมกับโหลดข้อมูลตัวอย่างและผลิตภัณฑ์ที่กำหนดค่าได้ 10 รายการพร้อม swatches แบบกำหนดเอง ที่เพิ่ม มันเกี่ยวข้องกับ swatches แน่นอนยิ่งเราเพิ่มไซต์ที่ช้าลงก็ยิ่งได้รับ โปรดทราบว่าการแคชถูกปิดใช้งานเพื่อทดสอบสิ่งนี้เนื่องจากผู้ใช้สามารถกรองการค้นหาและเราไม่สามารถมีความเร็วในการโหลดที่บ้าคลั่งในแต่ละครั้งที่ผู้ใช้ปรับแต่งการค้นหา ขอบคุณสำหรับเวลา :)
Dave Bevington

คำตอบ:


22

ขวา. ฉันตรวจพบปัญหาเกี่ยวกับฟังก์ชัน Mage_ConfigurableSwatches_Helper_Mediafallback :: AttachConfigurableProductChildrenAttributeMapping

ฉันทำการเปลี่ยนแปลงบางอย่างกับมัน ประสิทธิภาพที่เพิ่มขึ้นนี้

ลอง:

  1. คัดลอกไป/app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.php /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php

  2. เมื่อ/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
}

ฉันมีปัญหาเดียวกันกับการเปิดใช้งาน swatches ในหน้ารายการและสิ่งนี้ช่วยเร่งความเร็วของสิ่งต่าง ๆ ได้อย่างมากขอบคุณมาก!
Marlon Creative

ฉันพบปัญหาเดียวกัน การแก้ไขมันใช้เวลาโหลดหน้าเว็บจาก 2.5 นาทีถึง 7 วินาที
Andrew Kett

เสื้อโค้ตเหล่านี้ช้าลงโดยเฉพาะอย่างยิ่งหมวดหมู่โดยเฉพาะอย่างยิ่งเมื่อคุณมีผลิตภัณฑ์ที่น่าจดจำมากมาย ทางออกของАндрей М. ลดการโหลดจาก 10 เป็น 3 วินาทีในหมวดที่เต็มไปด้วยผลิตภัณฑ์ที่สามารถกำหนดค่าได้ ขอขอบคุณ!
user1895954

+1! ขอบคุณที่แบ่งปันสิ่งนี้ เรากำลังใช้การกำหนดค่าได้มากมายด้วยตัวเลือกหลายตัวและไม่สามารถใช้การเปลี่ยนสีได้อีกต่อไป ...
Marc

+1! คำตอบที่ยอดเยี่ยมอย่างแน่นอนเวลาโหลดเปลี่ยนจาก 28 วินาทีเป็น 3 วินาที! ขอขอบคุณ!!
KI

4

วิธีเพิ่มเติมในการปรับปรุง swatches ที่กำหนดค่าประสิทธิภาพได้เมื่อคุณมีตัวเลือกคุณลักษณะมากมาย

ตัวอย่างเช่นถ้าคุณมี 2,000 ตัวเลือกและแสดง 36 ผลิตภัณฑ์ในรายการแคตตาล็อกในกรณีนี้ Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()จะเข้าร่วมกับป้ายกำกับตัวเลือก super_attributes และคุณจะได้รับแถว 2000 * 36 = 72000 แถว

ฉันเขียนวิธีนี้ใหม่และโหลดได้เพียง 2,000 แถวแทน 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;
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.