Situs web yang saya kelola mengharuskan harga memiliki 5 desimal. Saya pergi ke depan dan memodifikasi setidaknya selusin file / tabel sekaligus untuk dapat mencapai ini. Tapi (karena selalu ada tapi) sepertinya ada masalah dengannya catalog_product_flat_X
.
Mari saya jelaskan: untuk harga di bagian depan, sebagian besar waktu, itu datang ke panggilan Mage_Catalog_Model_Product->getPrice()
, yang, seperti yang saya mengerti, akan mencari harga di tabel datar (jika Anda memiliki tabel datar diaktifkan). Masalahnya adalah dengan pengindeksan ulang data.
Jika flat table saya memiliki harga dengan format DECIMAL(12,5)
, menekan tautan "Reindex" pada baris "Reindex flat data" akan ALTER
menjadi flat table dan mengembalikannya DECIMAL(12,4)
.
Setelah mencari cukup banyak waktu, saya datang dengan fungsi
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
yang disebut prepareFlatTable($storeId)
. Fungsi ini kemudian memanggil convertOldColumnDefinition($column)
setiap kolom tabel datar (dalam hal ini).
Akhirnya, ketika melihat fungsi ini di
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
dalamnya tampaknya akan mengubah setiap decimal
dan numeric
seperti itu:
case 'decimal':
case 'numeric':
$length = $proposedLength;
$type = Varien_Db_Ddl_Table::TYPE_DECIMAL;
break;
di mana $proposedLength
adalah hasil dari ini:
$definition = trim($column['type']);
if (!preg_match('/([^(]*)(\\((.*)\\))?/', $definition, $matches)) {
throw Mage::exception(
'Mage_Core',
Mage::helper('core')->__("Wrong old style column type definition: {$definition}.")
);
}
$proposedLength = (isset($matches[3]) && strlen($matches[3])) ? $matches[3] : null;
Saya tidak begitu mengerti apa yang sedang terjadi di sini, saya akan meletakkan sesuatu yang dikodekan di sana tetapi saya tidak ingin mengganggu proses normal semua pengindeks.
Adakah yang bisa memberi tahu saya tentang masalah ini dan menawarkan saya solusi?
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
file? Saya memiliki masalah yang sama dan saya tidak dapat menemukan solusiJawaban:
Biarkan saya memberi Anda beberapa penjelasan tentang kode yang mengubah definisi kolom:
Jadi pada dasarnya
preg_match
metode ini akan memberi Anda sebuah array dalam$matches
variabel berdasarkan definisi kolom (disimpan dalam$definition
).Contoh definisi kolom biasanya terlihat seperti ini:
Definisi kolom tersebut masing-masing akan memberi Anda hasil berikut dalam
$matches
array:array('int','int')
array('varchar(100)','varchar','(100)','100')
array('decimal(12,4)','decimal','(12,4)','12,4')
Maka Anda punya
$proposedLength
variabel:$ proposLength = (isset ($ cocok [3]) && strlen ($ cocok [3]))? $ cocok [3]: null;
Pada dasarnya sama dengan entri ke-4 dalam
$matches
array jika yang ini diatur.Jadi dalam kasus Anda nilai yang
$proposeLength
seharusnya12,5
.Saran saya:
Tambahkan kode berikut tepat setelah
$proposedLength
deklarasi variabel:Coba lagi dan periksa
var/log/system.log
file Anda untuk memastikan bahwa kode berperilaku seperti seharusnya.sumber
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
.