Sorting Magento 1.9.1未按位置对可配置产品属性下拉列表进行排序

Sorting Magento 1.9.1未按位置对可配置产品属性下拉列表进行排序,sorting,magento,attributes,position,Sorting,Magento,Attributes,Position,重新安装Magento 1.9.1 Magento正在忽略目录->属性->管理属性->管理标签/选项中为可配置产品下拉列表设置的属性位置。相反,它使用产品ID来确定列表顺序 比较了以下文件/函数,除了一个小的税务计算,自1.7.0.2以来,所有代码均未更改 Mage/Catalog/Model/Product/Type/Configuarable.php: public function getConfigurableAttributes($product = null) public fun

重新安装Magento 1.9.1

Magento正在忽略目录->属性->管理属性->管理标签/选项中为可配置产品下拉列表设置的属性位置。相反,它使用产品ID来确定列表顺序

比较了以下文件/函数,除了一个小的税务计算,自1.7.0.2以来,所有代码均未更改

Mage/Catalog/Model/Product/Type/Configuarable.php:

public function getConfigurableAttributes($product = null)
public function getJsonConfig()
Mage/Catalog/Model/Product/Option.php:

public function getProductOptionCollection(Mage_Catalog_Model_Product $product)
Mage/Catalog/Block/Product/View/Type/Configuarable.php:

public function getConfigurableAttributes($product = null)
public function getJsonConfig()
我还测试了一个实时站点的副本数据库,所有属性排序都基于产品ID

复制:

  • 创建一个属性-颜色
  • 添加标签-黑色、红色、绿色、蓝色
  • 保存属性
  • 按照上述顺序创建具有属性的可配置和简单关联产品
  • 编辑属性并更改标签位置。蓝色0,绿色1,红色3,黑色4


    查看产品时,Magento仍按产品ID对属性进行排序并忽略位置。

    注意:此处列出的解决方案扩展了Magento核心库中的块类文件。在采用这种方法之前,我查看了Magento的源代码,并确定没有一个好的事件可以用来避免这种方法。如果在未来版本的Magento中解决了此排序问题,您可以通过在其app/etc/modules XML文件中禁用扩展名来撤消以下更改

    步骤1:创建文件app/etc/modules/FirstScribe\u catalogoptions ortfix.xml

    内容:

    <?xml version="1.0"?>
    <config>
        <modules>
            <FirstScribe_CatalogOptionSortFix>
                <active>true</active>
                <codePool>local</codePool>
                <depends>
                    <Mage_Catalog />
                </depends>
            </FirstScribe_CatalogOptionSortFix>
        </modules>
    </config>
    
    <?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>
    
    <?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;
        }
    }
    
    
    真的
    地方的
    
    注意:对于步骤2和3,根据需要为这些文件创建目录。例如,根据您的站点上已安装的扩展,您可能已经有了app/code/local目录,也可能没有

    步骤2:创建文件app/code/local/FirstScribe/CatalogOptionSortFix/etc/config.xml

    内容:

    <?xml version="1.0"?>
    <config>
        <modules>
            <FirstScribe_CatalogOptionSortFix>
                <active>true</active>
                <codePool>local</codePool>
                <depends>
                    <Mage_Catalog />
                </depends>
            </FirstScribe_CatalogOptionSortFix>
        </modules>
    </config>
    
    <?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>
    
    <?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;
        }
    }
    
    
    1.0.0
    FirstScribe\目录选项端口固定\块\产品\视图\类型\可配置
    
    第3步:创建文件app/code/local/FirstScribe/CatalogOptionSortFix/Block/Product/View/Type/Configurable.php

    内容:

    <?xml version="1.0"?>
    <config>
        <modules>
            <FirstScribe_CatalogOptionSortFix>
                <active>true</active>
                <codePool>local</codePool>
                <depends>
                    <Mage_Catalog />
                </depends>
            </FirstScribe_CatalogOptionSortFix>
        </modules>
    </config>
    
    <?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>
    
    <?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;
        }
    }
    

    Meogi的答案有效,但不是完美的答案,因为它只会在前端对选项进行排序。尝试从管理面板为可配置产品创建订单。您仍然会得到排序不正确的属性选项列表

    相反,您可以将app/code/core/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php复制到本地文件夹app/code/local/Mage/Catalog/Model/Resource/Product/Type/Configurable/Attribute/Collection.php并应用此修补程序:

    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);
                 }
    
    索引: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+修复了不按位置排序的可配置属性选项
    +*@作者哈希特
    +             */
    +$sortOrder=1;
    +foreach($this->\u项目作为$item){
    +$productAttribute=$item->getProductAttribute();
    +if(!($PRODUCTATTRICT instanceof Mage_Eav_模型_实体_属性_抽象)){
    +继续;
    +                }
    +$options=$productAttribute->getFrontend()->getSelectOptions();
    +foreach($options作为$option){
    +如果(!$选项['value']){
    继续;
    }
    +如果(设置($values[$item->getId()。:'。$option['value']])){
    +$values[$item->getId().:'.$option['value']['order']=$sortOrder++;
    +                    }
    +                }
    +            }
    +usort($value,function($a,$b){
    +返回$a['order']-$b['order'];
    +            });
    +            
    foreach($值作为$数据){
    $this->getItemById($data['product\u super\u attribute\u id'])->addPrice($data);
    }
    

    如果您对将核心文件复制到本地文件夹犹豫不决,那么我可以创建一个快速模块,
    this Collection.php文件,只需覆盖_loadPrices()函数并引入此修复程序。

    覆盖属性集合并添加代码更改,如下所示。这将纠正排序问题以及加载高选项值的问题。“usort在价格上出了问题,所以评论说”


    再加上我的两分钱,其他两个答案很好地为我指明了修复的方向,但我认为我应该从源代码而不是块表示点攻击它

    通过扩展
    Mage\u Catalog\u Model\u Resource\u Product\u Type\u Configurable\u Attribute\u Collection
    Model的
    \u loadPrices()
    方法,可以获得相同的结果,尽管名称是进行更改的地方(可能是为了性能),但会导致属性按ID而不是相关性排序

    更改似乎是为了避免嵌套的
    foreach
    语句,但反过来也会丢失正确的顺序。此解决方案略微修改更新的逻辑以跟踪属性opti