Cara mengubah jenis kolom catalog_product_flat

8

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 ALTERmenjadi 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 decimaldan numericseperti itu:

case 'decimal':
case 'numeric':
        $length = $proposedLength;
        $type = Varien_Db_Ddl_Table::TYPE_DECIMAL;
        break;  

di mana $proposedLengthadalah 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?

Julien Lachal
sumber
bisakah kamu memposting solusinya? Apa yang Anda ubah dalam app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phpfile? Saya memiliki masalah yang sama dan saya tidak dapat menemukan solusi
zekia
@zekia Aku benar-benar tidak ingat maaf.
Julien Lachal

Jawaban:

0

Biarkan saya memberi Anda beberapa penjelasan tentang kode yang mengubah definisi kolom:

    $definition = trim($column['type']);
    if (!preg_match('/([^(]*)(\\((.*)\\))?/', $definition, $matches)) {
        throw Mage::exception(
            'Mage_Core',
            Mage::helper('core')->__("Wrong old style column type definition: {$definition}.")
        );
    }

Jadi pada dasarnya preg_matchmetode ini akan memberi Anda sebuah array dalam $matchesvariabel berdasarkan definisi kolom (disimpan dalam $definition).

Contoh definisi kolom biasanya terlihat seperti ini:

  • int
  • varchar (100)
  • desimal (12,4)

Definisi kolom tersebut masing-masing akan memberi Anda hasil berikut dalam $matchesarray:

  • array('int','int')
  • array('varchar(100)','varchar','(100)','100')
  • array('decimal(12,4)','decimal','(12,4)','12,4')

Maka Anda punya $proposedLengthvariabel:

$ proposLength = (isset ($ cocok [3]) && strlen ($ cocok [3]))? $ cocok [3]: null;

Pada dasarnya sama dengan entri ke-4 dalam $matchesarray jika yang ini diatur.

Jadi dalam kasus Anda nilai yang $proposeLengthseharusnya 12,5.

Saran saya:

Tambahkan kode berikut tepat setelah $proposedLengthdeklarasi variabel:

Mage::log($column);
Mage::log($matches);
Mage::log($proposedLength);

Coba lagi dan periksa var/log/system.logfile Anda untuk memastikan bahwa kode berperilaku seperti seharusnya.

Raphael di Digital Pianism
sumber
@fschmengler mengedit judul pertanyaan saya, yang sekarang menyesatkan karena tidak cocok dengan apa yang ingin saya tanyakan dalam pertanyaan saya. Saya akhirnya membuat hardcoding nilai di app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php.
Julien Lachal
@JulienLachal merasa bebas untuk mengirim solusi Anda dan menandai pertanyaan Anda sebagai dijawab
Raphael di Digital Pianism
Nah, ini bukan solusi, ini hack, jadi saya tidak akan mempostingnya. Saya pikir saya akan menerima Anda karena merinci apa yang seharusnya terjadi.
Julien Lachal