Como alterar os tipos de coluna catalog_product_flat

8

Um site que eu gerencio exige que os preços tenham 5 casas decimais. Fui em frente e modifiquei pelo menos uma dúzia de arquivos / tabelas para conseguir isso. Mas (porque sempre há um mas) parece haver um problema catalog_product_flat_X.

Deixe-me explicar: para os preços na frente, na maioria das vezes, é a chamada Mage_Catalog_Model_Product->getPrice(), que, pelo que entendi, procurará o preço nas mesas planas (se você tiver as mesas planas ativadas). O problema está na reindexação dos dados.

Se minha mesa plana tiver um preço com o formato DECIMAL(12,5), clicar no link "Reindexar" na linha "Reindexar dados simples" fará com que ALTERa mesa plana seja colocada novamente DECIMAL(12,4).

Depois de pesquisar por uma quantidade bastante extensa de tempo, cheguei a uma função na
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
qual é chamada prepareFlatTable($storeId). Essa função chama convertOldColumnDefinition($column)todas as colunas da tabela plana (neste caso).

Finalmente, quando se olha para esta função em
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
que parece ser converter todos os decimale numericassim:

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

em que $proposedLengthé o resultado disso:

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

Eu não entendo direito o que está acontecendo aqui, eu colocaria algo codificado lá, mas não quero interferir no processo normal de todos os indexadores.

Alguém pode me esclarecer sobre esse assunto e me oferecer uma solução?

Julien Lachal
fonte
você pode postar a solução? O que você mudou no app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phparquivo? Eu tenho o mesmo problema e eu não consigo encontrar uma solução
zekia
@zekia Eu sinceramente não me lembro de me desculpar.
Julien Lachal #: 24418

Respostas:

0

Deixe-me dar uma explicação sobre o código que converte a definição da coluna:

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

Então, basicamente, o preg_matchmétodo fornecerá uma matriz na $matchesvariável com base na definição da coluna (armazenada em $definition).

Exemplo de definição de colunas geralmente se parece com isso:

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

Essas definições de coluna fornecerão, respectivamente, o seguinte resultado na $matchesmatriz:

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

Então você tem a $proposedLengthvariável:

$ propostasLength = (isset ($ correspondências [3]) && strlen ($ correspondências [3]))? $ corresponde [3]: nulo;

É basicamente igual à quarta entrada da $matchesmatriz, se esta estiver configurada.

Portanto, no seu caso, o valor de $proposeLengthdeveria ser 12,5.

Minha sugestão:

Adicione o seguinte código logo após a $proposedLengthdeclaração da variável:

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

Tente novamente e verifique seu var/log/system.logarquivo para garantir que o código se comporte como deveria.

Raphael na Digital Pianism
fonte
O @fschmengler editou o título da minha pergunta, que agora é enganador porque não corresponde ao que eu queria fazer na minha pergunta. Acabei codificando um valor em app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php.
precisa saber é o seguinte
@JulienLachal fique à vontade para postar sua solução e marcar sua pergunta como respondida
Raphael em Digital Pianism
Não, não é uma solução, é um hack, então não vou publicá-lo. Acho que vou aceitar o seu, pois detalha o que deveria acontecer.
Julien Lachal