Enterprise 1.14.1-Farbfelder verursachen 35 Sekunden mehr Ladezeit auf Kategorieseiten

23

Wir haben die neue eingebaute Farbfelder-Funktion in unserer neuesten neuen Site-Erstellung implementiert. Wenn wir die Farbfelder auf Kategorieseiten aktivieren, steigt die Ladezeit der Seite von 2 Sekunden auf 38 + Sekunden.

Ich habe mich gefragt, ob jemand dieses Problem hatte und ob uns dies einen Hinweis auf mögliche Lösungen geben könnte.

Wir haben EE 1.14.1 und CE 1.9.1 mit 36 ​​konfigurierbaren Produkten ausprobiert, wobei Farbfelder auf das Standard-RWD-Thema angewendet wurden und keine anderen Module aktiv waren.

Dieses Problem kann nicht durch Zwischenspeichern behoben werden, da die Seite bei jedem Durchsuchen oder Filtern einer Kategorie erneut angehalten wird.

Dave Bevington
quelle
Ich kann das nicht reproduzieren. Bitte geben Sie uns weitere Anweisungen zum Typ der installierten Plugins, zum Thema usw. Bitte folgen Sie dem Magento-Debugging-Prozess, indem Sie Ihr Thema deaktivieren, lokale Module deaktivieren und es erneut versuchen.
Philwinkle
Die Attribute, die wir verwenden, sind Farbfelder und Größen von nicht mehr als 8 pro Artikel und in den meisten Fällen nicht mehr als 4. Dies wird auf einer leeren Magento CE 1.9.1-Installation mit geladenen Beispieldaten und 10 konfigurierbaren Produkten mit den benutzerdefinierten Farbfeldern ausgeführt hinzugefügt. Es ist definitiv mit den Farbfeldern verbunden, je mehr wir hinzufügen, desto langsamer wird die Site. Bitte beachten Sie, dass das Caching deaktiviert ist, um dies zu testen, da Benutzer die Suche filtern können und wir nicht jedes Mal eine verrückte Ladezeit haben können, wenn ein Benutzer seine Suche ändert. Vielen Dank für Ihre Zeit :)
Dave Bevington

Antworten:

22

Recht. Ich habe ein Problem mit der Funktion Mage_ConfigurableSwatches_Helper_Mediafallback :: attachConfigurableProductChildrenAttributeMapping festgestellt.

Ich ändere es ein wenig. Dies erhöht die Leistung.

Versuchen:

  1. Kopieren /app/code/core/Mage/ConfigurableSwatches/Helper/Mediafallback.phpnach /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.php.

  2. In der /app/code/local/Mage/ConfigurableSwatches/Helper/Mediafallback.phpDatei diesen Code verschieben (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);

    bis vor die foreachSchleife.

Dies ist die geänderte Methode:

 /**
 * 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.
quelle
Ich hatte das gleiche Problem mit Farbfeldern, die auf den Listenseiten aktiviert waren, und dies half, die Dinge erheblich zu beschleunigen, also danke!
Marlon Creative,
Ich habe das gleiche Problem gefunden. Das Auflösen erforderte das Laden der Seite von 2,5 Minuten auf 7 Sekunden.
Andrew Kett
Diese Farbfelder verlangsamen die Kategorien sehr, besonders wenn Sie viele konfugierbare Produkte haben. Die Lösung von Андрей М. Reduzieren Sie das Laden von 10 auf 3 Sekunden für eine Kategorie mit konfigurierbaren Produkten! Vielen Dank!
user1895954
+1! Vielen Dank für das Teilen. Wir verwenden viele konfigurierbare Optionen mit jeweils mehreren Optionen und konnten einfach keine Farbfelder mehr verwenden ...
Marc
+1! Absolut geniale Antwort, Ladezeit von 28 Sekunden auf 3 Sekunden geändert! Vielen Dank!!
KI
4

Zusätzliche Möglichkeit, die Leistung konfigurierbarer Farbfelder zu verbessern, wenn Sie über zahlreiche Attributoptionen verfügen.

Wenn Sie beispielsweise über 2000 Optionen verfügen und 36 Produkte in der Mage_ConfigurableSwatches_Model_Resource_Catalog_Product_Attribute_Super_Collection::_loadOptionLabels()Katalogliste anzeigen , wird in diesem Fall die Methode mit den Optionsbezeichnungen "super_attributes" verknüpft, und Sie erhalten 2000 * 36 = 72000 Zeilen.

Ich habe diese Methode umgeschrieben und es werden statt 72000 nur 2000 Zeilen geladen

<?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;
}
Jaroslaw Woronoi
quelle