Konfigurowalne sortowanie atrybutów produktu Magento 1.9.1

24

Jak już wspomniałem, wydaje się, że istnieje problem z Magento 1.9.1 i sortowaniem atrybutów produktów konfigurowalnych. Opcje konfigurowalnego produktu ZAWSZE zależą od identyfikatora produktu prostego. Kolejność opcji atrybutów jest ignorowana.

Wróciłem do magento 1.9.0.1. Może ktoś może ustalić, w jaki sposób odbywa się sortowanie w wersji 1.9.1. Byłoby świetnie dla każdego, kto używa konfigurowalnych produktów, aby to naprawić.

Jeśli ktoś chce to zobaczyć, możesz to zrobić tutaj w sklepie demonstracyjnym Magento. Nie byłem w stanie poprawnie posortować rozmiarów.

Reinsch
źródło

Odpowiedzi:

25

Uwaga: Zwrócono mi uwagę, że to rozwiązanie nie działa w Magento 1.9.2. Aby zaoszczędzić innym zmarnowany czas, chciałbym wskazać to na początku tego postu. Jeśli opracuję własne rozwiązanie lub znajdę rozwiązanie, które działa dla 1.9.2, zaktualizuję ten post w tym czasie.

Uwaga: Przedstawione tutaj rozwiązanie rozszerza plik klasy bloków w podstawowej bibliotece Magento. Przejrzałem kod źródłowy Magento przed tym podejściem i ustaliłem, że nie było dobrego wydarzenia, którego można by uniknąć, aby uniknąć takiego podejścia. Jeśli w przyszłej wersji Magento problem z sortowaniem zostanie rozwiązany, możesz cofnąć te zmiany poniżej, po prostu wyłączając rozszerzenie w pliku XML aplikacji / etc / modules.

Krok 1: Utwórz plik aplikacji / etc / modules / FirstScribe_CatalogOptionSortFix.xml

Zawartość:

<?xml version="1.0"?>
<config>
    <modules>
        <FirstScribe_CatalogOptionSortFix>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
            </depends>
        </FirstScribe_CatalogOptionSortFix>
    </modules>
</config>

Uwaga: W kroku 2 i 3 utwórz katalogi dla tych plików, jeśli to konieczne. Na przykład możesz już mieć katalog app / code / local , albo nie, w zależności od tego, jakie rozszerzenia już zainstalowałeś w swojej witrynie.

Krok 2: Utwórz plik app / code / local / FirstScribe / CatalogOptionSortFix / etc / config.xml

Zawartość:

<?xml version="1.0"?>
<!--
/**
 * Magento 1.9.1.0 has a bug in that the configurable options are sorted by
 * ID rather than position for the Configurable Product's front end view script.
 * This extension addresses this problem.
 *
 * @category    FirstScribe
 * @package     FirstScribe_CatalogOptionSortFix
 * @version     2014.12.15
 */
-->
<config>
    <modules>
        <FirstScribe_CatalogOptionSortFix>
            <version>1.0.0</version>
        </FirstScribe_CatalogOptionSortFix>
    </modules>
    <global>
        <blocks>
            <catalog>
                <rewrite>
                    <product_view_type_configurable>FirstScribe_CatalogOptionSortFix_Block_Product_View_Type_Configurable</product_view_type_configurable>
                </rewrite>
            </catalog>
        </blocks>
    </global>
</config>

Krok 3: Utwórz plik app / code / local / FirstScribe / CatalogOptionSortFix / Block / Product / View / Type / Configurable.php

Zawartość:

<?php
/**
 * Magento 1.9.1.0 has a bug in that the configurable options are sorted by
 * ID rather than position for the Configurable Product's front end view script.
 * This extension addresses this problem.
 *
 * @category    FirstScribe
 * @package     FirstScribe_CatalogOptionSortFix
 * @version     2014.12.15
 */
class FirstScribe_CatalogOptionSortFix_Block_Product_View_Type_Configurable extends Mage_Catalog_Block_Product_View_Type_Configurable
{
    /**
     * @var Magento_Db_Adapter_Pdo_Mysql
     */
    protected $_read;

    /**
     * @var string
     */
    protected $_tbl_eav_attribute_option;

    /**
     * Composes configuration for js
     *
     * @version 2014.12.15 - Addition of this line:
     *    $info['options'] = $this->_sortOptions($info['options']);
     *
     * @return string
     */
    public function getJsonConfig()
    {
        $attributes = array();
        $options    = array();
        $store      = $this->getCurrentStore();
        $taxHelper  = Mage::helper('tax');
        $currentProduct = $this->getProduct();

        $preconfiguredFlag = $currentProduct->hasPreconfiguredValues();
        if ($preconfiguredFlag) {
            $preconfiguredValues = $currentProduct->getPreconfiguredValues();
            $defaultValues       = array();
        }

        foreach ($this->getAllowProducts() as $product) {
            $productId  = $product->getId();

            foreach ($this->getAllowAttributes() as $attribute) {
                $productAttribute   = $attribute->getProductAttribute();
                $productAttributeId = $productAttribute->getId();
                $attributeValue     = $product->getData($productAttribute->getAttributeCode());
                if (!isset($options[$productAttributeId])) {
                    $options[$productAttributeId] = array();
                }

                if (!isset($options[$productAttributeId][$attributeValue])) {
                    $options[$productAttributeId][$attributeValue] = array();
                }
                $options[$productAttributeId][$attributeValue][] = $productId;
            }
        }

        $this->_resPrices = array(
            $this->_preparePrice($currentProduct->getFinalPrice())
        );

        foreach ($this->getAllowAttributes() as $attribute) {
            $productAttribute = $attribute->getProductAttribute();
            $attributeId = $productAttribute->getId();
            $info = array(
                    'id'        => $productAttribute->getId(),
                    'code'      => $productAttribute->getAttributeCode(),
                    'label'     => $attribute->getLabel(),
                    'options'   => array()
            );

            $optionPrices = array();
            $prices = $attribute->getPrices();
            if (is_array($prices)) {
                foreach ($prices as $value) {
                    if(!$this->_validateAttributeValue($attributeId, $value, $options)) {
                        continue;
                    }
                    $currentProduct->setConfigurablePrice(
                            $this->_preparePrice($value['pricing_value'], $value['is_percent'])
                    );
                    $currentProduct->setParentId(true);
                    Mage::dispatchEvent(
                            'catalog_product_type_configurable_price',
                            array('product' => $currentProduct)
                    );
                    $configurablePrice = $currentProduct->getConfigurablePrice();

                    if (isset($options[$attributeId][$value['value_index']])) {
                        $productsIndex = $options[$attributeId][$value['value_index']];
                    } else {
                        $productsIndex = array();
                    }

                    $info['options'][] = array(
                            'id'        => $value['value_index'],
                            'label'     => $value['label'],
                            'price'     => $configurablePrice,
                            'oldPrice'  => $this->_prepareOldPrice($value['pricing_value'], $value['is_percent']),
                            'products'  => $productsIndex,
                    );
                    $optionPrices[] = $configurablePrice;
                }
            }

            // CALL SORT ORDER FIX
            $info['options'] = $this->_sortOptions($info['options']);

            /**
             * Prepare formated values for options choose
             */
            foreach ($optionPrices as $optionPrice) {
                foreach ($optionPrices as $additional) {
                    $this->_preparePrice(abs($additional-$optionPrice));
                }
            }
            if($this->_validateAttributeInfo($info)) {
                $attributes[$attributeId] = $info;
            }

            // Add attribute default value (if set)
            if ($preconfiguredFlag) {
                $configValue = $preconfiguredValues->getData('super_attribute/' . $attributeId);
                if ($configValue) {
                    $defaultValues[$attributeId] = $configValue;
                }
            }
        }

        $taxCalculation = Mage::getSingleton('tax/calculation');
        if (!$taxCalculation->getCustomer() && Mage::registry('current_customer')) {
            $taxCalculation->setCustomer(Mage::registry('current_customer'));
        }

        $_request = $taxCalculation->getDefaultRateRequest();
        $_request->setProductClassId($currentProduct->getTaxClassId());
        $defaultTax = $taxCalculation->getRate($_request);

        $_request = $taxCalculation->getRateRequest();
        $_request->setProductClassId($currentProduct->getTaxClassId());
        $currentTax = $taxCalculation->getRate($_request);

        $taxConfig = array(
                'includeTax'        => $taxHelper->priceIncludesTax(),
                'showIncludeTax'    => $taxHelper->displayPriceIncludingTax(),
                'showBothPrices'    => $taxHelper->displayBothPrices(),
                'defaultTax'        => $defaultTax,
                'currentTax'        => $currentTax,
                'inclTaxTitle'      => Mage::helper('catalog')->__('Incl. Tax')
        );

        $config = array(
                'attributes'        => $attributes,
                'template'          => str_replace('%s', '#{price}', $store->getCurrentCurrency()->getOutputFormat()),
                'basePrice'         => $this->_registerJsPrice($this->_convertPrice($currentProduct->getFinalPrice())),
                'oldPrice'          => $this->_registerJsPrice($this->_convertPrice($currentProduct->getPrice())),
                'productId'         => $currentProduct->getId(),
                'chooseText'        => Mage::helper('catalog')->__('Choose an Option...'),
                'taxConfig'         => $taxConfig
        );

        if ($preconfiguredFlag && !empty($defaultValues)) {
            $config['defaultValues'] = $defaultValues;
        }

        $config = array_merge($config, $this->_getAdditionalConfig());    

        return Mage::helper('core')->jsonEncode($config);
    }

    /**
     * Sort the options based off their position.
     *
     * @param array $options
     * @return array
     */
    protected function _sortOptions($options)
    {
        if (count($options)) {
            if (!$this->_read || !$this->_tbl_eav_attribute_option) {
                $resource = Mage::getSingleton('core/resource');

                $this->_read = $resource->getConnection('core_read');
                $this->_tbl_eav_attribute_option = $resource->getTableName('eav_attribute_option');
            }

            // Gather the option_id for all our current options
            $option_ids = array();
            foreach ($options as $option) {
                $option_ids[] = $option['id'];

                $var_name  = 'option_id_'.$option['id'];
                $$var_name = $option;
            }

            $sql    = "SELECT `option_id` FROM `{$this->_tbl_eav_attribute_option}` WHERE `option_id` IN('".implode('\',\'', $option_ids)."') ORDER BY `sort_order`";
            $result = $this->_read->fetchCol($sql);

            $options = array();
            foreach ($result as $option_id) {
                $var_name  = 'option_id_'.$option_id;
                $options[] = $$var_name;
            }
        }

        return $options;
    }
}

Krok 4: Jeśli jest włączony, odśwież typ pamięci podręcznej „Konfiguracja” Magento w obszarze System -> Zarządzanie pamięcią podręczną panelu administracyjnego.

Przegląd rozszerzeń

  1. Rozszerz klasę Mage_Catalog_Block_Product_View_Type_Configurable.
  2. Dodaj metodę sortowania opcji według ich positionwartości, pobierając te informacje z bazy danych.
  3. Przepisz metodę getJsonConfig, aby wywoływała naszą nową funkcję po zebraniu opcji dla atrybutu.
Darren Felton
źródło
2
działa fantastycznie i cieszę się, że rozwiązanie nie wpływa na przyszłe aktualizacje - wielkie dzięki za realne rozwiązanie.
dawhoo,
Hej @Meogi, chociaż wydaje się, że Twoja poprawka jest idealna do wartości atrybutów, czy jesteśmy pewni, że wszystko jest w porządku dla samych pól wyboru produktu? Zauważono problem z porządkowaniem ich w taki sposób, w jaki są ustawione w zestawie atrybutów. Na przykład - w zestawie atrybutów przeciągnęliśmy „Kolor” powyżej „Rozmiar”, jednak 1.9.1 zmienił oba (zignorował kolejność). Jedynym sposobem, aby to naprawić, była edycja samego produktu i przeciągnięcie zamówienia w konfigurowalnym. Może to był po prostu nieuczciwy produkt, który wcześniej został przypadkowo ręcznie zamieniony?
Joe
1
@Joe Jeśli się nie mylę, przeciągnięcie atrybutu wyżej / niżej w zestawie atrybutów nie wpływa na kolejność, w jakiej są wyświetlane na stronie ze szczegółowymi informacjami o produkcie. Zamiast tego musisz przejść do katalogu -> Atrybuty -> Zarządzaj atrybutami, znajdź swój atrybut i edytuj wartość „Pozycja”. Wpłynie to zarówno na kolejność wyświetlania konfigurowalnych atrybutów na stronie produktu, jak i na nawigację warstwową. Kolejność konfigurowalnych opcji można również przesłonić dla poszczególnych produktów, przechodząc do karty „Powiązane produkty” w panelu administracyjnym i przeciągając tam atrybuty w górę / w dół.
Darren Felton
1
@Meogi jest to tylko pozycja warstwowego bloku nawigacji, gdy włączysz opcję „Użyj w nawigacji warstwowej”.
Joe
@Joe Widzę, więc nie wiem, jak zmienić ustawienia domyślne (może zawsze było to umieszczenie w zestawie atrybutów, nie jestem pewien). Mogę stwierdzić, że w przypadku instalacji Magento 1.9.1.0 nadal byłem w stanie ustawić ją w wybranej przez mnie kolejności, klikając / przeciągając w górę / w dół w zakładce „Powiązane produkty” konfigurowalnego produktu. Gdzie są wymienione między szybkim formularzem a siatką produktu na dole.
Darren Felton
11

Żeby dodać moje dwa centy, pozostałe dwie odpowiedzi dobrze skierowały mnie w stronę poprawki, ale myślałem, że zaatakuję to u źródła, a nie w punkcie prezentacji bloku.

Możesz osiągnąć ten sam wynik, rozszerzając metodę Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collectionmodelu _loadPrices(), która pomimo nazwy jest miejscem, w którym dokonano zmiany (przypuszczalnie ze względu na wydajność), powodując, że atrybuty są uporządkowane według ID, a nie według trafności.

Wydaje się, że zmiana została wprowadzona, aby uniknąć zagnieżdżenia foreachinstrukcji, ale z kolei traci ona również prawidłową kolejność. To rozwiązanie nieznacznie modyfikuje zaktualizowaną logikę, aby śledzić opcje atrybutów, a następnie wykonuje kolejną pętlę na podstawie oryginalnej kolejności, aby faktycznie dodać.

Oto poprawiony przewodnik podobny do powyższej odpowiedzi meogina :


Krok 1: Zarejestruj nowy moduł

Uwaga: jeśli już go masz, użyj go ponownie.

# File: app/etc/modules/YourCompany_AttributeFix.xml
<?xml version="1.0"?>
<config>
    <modules>
        <YourCompany_AttributeFix>
            <active>true</active>
            <codePool>local</codePool>
            <depends>
                <Mage_Catalog />
            </depends>
        </YourCompany_AttributeFix>
    </modules>
</config>

Krok 2: Utwórz konfigurację modułu

# File: app/code/local/YourCompany/AttributeFix/etc/config.xml
<?xml version="1.0"?>
<config>
    <modules>
        <YourCompany_AttributeFix>
            <version>0.1.0</version>
        </YourCompany_AttributeFix>
    </modules>    
    <global>
        <models>
            <catalog_resource>
                <rewrite>
                    <product_type_configurable_attribute_collection>YourCompany_AttributeFix_Model_Resource_Product_Type_Configurable_Attribute_Collection</product_type_configurable_attribute_collection>
                </rewrite>
            </catalog_resource>
        </models>
    </global>
</config>

Krok 3: Dodaj rozszerzenie modelu zasobów

# File: app/code/local/YourCompany/AttributeFix/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
/**
 * Catalog Configurable Product Attribute Collection - overridden to re-enable the attribute option
 * sorting by relevance rather than by ID as changed in the Magento core class
 */
class YourCompany_AttributeFix_Model_Resource_Product_Type_Configurable_Attribute_Collection
    extends Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
{
    /**
     * Load attribute prices information
     *
     * @return Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
     */
    protected function _loadPrices()
    {
        if ($this->count()) {
            $pricings = array(
                0 => array()
            );

            if ($this->getHelper()->isPriceGlobal()) {
                $websiteId = 0;
            } else {
                $websiteId = (int)Mage::app()->getStore($this->getStoreId())->getWebsiteId();
                $pricing[$websiteId] = array();
            }

            $select = $this->getConnection()->select()
                ->from(array('price' => $this->_priceTable))
                ->where('price.product_super_attribute_id IN (?)', array_keys($this->_items));

            if ($websiteId > 0) {
                $select->where('price.website_id IN(?)', array(0, $websiteId));
            } else {
                $select->where('price.website_id = ?', 0);
            }

            $query = $this->getConnection()->query($select);

            while ($row = $query->fetch()) {
                $pricings[(int)$row['website_id']][] = $row;
            }

            $values = array();

            foreach ($this->_items as $item) {
                $productAttribute = $item->getProductAttribute();
                if (!($productAttribute instanceof Mage_Eav_Model_Entity_Attribute_Abstract)) {
                    continue;
                }
                $options = $productAttribute->getFrontend()->getSelectOptions();

                $optionsByValue = array();
                foreach ($options as $option) {
                    $optionsByValue[$option['value']] = $option['label'];
                }

                /**
                 * Modification to re-enable the sorting by relevance for attribute options
                 * @author Robbie Averill <[email protected]>
                 */
                $toAdd = array();
                foreach ($this->getProduct()->getTypeInstance(true)
                             ->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct())
                         as $associatedProduct) {

                    $optionValue = $associatedProduct->getData($productAttribute->getAttributeCode());

                    if (array_key_exists($optionValue, $optionsByValue)) {
                        $toAdd[] = $optionValue;
                    }
                }

                // Add the attribute options, but in the relevant order rather than by ID
                foreach (array_intersect_key($optionsByValue, array_flip($toAdd)) as $optionValueKey => $optionValue) {
                    // If option available in associated product
                    if (!isset($values[$item->getId() . ':' . $optionValue])) {
                        // If option not added, we will add it.
                        $values[$item->getId() . ':' . $optionValueKey] = array(
                            'product_super_attribute_id' => $item->getId(),
                            'value_index'                => $optionValueKey,
                            'label'                      => $optionsByValue[$optionValueKey],
                            'default_label'              => $optionsByValue[$optionValueKey],
                            'store_label'                => $optionsByValue[$optionValueKey],
                            'is_percent'                 => 0,
                            'pricing_value'              => null,
                            'use_default_value'          => true
                        );
                    }
                }
                /**
                 * End attribute option order modification
                 * @author Robbie Averill <[email protected]>
                 */
            }

            foreach ($pricings[0] as $pricing) {
                // Addding pricing to options
                $valueKey = $pricing['product_super_attribute_id'] . ':' . $pricing['value_index'];
                if (isset($values[$valueKey])) {
                    $values[$valueKey]['pricing_value']     = $pricing['pricing_value'];
                    $values[$valueKey]['is_percent']        = $pricing['is_percent'];
                    $values[$valueKey]['value_id']          = $pricing['value_id'];
                    $values[$valueKey]['use_default_value'] = true;
                }
            }

            if ($websiteId && isset($pricings[$websiteId])) {
                foreach ($pricings[$websiteId] as $pricing) {
                    $valueKey = $pricing['product_super_attribute_id'] . ':' . $pricing['value_index'];
                    if (isset($values[$valueKey])) {
                        $values[$valueKey]['pricing_value']     = $pricing['pricing_value'];
                        $values[$valueKey]['is_percent']        = $pricing['is_percent'];
                        $values[$valueKey]['value_id']          = $pricing['value_id'];
                        $values[$valueKey]['use_default_value'] = false;
                    }
                }
            }

            foreach ($values as $data) {
                $this->getItemById($data['product_super_attribute_id'])->addPrice($data);
            }
        }
        return $this;
    }
}

Krok 4: Wyczyść pamięć podręczną


Dla porównania , rzeczywista zmiana klasy podstawowej w a git diffbyłaby poniżej (nie edytuj bezpośrednio plików podstawowych!):

diff --git a/app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php b/app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
index 135d9d3..4d2a59b 100644
--- a/app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
+++ b/app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
@@ -254,6 +254,11 @@ class Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
                     $optionsByValue[$option['value']] = $option['label'];
                 }

+                /**
+                 * Modification to re-enable the sorting by relevance for attribute options
+                 * @author Robbie Averill <[email protected]>
+                 */
+                $toAdd = array();
                 foreach ($this->getProduct()->getTypeInstance(true)
                              ->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct())
                          as $associatedProduct) {
@@ -261,22 +266,31 @@ class Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection
                     $optionValue = $associatedProduct->getData($productAttribute->getAttributeCode());

                     if (array_key_exists($optionValue, $optionsByValue)) {
-                        // If option available in associated product
-                        if (!isset($values[$item->getId() . ':' . $optionValue])) {
-                            // If option not added, we will add it.
-                            $values[$item->getId() . ':' . $optionValue] = array(
-                                'product_super_attribute_id' => $item->getId(),
-                                'value_index'                => $optionValue,
-                                'label'                      => $optionsByValue[$optionValue],
-                                'default_label'              => $optionsByValue[$optionValue],
-                                'store_label'                => $optionsByValue[$optionValue],
-                                'is_percent'                 => 0,
-                                'pricing_value'              => null,
-                                'use_default_value'          => true
-                            );
-                        }
+                        $toAdd[] = $optionValue;
                     }
                 }
+
+                // Add the attribute options, but in the relevant order rather than by ID
+                foreach (array_intersect_key($optionsByValue, array_flip($toAdd)) as $optionValueKey => $optionValue) {
+                    // If option available in associated product
+                    if (!isset($values[$item->getId() . ':' . $optionValue])) {
+                        // If option not added, we will add it.
+                        $values[$item->getId() . ':' . $optionValueKey] = array(
+                            'product_super_attribute_id' => $item->getId(),
+                            'value_index'                => $optionValueKey,
+                            'label'                      => $optionsByValue[$optionValueKey],
+                            'default_label'              => $optionsByValue[$optionValueKey],
+                            'store_label'                => $optionsByValue[$optionValueKey],
+                            'is_percent'                 => 0,
+                            'pricing_value'              => null,
+                            'use_default_value'          => true
+                        );
+                    }
+                }
+                /**
+                 * End attribute option order modification
+                 * @author Robbie Averill <[email protected]>
+                 */
             }

             foreach ($pricings[0] as $pricing) {

Dotyczy to również GitHub, jeśli ktoś chce to w celach informacyjnych.

Edycja: Zalogowałem to również jako błąd w Magento .

Robbie Averill
źródło
1
Niesamowity wkład mój przyjacielu. +1 (tak, nie powinienem używać tych komentarzy, aby podziękować, ale zabiłeś go, więc muszę haha)
Darren Felton
Próbowałem z magento 1.9.2 - nie działa chyba niestety. I nie rozumiem, dlaczego ten błąd nie został naprawiony przez Magento.
Reinsch,
Czy upewniłeś się, że moduł jest poprawnie skonfigurowany? Jestem pewien, że są tego świadomi, ale prawdopodobnie jest to coś, co wymagałoby czasu, zanim opublikują łatkę, ponieważ jest to bardzo ważna część systemu. Edycja: Możesz również przetestować poprawkę bezpośrednio (i tymczasowo), ale kopiując łatkę bezpośrednio do klasy podstawowej (tymczasowo)
Robbie Averill
1
@ Reinsch Właśnie dostałem wiadomość od kogoś dotyczącą niezgodności z CE 1.9.2 - wypchnąłem aktualizację do mojego repozytorium Github i przetestowałem ją na CE 1.9.2 z przykładowymi danymi Magento i teraz działa poprawnie
Robbie Averill
1
Świetna robota @RobbieAverill - wielkie dzięki. Przetestowano i potwierdzono działanie na stronie Magento 1.9.2.1.
zigojacko,
3

To naprawdę nie jest poprawna poprawka, ale zrobiłem to tymczasowo, aby uniknąć konieczności powrotu do wersji 1.9.0.1, dopóki następna wersja Magento nie rozwiąże problemu. Sortuje wartości opcji alfabetycznie, możesz oczywiście sortować według wszystkiego, co chcesz, ale nie wiem, jak uzyskać dostęp do kolejności sortowania ustawionej w backendie i alfabetycznie jest wystarczająca do moich celów.

Zmień plik

/app/code/core/Mage/Catalog/Block/Product/View/Type/configurable.php

Zmień linię 215

if($this->_validateAttributeInfo($info)) {
   $attributes[$attributeId] = $info;
}

do

usort($info['options'], function ($a,$b)
    {
        return strcmp($a['label'],$b['label']);
    }
);
if($this->_validateAttributeInfo($info)) {
   $attributes[$attributeId] = $info;
}
Steve
źródło
2
Proszę zobaczyć moją odpowiedź na odpowiedź, która odpowiednio rozszerza podstawową bibliotekę Magento zamiast modyfikować ją bezpośrednio. Jednak podziękowania dla Steve'a za tę odpowiedź, ponieważ bardzo pomogło mi to wiedzieć, od czego zacząć opracowywać rozwiązanie, które wymyśliłem.
Darren Felton,
Wspaniale działało jak urok w Enterprise, nawet dzięki tonie, którą uratowałeś mój dzień ..
Bharath