Cómo alterar los tipos de columna catalog_product_flat

8

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á ALTERla 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 decimaly numericde este modo:

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

en cual $proposedLengthes 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?

Julien Lachal
fuente
¿puedes publicar la solución? ¿Qué cambiaste en el app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phparchivo? Tengo el mismo problema y no puedo encontrar una solución
zekia
@zekia Sinceramente, no puedo recordar lo siento.
Julien Lachal

Respuestas:

0

Déjame darte una explicación sobre el código que convierte la definición de columna:

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

Entonces, básicamente, el preg_matchmétodo le dará una matriz en la $matchesvariable basada en la definición de columna (almacenada en $definition).

El ejemplo de definición de columnas generalmente se ve así:

  • En t
  • varchar (100)
  • decimal (12,4)

Esas definiciones de columna le darán respectivamente el siguiente resultado en la $matchesmatriz:

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

Entonces tienes la $proposedLengthvariable:

$ propuestoLength = (isset ($ coincide [3]) && strlen ($ coincide [3]))? $ coincide [3]: nulo;

Básicamente es igual a la cuarta entrada en la $matchesmatriz si esta está configurada.

Entonces, en su caso, el valor de $proposeLengthdebería ser 12,5.

Mi sugerencia:

Agregue el siguiente código justo después de la $proposedLengthdeclaración de variable:

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

Intente nuevamente y verifique su var/log/system.logarchivo para asegurarse de que el código se comporte como debería.

Raphael en Digital Pianism
fuente
@fschmengler editó el título de mi pregunta, que ahora es engañoso porque no coincide con lo que quería hacer en mi pregunta. Terminé codificando un valor en app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php.
Julien Lachal
@JulienLachal, siéntase libre de publicar su solución y marcar su pregunta como respondida
Raphael en Digital Pianism
No, no es una solución, es un truco, así que no lo publicaré. Creo que aceptaré tu, ya que detalla lo que se supone que debe pasar.
Julien Lachal