catalog_product_flat列タイプを変更する方法


8

私が管理しているWebサイトでは、価格に小数点以下5桁が必要です。私は先に進んで、これを達成できるように、少なくとも12のファイル/テーブルを完全に変更しました。しかし(常にaが存在するため)、に問題があるようcatalog_product_flat_Xです。

説明させてください:前面の価格の場合、ほとんどの場合、それはを呼び出すMage_Catalog_Model_Product->getPrice()ことになります。これは、私が理解しているように、フラットテーブルで価格を探します(フラットテーブルが有効になっている場合)。問題は、データの再インデックス付けです。

フラットテーブルにフォーマット付きの価格がある場合、DECIMAL(12,5)[フラットデータの再インデックス]行の[再インデックス]リンクをクリックするとALTER、フラットテーブルがに戻りDECIMAL(12,4)ます。

時間のかなりextented量のために検索した後、私は、関数accros来た
app/code/core/Mage/Catalog/Model/Resource/Product/Flat/Indexer.php
と呼ばれていますprepareFlatTable($storeId)。次に、この関数convertOldColumnDefinition($column)はフラットテーブルのすべての列を呼び出します(この場合)。

最後に、この関数を見る
app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
と、すべてが変換されdecimalnumericいるようです:

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

これ$proposedLengthの結果は次のとおりです。

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

ここで何が起こっているのかよくわかりません。ハードコードされたものを入れますが、すべてのインデクサーの通常のプロセスに干渉したくありません。

誰かがこの問題について私を啓発し、私に解決策を提供できますか?


ソリューションを投稿していただけますか?app/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.phpファイルで何を変更しましたか?同じ問題があり、解決策が見つからない
zekia

@zekia正直申し訳ありませんが思い出せません。
Julien Lachal

回答:


0

列定義を変換するコードについて説明します。

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

したがって、基本的にこのpreg_matchメソッドは、$matches(に格納されている$definition)列の定義に基づいて変数に配列を提供します。

列定義の例は通常、次のようになります。

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

これらの列定義は、それぞれ$matches配列で次の結果を提供します。

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

次に、$proposedLength変数を取得します。

$ proposedLength =(isset($ matches [3])&& strlen($ matches [3]))?$ matches [3]:null;

これが$matches設定されている場合、基本的に配列の4番目のエントリと同じです。

したがって、あなたの場合、の値はに$proposeLengthなります12,5

私のおすすめ:

$proposedLength変数宣言の直後に次のコードを追加します。

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

もう一度やり直してvar/log/system.logファイルをチェックし、コードが正常に動作することを確認してください。


@fschmenglerが私の質問のタイトルを編集しましたが、私の質問で尋ねたかったものと一致しないため、誤解を招くようになりました。私は最終的に値をハードコーディングしましたapp/code/core/Mage/Catalog/Model/Resource/Helper/Abstract.php
Julien Lachal

@JulienLachalは、ソリューションを投稿し、質問に回答済みのマークを付けてください
Raphael at Digital Pianism

いや、それは解決策ではなく、それはハックなので、投稿しません。何が起こるかを詳しく説明しているので、私はあなたを受け入れます。
Julien Lachal
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.