Magento 1.9.1 not sorting Configurable product attributes dropdown by position

后端 未结 5 1470
庸人自扰
庸人自扰 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

    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:

    
    
        
            
                true
                local
                
                    
                
            
        
    
    

    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:

    
    
    
        
            
                1.0.0
            
        
        
            
                
                    
                        FirstScribe_CatalogOptionSortFix_Block_Product_View_Type_Configurable
                    
                
            
        
    
    

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

    Contents:

    _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.

提交回复
热议问题