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
- Perpanjang kelas Mage_Catalog_Block_Product_View_Type_Configurable.
- Tambahkan metode untuk mengurutkan opsi berdasarkan
position
nilainya dengan menarik info ini dari database.
- Tulis ulang metode getJsonConfig untuk memanggil fungsi baru kami setelah mengumpulkan opsi untuk atribut.
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_Collection
model_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
foreach
pernyataan 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.
Langkah 2: Buat konfigurasi modul
Langkah 3: Tambahkan ekstensi model sumber daya
Langkah 4: Kosongkan cache Anda
Untuk referensi , perubahan aktual ke kelas inti di a
git diff
akan di bawah (jangan langsung mengedit file inti!):Ini juga ada di GitHub jika ada yang menginginkannya untuk referensi.
Sunting: Saya juga mencatat ini sebagai bug pada Magento .
sumber
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
Ubah baris 215
untuk
sumber