Enterprise 1.14.1 Campioni che causano 35 secondi più il tempo di caricamento nelle pagine delle categorie


23

Abbiamo implementato la nuova funzionalità integrata di Campioni nella nostra ultima nuova creazione del sito Quando abilitiamo i campioni nelle pagine delle categorie, il tempo di caricamento della pagina va da 2 secondi a 38 + secondi.

Mi chiedevo se qualcun altro avesse avuto questo problema e se così potesse darci un'indicazione di possibili soluzioni?

Abbiamo provato EE 1.14.1 e CE 1.9.1 con 36 prodotti configurabili con campioni applicati sul tema rwd standard e nessun altro modulo attivo.

Questo problema non può essere risolto memorizzando nella cache poiché ogni volta che un utente cerca o filtra una categoria, la pagina si interrompe nuovamente.


Non riesco a riprodurre questo. Per favore, dacci qualche altra direzione sul tipo di plugin installati, sul tema, ecc. Segui il processo di debug di Magento disabilitando il tuo tema, disabilitando i moduli locali e riprovando.
Filwinkle,

Gli attributi che stiamo utilizzando sono campioni di colore e dimensioni non più di 8 per articolo e nella maggior parte dei casi non più di 4. Questo viene eseguito su un'installazione vuota magento CE 1.9.1 con dati campione caricati e 10 prodotti configurabili con i campioni personalizzati aggiunto. È sicuramente associato ai campioni poiché più si aggiunge, più il sito diventa lento. Tieni presente che la memorizzazione nella cache è disattivata per testarlo poiché gli utenti possono filtrare la ricerca e non possiamo avere un tempo di caricamento folle ogni volta che un utente modifica la ricerca. Grazie per il tuo tempo :)
Dave Bevington,

Risposte:


22

Destra. Rilevo problema sulla funzione Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping.

Apporto alcune modifiche. Questo aumento delle prestazioni.

Provare:

  1. Copia /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.phpin /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. Su /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.phpfile spostare questo codice (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);

    fino a prima del foreachciclo.

Questo è il metodo modificato:

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

Stavo riscontrando lo stesso problema con i campioni abilitati nelle pagine dell'elenco e questo ha contribuito a velocizzare notevolmente le cose, quindi grazie!
Marlon Creative

Ho trovato lo stesso problema. risolverlo ha richiesto il caricamento della pagina da 2,5 minuti a 7 secondi.
Andrew Kett,

Questi campioni rallentano davvero le categorie soprattutto quando hai molti prodotti confugurabili. La soluzione di Андрей М. riduci il caricamento da 10 a 3 secondi su una categoria completa di prodotti configurabili! Grazie!
user1895954

+1! Grazie per averlo condiviso. Stiamo usando molti configurabili con diverse opzioni ciascuno e non potremmo più usare i campioni di colore ...
Marc

+1! Risposta assolutamente brillante, il tempo di caricamento è cambiato da 28 secondi a 3 secondi! Grazie!!
KI

4

Modo aggiuntivo per migliorare i campioni configurabili delle prestazioni quando si hanno molte opzioni di attributo.

Ad esempio, se hai 2000 opzioni e mostri 36 prodotti nell'elenco del catalogo, in questo caso il metodo Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()si unirà a ciascuna etichetta di opzione super_attributes e otterrai 2000 * 36 = 72000 righe.

Ho riscritto questo metodo e carica solo 2000 righe anziché 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;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.