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 ALTER
la 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 decimal
et numeric
ainsi:
case 'decimal':
case 'numeric':
$length = $proposedLength;
$type = Varien_Db_Ddl_Table::TYPE_DECIMAL;
break;
dans lequel $proposedLength
est 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?
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
dossier? J'ai le même problème et je ne trouve pas de solutionRéponses:
Permettez-moi de vous donner quelques explications sur le code qui convertit la définition de colonne:
Donc, fondamentalement, la
preg_match
méthode vous donnera un tableau dans la$matches
variable 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:
Ces définitions de colonne vous donneront respectivement le résultat suivant dans le
$matches
tableau:array('int','int')
array('varchar(100)','varchar','(100)','100')
array('decimal(12,4)','decimal','(12,4)','12,4')
Ensuite, vous avez la
$proposedLength
variable:$ propositionLongueur = (isset ($ correspond à [3]) && strlen ($ correspond à [3]))? $ correspond à [3]: null;
Il est fondamentalement égal à la 4ème entrée du
$matches
tableau si celle-ci est définie.Donc, dans votre cas, la valeur de
$proposeLength
devrait être12,5
.Ma suggestion:
Ajoutez le code suivant juste après la
$proposedLength
déclaration de variable:Réessayez et vérifiez votre
var/log/system.log
fichier pour vous assurer que le code se comporte comme il se doit.la source
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
.