So ändern Sie die Spaltentypen catalog_product_flat


8

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 ALTERder 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 decimalund numericso:

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

in dem $proposedLengthist 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?


Kannst du bitte die Lösung posten? Was haben Sie in der app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phpDatei geändert ? Ich habe das gleiche Problem und kann keine Lösung finden
zekia

@zekia Ich kann mich ehrlich gesagt nicht erinnern, tut mir leid.
Julien Lachal

Antworten:


0

Lassen Sie mich einige Erklärungen zu dem Code geben, der die Spaltendefinition konvertiert:

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

Grundsätzlich preg_matchgibt Ihnen die Methode ein Array in der $matchesVariablen basierend auf der Spaltendefinition (gespeichert in $definition).

Das Beispiel für die Spaltendefinition sieht normalerweise folgendermaßen aus:

  • int
  • varchar (100)
  • dezimal (12,4)

Diese Spaltendefinitionen führen jeweils zu folgendem Ergebnis im $matchesArray:

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

Dann haben Sie die $proposedLengthVariable:

$ vorgeschlagenenLänge = (isset ($ Übereinstimmungen [3]) && strlen ($ Übereinstimmungen [3]))? $ entspricht [3]: null;

Es ist im Grunde gleich dem 4. Eintrag im $matchesArray, wenn dieser gesetzt ist.

In Ihrem Fall sollte der Wert von also $proposeLengthsein 12,5.

Mein Vorschlag:

Fügen Sie direkt nach der $proposedLengthVariablendeklaration den folgenden Code hinzu :

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

Versuchen Sie es erneut und überprüfen Sie Ihre var/log/system.logDatei, um sicherzustellen, dass sich der Code wie gewünscht verhält.


@fschmengler hat den Titel meiner Frage bearbeitet, was jetzt irreführend ist, da er nicht mit dem übereinstimmt, was ich in meiner Frage stellen wollte. Am Ende habe ich einen Wert in fest codiert app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php.
Julien Lachal

@ JulienLachal zögern Sie nicht, Ihre Lösung zu posten und Ihre Frage als beantwortet zu markieren
Raphael bei Digital Pianism

Nein, es ist keine Lösung, es ist ein Hack, also werde ich es nicht posten. Ich denke, ich werde Ihre akzeptieren, da sie genau beschreibt, was passieren soll.
Julien Lachal
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.