質問

Magento 1システムは、パディング長を超える増分IDを生き残ることができますか?

eav_entity_typeテーブルには、デフォルトのincrement_pad_length列が含まれています。この

のようなもの
100000012
.

PADDINGがeav_entity_storeまたは1に設定されている場合、Magentoシステムは通常正常に動作しますか?Paddingが0のようなものに縮小されている場合、Magentoシステムは通常正常に動作します。

役に立ちましたか?

解決

Magentoのeav_entity_typeテーブルの列の長さを超えない限り、

爆発しません。

MagentoでPAD設定を使用する唯一の場所はMage_Eav_Model_Entity_Increment_Alphanum::getNextIdにあり、最後のIDセットを使用して最後の桁を増やします。

次のIDを計算すると、主要な接頭辞からトリミングされ、文字列パッドのみが残っています。 Inbuild PHP関数を使用して、それをパッドよりも長い文字列を無視します。

このREPL出力を参照してください:

[1] boris> str_pad('9999999999',8,'0',STR_PAD_LEFT);
 → string(10) "9999999999"
[2] boris> str_pad('999999999999999999',8,'0',STR_PAD_LEFT);
 → string(18) "999999999999999999"
.

SO ESSENCEは、結果のID文字列を他の文字列であったかのように扱います。その後のforループは、その文字列の全長で周期するのに十分スマートです。任意のサイズを簡単に処理する必要があります。

<?php

function test($lastId){
        $nextId = '';
        $bumpNextChar = true;
        $chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
        $lchars = strlen($chars);
        $lid = strlen($lastId)-1;

        for ($i = $lid; $i >= 0; $i--) {
            $p = strpos($chars, $lastId{$i});
            if (false===$p) {
                throw new Exception('Invalid character found');
            }
            if ($bumpNextChar) {
                $p++;
                $bumpNextChar = false;
            }
            if ($p===$lchars) {
                $p = 0;
                $bumpNextChar = true;
            }
            $nextId = $chars{$p}.$nextId;
        }   

        var_dump($nextId);
}

test('09234029342');
// =>string(11) "09234029343"

test('22');
// =>string(2) "23"
test('23409235092835029385023958230598235');
// =>string(35) "23409235092835029385023958230598236"
.

PHPの整数で特定の長さを超えると、それは科学的表記に変換されます。これは例外を引き起こします。

そのため、意図的にこれらを文字列として渡しました。

何らかの理由で magentoはこれらをintとしてエクスポートしました。これは、+記号のためにが爆破します。 P>

test(2.3409235092835E+34)
// =>PHP Fatal error:  Uncaught exception 'Exception' with message 'Invalid character found'
.

免責事項

私は1.2 CEの日にこれに反対したので、私と一緒に耐え、私の知識の年齢を考慮してください(そして私がこれらの仮定をする1.14.2.2 EEコードを読んでいるという事実を決してしない)

ライセンス: CC-BY-SA帰属
所属していません magento.stackexchange
scroll top