如何更改catalog_product_flat列类型


8

我管理的网站要求价格必须有5位小数。我继续修改了至少十二个文件/表,以实现此目的。但是(因为总是有一个but)似乎有问题catalog_product_flat_X

让我解释一下:对于最前面的价格,大多数时候都归结为调用Mage_Catalog_Model_Product->getPrice(),据我所知,它将在平面表中查找价格(如果启用了平面表)。问题在于数据的重新索引编制。

如果我的平面桌具有以下格式的价格,则DECIMAL(12,5)点击“ Reindex平面数据”行上的“ Reindex”链接会将ALTER平面表放回DECIMAL(12,4)

在搜索了相当长的时间后,我遇到了一个
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
名为的函数prepareFlatTable($storeId)。然后,此函数调用convertOldColumnDefinition($column)平面表的每一列(在这种情况下)。

最后,看该功能时
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
它似乎是每一个转换decimal,并numeric像这样:

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

其中$proposedLength是这样的结果:

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

我不太了解这里发生了什么,我在这里放了一些硬编码的东西,但是我不想干扰所有索引器的正常过程。

谁能在这件事上启发我并提供解决方案?


可以请您发布解决方案吗?您在app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php文件中做了什么更改?我有同样的问题,但找不到解决方案
zekia

@zekia老实说,我不记得对不起。
朱利安·拉查

Answers:


0

让我给您一些有关转换列定义的代码的解释:

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

因此,基本上,该preg_match方法将$matches根据列定义(存储在中$definition)在变量中为您提供一个数组。

列定义的示例通常如下所示:

  • 整型
  • varchar(100)
  • 十进制(12,4)

这些列定义将在$matches数组中分别为您提供以下结果:

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

然后,您得到了$proposedLength变量:

$ proposedLength =(isset($ matches [3])&& strlen($ matches [3]))吗?$ matches [3]:空;

$matches如果设置了此项,则它基本上等于数组中的第4个条目。

因此,根据您的情况,的价值$proposeLength应为12,5

我的建议:

$proposedLength变量声明之后添加以下代码:

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

重试并检查您的var/log/system.log文件,以确保代码的行为与预期一致。


@fschmengler编辑了我的问题的标题,该标题现在具有误导性,因为它与我要问的问题不匹配。我最终对中的值进行了硬编码app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
Julien Lachal '16

@JulienLachal随时发布您的解决方案并将您的问题标记为已回答
Raphael在Digital Pianism '16

不,这不是解决方案,而是hack,所以我不会发布。我想我会接受您的,因为它详细说明了应该发生的事情。
Julien Lachal '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.