Perusahaan 1.14.1 Swatch menyebabkan 35 detik plus waktu muat pada halaman kategori

23

Kami telah menerapkan fitur Swatch inbuilt baru dalam pembuatan situs baru terbaru kami. Ketika kami mengaktifkan swatch pada halaman kategori, waktu buka halaman berubah dari 2 detik menjadi 38 + detik.

Saya bertanya-tanya apakah ada orang lain yang memiliki masalah ini dan apakah bisa memberikan indikasi solusi yang mungkin?

Kami telah mencoba EE 1.14.1 dan CE 1.9.1 dengan 36 produk yang dapat dikonfigurasi dengan swatch yang diterapkan pada tema standar rwd dan tidak ada modul lain yang aktif.

Masalah ini tidak dapat diatasi dengan caching karena setiap kali pengguna mencari atau memfilter suatu kategori, halaman akan berhenti lagi.

Dave Bevington
sumber
Saya tidak bisa mereproduksi ini. Tolong beri kami petunjuk lebih lanjut tentang jenis plugin yang dipasang, tema dll. Silakan ikuti proses debug Magento dengan menonaktifkan tema Anda, menonaktifkan modul lokal dan coba kembali.
philwinkle
Atribut yang kami gunakan adalah carikan warna dan ukuran tidak lebih dari 8 per item dan dalam kebanyakan kasus tidak lebih dari 4. Ini dijalankan pada instalasi magento kosong CE 1.9.1 dengan data sampel dimuat dan 10 produk yang dapat dikonfigurasi dengan swatch khusus ditambahkan. Ini pasti terkait dengan contohnya karena semakin kita tambahkan semakin lambat situs tersebut. Harap perhatikan bahwa caching dimatikan untuk menguji ini karena pengguna dapat memfilter pencarian dan kami tidak dapat memiliki waktu muat yang gila setiap kali pengguna mengubah pencarian mereka. Terima kasih atas waktu Anda :)
Dave Bevington

Jawaban:

22

Kanan. Saya mendeteksi masalah pada Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping function.

Saya membuat beberapa perubahan. Ini meningkatkan kinerja.

Mencoba:

  1. Salin /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.phpke /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. Pada /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.phpfile pindahkan kode ini (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);

    hingga sebelum foreachloop.

Ini adalah metode yang diubah:

 /**
 * 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
}
Andrey M.
sumber
Saya mengalami masalah yang sama dengan swatch diaktifkan pada halaman daftar dan ini membantu mempercepat, jadi terima kasih!
Marlon Creative
Saya menemukan masalah yang sama. untuk menyelesaikannya butuh pemuatan halaman dari 2,5 menit hingga 7 detik.
Andrew Kett
Swatch ini sangat memperlambat kategori terutama ketika Anda memiliki banyak produk yang dapat dipercaya. Solusi dari Андрей М. kurangi pemuatan dari 10 hingga 3 detik pada kategori penuh dengan produk yang dapat dikonfigurasi! Terima kasih!
user1895954
+1! Terima kasih telah berbagi ini. Kami menggunakan banyak konfigurasi dengan masing-masing pilihan dan tidak bisa menggunakan contoh warna lagi ...
Marc
+1! Jawaban yang benar-benar brilian, waktu pemuatan berubah dari 28 detik menjadi 3 detik! Terima kasih!!
KI
4

Cara tambahan untuk meningkatkan kinerja swatch yang dapat dikonfigurasi jika Anda memiliki banyak opsi atribut.

Misalnya jika Anda memiliki 2000 opsi dan menampilkan 36 produk dalam daftar katalog, dalam hal ini metode Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()akan bergabung dengan setiap label opsi super_attributes dan Anda akan mendapatkan 2000 * 36 = 72000 baris.

Saya telah menulis ulang metode ini dan hanya memuat 2000 baris, bukan 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;
}
Yaroslav Voronoy
sumber