Für eine von mir verwaltete Website müssen die Preise 5 Dezimalstellen haben. Ich habe mindestens ein Dutzend Dateien / Tabellen geändert, um dies zu erreichen. Aber (weil es immer ein Aber gibt) scheint es ein Problem mit zu geben catalog_product_flat_X
.
Lassen Sie mich erklären: Bei den Preisen auf der Vorderseite kommt es meistens auf den Anruf an Mage_Catalog_Model_Product->getPrice()
, bei dem nach meinem Verständnis der Preis in den flachen Tischen gesucht wird (wenn Sie flache Tische aktiviert haben). Das Problem ist die Neuindizierung von Daten.
Wenn mein flacher Tisch einen Preis mit dem Format hat DECIMAL(12,5)
, wird ALTER
der flache Tisch durch Klicken auf den Link "Reindex" in der Zeile "Reindex flache Daten" wieder angezeigt DECIMAL(12,4)
.
Nachdem ich ziemlich lange gesucht hatte, kam ich zu einer Funktion,
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
die aufgerufen wird prepareFlatTable($storeId)
. Diese Funktion ruft dann convertOldColumnDefinition($column)
jede Spalte der flachen Tabelle auf (in diesem Fall).
Wenn man sich diese Funktion in betrachtet
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
, scheint sie schließlich alle zu konvertieren decimal
und numeric
so:
case 'decimal':
case 'numeric':
$length = $proposedLength;
$type = Varien_Db_Ddl_Table::TYPE_DECIMAL;
break;
in dem $proposedLength
ist das Ergebnis davon:
$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;
Ich verstehe nicht ganz, was hier vor sich geht, ich würde dort etwas fest codiertes einfügen, aber ich möchte den normalen Prozess aller Indexer nicht stören.
Kann mich jemand in dieser Angelegenheit aufklären und mir eine Lösung anbieten?
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
Datei geändert ? Ich habe das gleiche Problem und kann keine Lösung findenAntworten:
Lassen Sie mich einige Erklärungen zu dem Code geben, der die Spaltendefinition konvertiert:
Grundsätzlich
preg_match
gibt Ihnen die Methode ein Array in der$matches
Variablen basierend auf der Spaltendefinition (gespeichert in$definition
).Das Beispiel für die Spaltendefinition sieht normalerweise folgendermaßen aus:
Diese Spaltendefinitionen führen jeweils zu folgendem Ergebnis im
$matches
Array:array('int','int')
array('varchar(100)','varchar','(100)','100')
array('decimal(12,4)','decimal','(12,4)','12,4')
Dann haben Sie die
$proposedLength
Variable:$ vorgeschlagenenLänge = (isset ($ Übereinstimmungen [3]) && strlen ($ Übereinstimmungen [3]))? $ entspricht [3]: null;
Es ist im Grunde gleich dem 4. Eintrag im
$matches
Array, wenn dieser gesetzt ist.In Ihrem Fall sollte der Wert von also
$proposeLength
sein12,5
.Mein Vorschlag:
Fügen Sie direkt nach der
$proposedLength
Variablendeklaration den folgenden Code hinzu :Versuchen Sie es erneut und überprüfen Sie Ihre
var/log/system.log
Datei, um sicherzustellen, dass sich der Code wie gewünscht verhält.quelle
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
.