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 ALTER
a 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 decimal
e numeric
assim:
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?
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
arquivo? Eu tenho o mesmo problema e eu não consigo encontrar uma soluçãoRespostas:
Deixe-me dar uma explicação sobre o código que converte a definição da coluna:
Então, basicamente, o
preg_match
método fornecerá uma matriz na$matches
variável com base na definição da coluna (armazenada em$definition
).Exemplo de definição de colunas geralmente se parece com isso:
Essas definições de coluna fornecerão, respectivamente, o seguinte resultado na
$matches
matriz:array('int','int')
array('varchar(100)','varchar','(100)','100')
array('decimal(12,4)','decimal','(12,4)','12,4')
Então você tem a
$proposedLength
variável:$ propostasLength = (isset ($ correspondências [3]) && strlen ($ correspondências [3]))? $ corresponde [3]: nulo;
É basicamente igual à quarta entrada da
$matches
matriz, se esta estiver configurada.Portanto, no seu caso, o valor de
$proposeLength
deveria ser12,5
.Minha sugestão:
Adicione o seguinte código logo após a
$proposedLength
declaração da variável:Tente novamente e verifique seu
var/log/system.log
arquivo para garantir que o código se comporte como deveria.fonte
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
.