Làm cách nào để thay đổi các loại cột catalog_product_flat


8

Một trang web tôi quản lý yêu cầu giá phải có 5 số thập phân. Tôi đã đi trước và sửa đổi ít nhất một tá tệp / bảng để có thể đạt được điều này. Nhưng (vì luôn luôn có một) nhưng dường như có vấn đề catalog_product_flat_X.

Hãy để tôi giải thích: đối với giá ở mặt trước, hầu hết thời gian, sẽ đến để gọi Mage_Catalog_Model_Product->getPrice(), mà theo tôi hiểu, sẽ tìm giá trong các bàn phẳng (nếu bạn đã bật bảng phẳng). Vấn đề là với việc reindexing dữ liệu.

Nếu bảng phẳng của tôi có giá với định dạng DECIMAL(12,5), nhấn liên kết "Reindex" trên dòng "Dữ liệu phẳng Reindex" sẽ ALTERđặt bảng phẳng và đặt lại DECIMAL(12,4).

Sau khi tìm kiếm trong một khoảng thời gian khá dài, tôi đã tìm thấy một hàm
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
được gọi prepareFlatTable($storeId). Hàm này sau đó gọi convertOldColumnDefinition($column)trên mỗi cột của bảng phẳng (trong trường hợp này).

Cuối cùng, khi nhìn vào chức năng này,
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
nó dường như đang chuyển đổi mọi thứ decimalnumericnhư vậy:

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

trong đó $proposedLengthlà kết quả của việc này:

$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;  

Tôi hoàn toàn không hiểu chuyện gì đang xảy ra ở đây, tôi đã đặt thứ gì đó được mã hóa cứng vào đó nhưng tôi không muốn can thiệp vào quá trình bình thường của tất cả những người lập chỉ mục.

Bất cứ ai có thể khai sáng cho tôi về vấn đề này và cung cấp cho tôi một giải pháp?


bạn có thể xin vui lòng gửi giải pháp? Bạn đã thay đổi những gì trong app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phptập tin? Tôi có cùng một vấn đề và tôi không thể tìm ra giải pháp
zekia

@zekia Thật lòng tôi không thể nhớ xin lỗi.
Julien Lachal

Câu trả lời:


0

Để tôi giải thích cho bạn về mã chuyển đổi định nghĩa cột:

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

Vì vậy, về cơ bản preg_matchphương thức sẽ cung cấp cho bạn một mảng trong $matchesbiến dựa trên định nghĩa cột (được lưu trữ trong $definition).

Ví dụ về định nghĩa cột thường trông như thế này:

  • int
  • varar (100)
  • số thập phân (12,4)

Các định nghĩa cột tương ứng sẽ cung cấp cho bạn kết quả sau trong $matchesmảng:

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

Sau đó, bạn đã có $proposedLengthbiến:

$ đề xuấtLpm = (isset ($ khớp [3]) && strlen ($ khớp [3]))? $ khớp [3]: null;

Về cơ bản, nó tương đương với mục thứ 4 trong $matchesmảng nếu cái này được đặt.

Vì vậy, trong trường hợp của bạn giá trị của $proposeLengthnên được 12,5.

Đề xuất của tôi:

Thêm mã sau đây ngay sau khi $proposedLengthkhai báo biến:

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

Hãy thử lại và kiểm tra var/log/system.logtệp của bạn để đảm bảo rằng mã hoạt động như bình thường.


@fschmengler đã chỉnh sửa tiêu đề câu hỏi của tôi, hiện đang gây hiểu lầm vì nó không khớp với những gì tôi muốn hỏi trong câu hỏi của mình. Tôi đã kết thúc việc mã hóa một giá trị trong app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php.
Julien Lachal

@JulienLachal vui lòng đăng giải pháp của bạn và đánh dấu câu hỏi của bạn như đã trả lời
Raphael tại Digital Pianism

Không, đó không phải là một giải pháp, đó là một bản hack, vì vậy tôi sẽ không đăng nó. Tôi nghĩ rằng tôi sẽ chấp nhận của bạn vì nó chi tiết những gì sẽ xảy ra.
Julien Lachal
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.