Comment modifier les types de colonnes catalog_product_flat

8

Un site Web que je gère exige que les prix aient 5 décimales. Je suis allé de l'avant et j'ai modifié au moins une douzaine de fichiers / tables pour pouvoir y parvenir. Mais (parce qu'il y a toujours un mais) il semble y avoir un problème avec catalog_product_flat_X.

Je m'explique: pour les prix sur le devant, la plupart du temps, cela revient à appeler Mage_Catalog_Model_Product->getPrice(), qui, si je comprends bien, recherchera le prix dans les tables plates (si vous avez activé les tables plates). Le problème concerne la réindexation des données.

Si ma table plate a un prix avec le format DECIMAL(12,5), cliquer sur le lien "Réindexer" sur la ligne "Données plates de réindexer" fera apparaître ALTERla table plate et la remettre DECIMAL(12,4).

Après avoir cherché un temps assez long, je suis venu avec une fonction dans
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
laquelle on appelle prepareFlatTable($storeId). Cette fonction fait ensuite appel convertOldColumnDefinition($column)à chaque colonne de la table plate (dans ce cas).

Enfin, quand on regarde cette fonction,
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
elle semble convertir tout le monde decimalet numericainsi:

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

dans lequel $proposedLengthest le résultat de ceci:

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

Je ne comprends pas très bien ce qui se passe ici, j'y mettrais quelque chose de codé en dur mais je ne veux pas interférer avec le processus normal de tous les indexeurs.

Quelqu'un peut-il m'éclairer sur ce sujet et me proposer une solution?

Julien Lachal
la source
pouvez-vous s'il vous plaît poster la solution? Qu'avez-vous changé dans le app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phpdossier? J'ai le même problème et je ne trouve pas de solution
zekia
@zekia Je ne me souviens vraiment pas désolé.
Julien Lachal

Réponses:

0

Permettez-moi de vous donner quelques explications sur le code qui convertit la définition de colonne:

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

Donc, fondamentalement, la preg_matchméthode vous donnera un tableau dans la $matchesvariable basée sur la définition de la colonne (stockée dans $definition).

Un exemple de définition de colonnes ressemble généralement à ceci:

  • int
  • varchar (100)
  • décimal (12,4)

Ces définitions de colonne vous donneront respectivement le résultat suivant dans le $matchestableau:

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

Ensuite, vous avez la $proposedLengthvariable:

$ propositionLongueur = (isset ($ correspond à [3]) && strlen ($ correspond à [3]))? $ correspond à [3]: null;

Il est fondamentalement égal à la 4ème entrée du $matchestableau si celle-ci est définie.

Donc, dans votre cas, la valeur de $proposeLengthdevrait être 12,5.

Ma suggestion:

Ajoutez le code suivant juste après la $proposedLengthdéclaration de variable:

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

Réessayez et vérifiez votre var/log/system.logfichier pour vous assurer que le code se comporte comme il se doit.

Raphael chez Digital Pianism
la source
@fschmengler a modifié le titre de ma question, qui est maintenant trompeur car il ne correspond pas à ce que je voulais poser dans ma question. J'ai fini par coder en dur une valeur app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php.
Julien Lachal
@JulienLachal n'hésitez pas à poster votre solution et à marquer votre question comme ayant été répondue
Raphael au Digital Pianism
Non, ce n'est pas une solution, c'est un hack, donc je ne le posterai pas. Je pense que je vais accepter votre car il détaille ce qui est censé se passer.
Julien Lachal