Un sitio web que administro requiere que los precios tengan 5 decimales. Seguí adelante y modifiqué al menos una docena de archivos / tablas en total para poder lograr esto. Pero (porque siempre hay un pero) parece haber un problema con catalog_product_flat_X
.
Permítanme explicar: para los precios en el frente, la mayoría de las veces se reduce a las llamadas Mage_Catalog_Model_Product->getPrice()
, que, según tengo entendido, buscarán el precio en las mesas planas (si tiene habilitadas las mesas planas). El problema es con la reindexación de datos.
Si mi tabla plana tiene un precio con el formato DECIMAL(12,5)
, al presionar el enlace "Reindex" en la línea "Reindex flat data" aparecerá ALTER
la tabla plana y la volverá a colocar DECIMAL(12,4)
.
Después de buscar una cantidad de tiempo bastante extensa, llegué a una función en la
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
que se llama prepareFlatTable($storeId)
. Esta función luego llama convertOldColumnDefinition($column)
a cada columna de la tabla plana (en este caso).
Por último, cuando se mira en esta función en
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
lo que parece ser la conversión de todos decimal
y numeric
de este modo:
case 'decimal':
case 'numeric':
$length = $proposedLength;
$type = Varien_Db_Ddl_Table::TYPE_DECIMAL;
break;
en cual $proposedLength
es el resultado de esto:
$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;
No entiendo lo que está pasando aquí, pondría algo codificado allí, pero no quiero interferir con el proceso normal de todos los indexadores.
¿Alguien puede iluminarme sobre este asunto y ofrecerme una solución?
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
archivo? Tengo el mismo problema y no puedo encontrar una soluciónRespuestas:
Déjame darte una explicación sobre el código que convierte la definición de columna:
Entonces, básicamente, el
preg_match
método le dará una matriz en la$matches
variable basada en la definición de columna (almacenada en$definition
).El ejemplo de definición de columnas generalmente se ve así:
Esas definiciones de columna le darán respectivamente el siguiente resultado en la
$matches
matriz:array('int','int')
array('varchar(100)','varchar','(100)','100')
array('decimal(12,4)','decimal','(12,4)','12,4')
Entonces tienes la
$proposedLength
variable:$ propuestoLength = (isset ($ coincide [3]) && strlen ($ coincide [3]))? $ coincide [3]: nulo;
Básicamente es igual a la cuarta entrada en la
$matches
matriz si esta está configurada.Entonces, en su caso, el valor de
$proposeLength
debería ser12,5
.Mi sugerencia:
Agregue el siguiente código justo después de la
$proposedLength
declaración de variable:Intente nuevamente y verifique su
var/log/system.log
archivo para asegurarse de que el código se comporte como debería.fuente
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
.