Magento 1.9.1 penyortiran atribut produk yang dapat dikonfigurasi


24

Seperti yang sudah saya sebutkan, sepertinya ada masalah dengan magento 1.9.1 dan pengurutan atribut dari produk yang dapat dikonfigurasi. Pilihan produk yang dapat dikonfigurasi sekarang SELALU bergantung pada ID produk dari produk sederhana. Urutan opsi atribut diabaikan.

Saya kembali ke magento 1.9.0.1. Mungkin seseorang dapat menentukan bagaimana penyortiran dalam 1.9.1 dilakukan. Akan sangat bagus untuk semua orang yang menggunakan produk yang dapat dikonfigurasi untuk memperbaikinya.

Jika seseorang ingin melihatnya, Anda dapat melakukannya di sini di toko demo magento. Saya tidak dapat mengurutkan ukuran dengan benar.

Jawaban:


25

Catatan: Telah menjadi perhatian saya bahwa solusi ini tidak berfungsi untuk Magento 1.9.2. Untuk menghemat waktu orang lain, saya ingin menunjukkan ini di bagian atas pos ini. Jika saya mengembangkan solusi saya sendiri atau menemukan solusi orang lain yang berfungsi untuk 1.9.2 saya akan memperbarui posting ini saat itu.

Perhatian: Solusi yang diberikan di sini memperluas file kelas blok di pustaka inti Magento. Saya meninjau kode sumber Magento sebelum pendekatan ini dan memutuskan bahwa tidak ada peristiwa yang baik untuk diamati untuk menghindari pendekatan ini. Jika dalam versi Magento masa depan masalah penyortiran ini diselesaikan, Anda dapat membatalkan perubahan di bawah ini hanya dengan menonaktifkan ekstensi di file XML app / etc / modules itu.

Langkah 1: buat aplikasi file / etc / modules / FirstScribe_CatalogOptionSortFix.xml

Isi:

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

Catatan: Untuk langkah 2 dan 3, buat direktori untuk file-file ini sebagaimana diperlukan. Misalnya, Anda mungkin sudah memiliki aplikasi direktori / kode / lokal , atau Anda mungkin tidak, tergantung pada ekstensi apa yang sudah Anda instal di situs Anda.

Langkah 2: Buat aplikasi file / kode / lokal / FirstScribe / CatalogOptionSortFix / etc / config.xml

Isi:

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

Langkah 3: Buat aplikasi file / kode / lokal / FirstScribe / CatalogOptionSortFix / Blok / Produk / Lihat / Jenis / Configurable.php

Isi:

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

Langkah 4: Jika diaktifkan, segarkan jenis cache "Konfigurasi" Magento di bawah Sistem -> Manajemen Tembolok pada panel admin.

Ikhtisar ekstensi

  1. Perpanjang kelas Mage_Catalog_Block_Product_View_Type_Configurable.
  2. Tambahkan metode untuk mengurutkan opsi berdasarkan positionnilainya dengan menarik info ini dari database.
  3. Tulis ulang metode getJsonConfig untuk memanggil fungsi baru kami setelah mengumpulkan opsi untuk atribut.

2
berfungsi dengan luar biasa dan saya senang solusinya tidak mempengaruhi peningkatan di masa mendatang - banyak terima kasih kepada Anda untuk solusi yang layak.
dawhoo

Hai @Meogi walaupun tampaknya perbaikan Anda sempurna untuk nilai atribut, apakah kami yakin semuanya sudah sesuai dengan kotak pemilihan produk itu sendiri? Memperhatikan masalah dengan memesannya seperti ini dalam set atribut. Misalnya - kami memiliki "Warna" yang diseret di atas "Ukuran" di dalam set atribut, namun 1.9.1 mengganti keduanya (mengabaikan urutan). Satu-satunya cara untuk memperbaikinya adalah dengan mengedit produk itu sendiri, dan menyeret urutan dalam yang dapat dikonfigurasi. Mungkin ini hanya produk jahat yang secara tidak sengaja dipesan ulang secara manual sebelumnya?
Joe

1
@Joe Jika saya tidak salah, menyeret atribut lebih tinggi / lebih rendah di set atribut tidak mempengaruhi urutan mereka ditampilkan pada halaman detail produk ujung depan. Sebaliknya, Anda harus masuk ke Katalog -> Atribut -> Kelola Atribut, cari atribut Anda dan edit nilai "Posisi". Ini akan memengaruhi urutan atribut yang dapat dikonfigurasi ditampilkan pada halaman produk serta navigasi berlapis. Urutan opsi yang dapat dikonfigurasi dapat ditimpa pada basis per produk juga, dengan menavigasi ke tab "Produk Terkait" di admin, dan menyeret atribut naik / turun di sana.
Darren Felton

1
@ Meogi ini hanya untuk posisi Blok Navigasi Layered, karena ketika Anda mengaktifkan "Gunakan di Navigasi Layered".
Joe

@Joe, begitu, saya tidak tahu cara mengubah pengaturan default (mungkin penempatannya selalu dalam set atribut, saya tidak yakin). Saya dapat menyatakan bahwa pada instalasi Magento 1.9.1.0 saya masih dapat mengaturnya ke urutan pilihan saya dengan mengklik / menyeret naik / turun di tab "Produk Terkait" dari produk yang dapat dikonfigurasi. Di mana mereka terdaftar antara formulir buat cepat dan kisi produk di bagian bawah.
Darren Felton

11

Hanya untuk menambahkan dua sen saya, dua jawaban yang lain dengan baik mengarahkan saya ke arah fix, tetapi saya pikir saya akan menyerangnya pada sumber daripada ke titik presentasi blok.

Anda dapat mencapai hasil yang sama dengan memperluas metode Mage_Catalog_Model_Resource_Product_Type_Configurable_Attribute_Collectionmodel _loadPrices(), yang meskipun namanya adalah tempat perubahan dilakukan (mungkin untuk kinerja) menghasilkan atribut yang dipesan oleh ID daripada oleh relevansi.

Perubahan tampaknya telah dibuat untuk menghindari foreachpernyataan bersarang , tetapi pada gilirannya kehilangan urutan yang benar juga. Solusi ini sedikit mengubah logika yang diperbarui untuk melacak opsi atribut, kemudian melakukan loop lain berdasarkan urutan asli untuk benar-benar melakukan penambahan.

Berikut langkah-langkah penyesuaian yang mirip dengan jawaban meogi di atas :


Langkah 1: Daftarkan modul baru

Catatan: jika Anda sudah memilikinya, gunakan kembali yang sudah ada.

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

Langkah 2: Buat konfigurasi modul

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

Langkah 3: Tambahkan ekstensi model sumber daya

# 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) {
                // 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;
    }
}

Langkah 4: Kosongkan cache Anda


Untuk referensi , perubahan aktual ke kelas inti di a git diffakan di bawah (jangan langsung mengedit file inti!):

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) {

Ini juga ada di GitHub jika ada yang menginginkannya untuk referensi.

Sunting: Saya juga mencatat ini sebagai bug pada Magento .


1
Kontribusi luar biasa temanku. +1 (yeah, tidak seharusnya menggunakan komentar ini untuk mengucapkan terima kasih tetapi Anda membunuhnya jadi saya harus haha)
Darren Felton

Saya mencobanya dengan magento 1.9.2 - doenst sepertinya tidak berhasil. Dan saya tidak mengerti mengapa bug ini masih belum diperbaiki oleh Magento.
Reinsch

Sudahkah Anda memastikan bahwa modul Anda dikonfigurasi dengan benar? Saya yakin mereka menyadarinya, tapi itu mungkin sesuatu yang akan membutuhkan waktu untuk memverifikasi sebelum mereka merilis patch karena itu merupakan bagian yang sangat penting dari sistem. Sunting: Anda juga dapat menguji perbaikan secara langsung (dan sementara) tetapi menyalin tambalan langsung ke kelas inti (sementara)
Robbie Averill

1
@Reinsch Saya baru saja menerima email dari seseorang tentang ketidakcocokan dengan CE 1.9.2 - telah mendorong pembaruan ke repositori Github saya dan mengujinya pada CE 1.9.2 dengan data sampel Magento dan berfungsi dengan benar sekarang
Robbie Averill

1
Kerja bagus @RobbieAverill - terima kasih banyak. Diuji dan dikonfirmasi bekerja di situs web Magento 1.9.2.1.
zigojacko

3

Ini bukan benar-benar perbaikan yang tepat, tetapi itulah yang saya lakukan sementara untuk menghindari kembali ke 1.9.0.1 sampai rilis Magento berikutnya mudah-mudahan memperbaiki masalah dengan benar. Ini akan mengurutkan nilai opsi secara alfabet, Anda tentu saja dapat mengurutkan berdasarkan apa pun yang Anda inginkan, tetapi saya tidak tahu cara mengakses urutan pengurutan yang ditetapkan di backend dan menurut abjad cukup baik untuk keperluan saya.

Ubah file

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

Ubah baris 215

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

untuk

usort($info['options'], function ($a,$b)
    {
        return strcmp($a['label'],$b['label']);
    }
);
if($this->_validateAttributeInfo($info)) {
   $attributes[$attributeId] = $info;
}

2
Silakan lihat jawaban saya untuk jawaban yang secara pantas memperluas perpustakaan inti Magento daripada mengubahnya secara langsung. Namun, terima kasih kepada Steve atas jawaban ini karena sangat membantu saya mengetahui di mana harus mulai mengembangkan solusi yang saya temukan.
Darren Felton

Excellent bekerja seperti pesona di Enterprise bahkan terima kasih banyak, Anda menghemat hari saya ..
Bharath
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.