Magento 1.9.1 not sorting Configurable product attributes dropdown by position

后端 未结 5 1408
庸人自扰
庸人自扰 2021-02-20 04:42

Fresh install of Magento 1.9.1.

Magento is ignoring the attribute position set in Catalogue->Attributes->Manage Attributes->Manage Labels/Options for a configurable prod

相关标签:
5条回答
  • 2021-02-20 05:14

    The answer by Meogi works but is not the perfect answer as it will only sort the options on the frontend. Try creating an order from the admin panel for a configurable product. You will still get the incorrectly sorted attribute option list.

    Instead, you can copy app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php to local folder app/code/local/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php and apply this patch:

    Index: app/code/local/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
    ===================================================================
    --- app/code/local/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
    +++ app/code/local/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php
    @@ -301,7 +301,28 @@
                         }
                     }
                 }
    
    +            /**
    +             * Mage 1.9+ fix for configurable attribute options not sorting to position
    +             * @author Harshit <support@cubixws.co.uk>
    +             */
    +            $sortOrder = 1;
    +            foreach ($this->_items as $item) {
    +                $productAttribute = $item->getProductAttribute();
    +                if (!($productAttribute instanceof Mage_Eav_Model_Entity_Attribute_Abstract)) {
    +                    continue;
    +                }
    +                $options = $productAttribute->getFrontend()->getSelectOptions();
    +                foreach ($options as $option) {
    +                    if (!$option['value']) {
                             continue;
                         }
    
    +                    if (isset($values[$item->getId() . ':' . $option['value']])) {
    +                        $values[$item->getId() . ':' . $option['value']]['order'] = $sortOrder++;
    +                    }
    +                }
    +            }
    +            usort($values, function ($a, $b) {
    +                return $a['order'] - $b['order'];
    +            });
    +            
                 foreach ($values as $data) {
                     $this->getItemById($data['product_super_attribute_id'])->addPrice($data);
                 }
    

    If you are hesitant of copying across a core file to local folder then I can create a quick module, <rewrite> this Collection.php file and just override the _loadPrices() function and introduce this fix.

    0 讨论(0)
  • 2021-02-20 05:14

    Notice: The solution laid out here extends a block class file in Magento's core library. I reviewed Magento's source code prior to this approach and determined that there was not a good event to observe to avoid this approach. If in a future version of Magento this sorting issue is resolved, you may undo these changes below simply by disabling the extension in it's app/etc/modules XML file.

    Step 1: create the file app/etc/modules/FirstScribe_CatalogOptionSortFix.xml

    Contents:

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

    Note: For step 2 and 3, create directories for these files as necessary. For example, you may already have the directory app/code/local, or you may not, depending on what extensions you have already installed on your site.

    Step 2: Create the file app/code/local/FirstScribe/CatalogOptionSortFix/etc/config.xml

    Contents:

    <?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>
    

    Step 3: Create the file app/code/local/FirstScribe/CatalogOptionSortFix/Block/Product/View/Type/Configurable.php

    Contents:

    <?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;
        }
    }
    

    Step 4: If enabled, refresh Magento's "Configuration" cache type under System -> Cache Management of the admin panel.

    Extension overview

    1. Extend the Mage_Catalog_Block_Product_View_Type_Configurable class.
    2. Add a method to sort options by their position value by pulling this info from the database.
    3. Rewrite the getJsonConfig method to call our new function after having gathered the options for an attribute.
    0 讨论(0)
  • 2021-02-20 05:31

    According to Magento, this issue will be fixed in CE 1.9.3.0

    Magento Team | posted 8/14/15 4:02 PM

    The issue is scheduled for next minor (not patch) release that is expected in H1 2016.

    Source: https://www.magentocommerce.com/bug-tracking/issue/index/id/413

    0 讨论(0)
  • 2021-02-20 05:36

    Just to add my two cents, the other two answers did well to point me in fix's direction, but I thought I'd attack it at the source rather than the block presentation point.

    You can achieve the same result by extending the Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection model's _loadPrices() method, which despite the name is where a change was made (presumably for performance) resulting in the attributes being ordered by ID rather than by relevance.

    The change appears to have been made to avoid nested foreach statements, but in turn loses the correct order as well. This solution modifies the updated logic slightly to track the attribute options, then performs another loop based on the original order to actually do the adding.

    Here's an adjusted walkthrough similar to meogi's answer above:


    Step 1: Register a new module

    Note: if you already have one, re-use an existing one.

    # 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>
    

    Step 2: Create the module's configuration

    # 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>
    

    Step 3: Add the resource model extension

    # 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 <robbie.averill@kathmandu.co.nz>
                     */
                    $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 <robbie.averill@kathmandu.co.nz>
                     */
                }
    
                foreach ($pricings[0] as $pricing) {
                    // Affffding 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;
        }
    }
    

    Step 4: Clear your cache


    For reference, the actual change to the core class in a git diff would be below (do not directly edit core files!):

    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 <robbie.averill@kathmandu.co.nz>
    +                 */
    +                $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 <robbie.averill@kathmandu.co.nz>
    +                 */
                 }
    
                 foreach ($pricings[0] as $pricing) {
    

    This is also on GitHub if anyone wants it for reference.

    Edit: I've also logged this as a bug with Magento.

    0 讨论(0)
  • 2021-02-20 05:36

    Override the attribute collection and add the code changes as below. This will rectify the sort problem and also, the problem of loading of high options values. "The usort is giving problem in the prices, so commented out"

    <?php
    class Custom_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection extends Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collection {
    
        protected static $_pricings = array();
    
        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();
    
                //custom codes
                if (!Mage::app()->getStore()->isAdmin() && isset(self::$_pricings[$this->getProduct()->getId()])) {
                    $values = self::$_pricings[$this->getProduct()->getId()];
    
                } else {//custom codes
                    foreach ($this->_items as $item) {
                        $productAttribute = $item->getProductAttribute();
                        if (!($productAttribute instanceof Mage_Eav_Model_Entity_Attribute_Abstract)) {
                            continue;
                        }
                        $options = $productAttribute->getFrontend()->getSelectOptions();
    
                        $optionsByValue = array();
                        $sortOrders = array(); //custom codes
                        $sortOrder = 1; //custom codes
                        foreach ($options as $option) {
                            $optionsByValue[$option['value']] = $option['label'];
                            $sortOrders[$option['value']] = $sortOrder++; //custom codes
                        }
    
                        foreach ($this->getProduct()->getTypeInstance(true)
                                     ->getUsedProducts(array($productAttribute->getAttributeCode()), $this->getProduct())
                                 as $associatedProduct) {
    
                            $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,
                                        'sort_order'                 => $sortOrders[$optionValue] //custom codes
                                    );
                                }
                            }
                        }
                    }
    
                    //custom codes
                    self::$_pricings[$this->getProduct()->getId()] = $values;
                    /**usort($values, function($a, $b) {
                        return $a['sort_order'] > $b['sort_order'];
                    });**/
                }
    
                foreach ($pricings[0] as $pricing) {
                    // Affffding 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;
        }
    
    }
    

    override the class Mage_Catalog_Block_Product_View_Type_Configurable check for the function public function getJsonConfig() change $prices = $attribute->getPrices(); to $prices = $this->_sortPrices($attribute->getPrices()); The function is as below

    public function _sortPrices($prices) {
        $sort_orders = array();
        $sorted_prices = array();
        foreach($prices as $key => $value) {
            $sort_orders[$key] = $value['sort_order'];
        }
        asort($sort_orders);
    
        foreach($sort_orders as $key => $value) {
            $sorted_prices[] = $prices[$key];
        }
        return $sorted_prices;
    }
    
    0 讨论(0)
提交回复
热议问题