Nuancier Enterprise 1.14.1 entraînant un temps de chargement de 35 secondes et plus sur les pages de catégorie

23

Nous avons implémenté la nouvelle fonctionnalité Nuancier intégrée dans notre dernière nouvelle version de site. Lorsque nous activons les nuances sur les pages de catégorie, le temps de chargement de la page passe de 2 secondes à 38 + secondes.

Je me demandais si quelqu'un d'autre avait eu ce problème et si oui, pourrait-il nous donner une indication de solutions possibles?

Nous avons essayé EE 1.14.1 et CE 1.9.1 avec 36 produits configurables avec des échantillons appliqués sur le thème rwd standard et aucun autre module actif.

Ce problème ne peut pas être résolu par la mise en cache, car chaque fois qu'un utilisateur recherche ou filtre une catégorie, la page s'arrête à nouveau.

Dave Bevington
la source
Je ne peux pas reproduire cela. Veuillez nous donner plus d'informations sur le type de plugins installés, le thème, etc. Veuillez suivre le processus de débogage de Magento en désactivant votre thème, en désactivant les modules locaux et en réessayant.
philwinkle
Les attributs que nous utilisons sont des échantillons de couleurs et des tailles pas plus de 8 par article et dans la plupart des cas pas plus de 4. Ceci est exécuté sur une installation vierge de magento CE 1.9.1 avec des exemples de données chargées et 10 produits configurables avec des échantillons personnalisés ajoutée. Il est certainement associé aux échantillons, car plus nous ajoutons, plus le site est lent. Veuillez noter que la mise en cache est désactivée pour tester cela car les utilisateurs peuvent filtrer la recherche et nous ne pouvons pas avoir un temps de chargement fou chaque fois qu'un utilisateur modifie sa recherche. Merci pour votre temps :)
Dave Bevington

Réponses:

22

Droite. Je détecte un problème sur la fonction Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping.

J'y apporte quelques modifications. Cela augmente les performances.

Essayer:

  1. Copiez /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.phpvers /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. Au /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.phpdossier, déplacez ce code (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);
    

    jusqu'à avant la foreachboucle.

Voici la méthode modifiée:

 /**
 * 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.
la source
J'avais le même problème avec les échantillons activés sur les pages de liste et cela a contribué à accélérer considérablement les choses, alors merci!
Marlon Creative
J'ai trouvé le même problème. le résoudre a pris le chargement de la page de 2,5 minutes à 7 secondes.
Andrew Kett
Ces échantillons ralentissent vraiment les catégories, surtout lorsque vous avez beaucoup de produits confugurables. La solution de Андрей М. réduire le chargement de 10 à 3 secondes sur une catégorie pleine de produits configurables! Merci!
user1895954
+1! Merci d'avoir partagé cela. Nous utilisons beaucoup de configurables avec plusieurs options chacun et nous ne pouvions tout simplement plus utiliser d'échantillons de couleurs ...
Marc
+1! Réponse absolument géniale, le temps de chargement est passé de 28 secondes à 3 secondes! Merci!!
KI
4

Moyen supplémentaire d'améliorer les échantillons configurables en termes de performances lorsque vous disposez de nombreuses options d'attributs.

Par exemple, si vous avez 2000 options et affichez 36 produits dans la liste du catalogue, dans ce cas, la méthode Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()se joindra à chaque étiquette d'option super_attributes et vous obtiendrez 2000 * 36 = 72000 lignes.

J'ai réécrit cette méthode et elle ne charge que 2000 lignes au lieu de 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
la source