Frage

Kann ein Magento 1-System eine Inkrement-ID überleben, die seine Auffülllänge überschreitet?

Das ist -- das eav_entity_type tabelle enthält eine increment_pad_length spalte, die standardmäßig 8 ist.Dies bedeutet, wenn Magento eine Inkrement-ID für eine Bestellung (oder ein Angebot, eine Sendung usw.) aus dem generiert eav_entity_store tabelle, es wird die Nummer auffüllen, um ungefähr so auszusehen

100000012

Wird ein Magento-System noch normal funktionieren, wenn diese Auffüllung auf eingestellt ist 1 oder 0?Wird ein Magento-System noch normal funktionieren, wenn diese Auffüllung auf etwas wie reduziert wird 4, und der tatsächliche Inkrement-ID-Wert in eav_entity_store ist größer als 10.000?

War es hilfreich?

Lösung

Es wird nicht explodieren, es sei denn, Sie überschreiten die Spaltenlänge in Magento eav_entity_type Tabelle.

Der einzige Ort, an dem die Pad-Einstellung in Magento verwendet wird, ist in Mage_Eav_Model_Entity_Increment_Alphanum::getNextId, und das verwendet die zuletzt festgelegte ID, um die letzten Ziffern zu erhöhen.

Während es die nächste ID berechnet, schneidet es das führende Präfix ab und nur noch String-Pads übrig.Dazu wird die eingebaute PHP-Funktion verwendet, die Zeichenfolgen ignoriert, die länger als das Pad sind.

Siehe diese Repl-Ausgabe:

[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"

Im Wesentlichen behandelt es also nur die resultierende ID-Zeichenfolge so, als wäre es eine andere Zeichenfolge.Der for die anschließende Schleife ist intelligent genug, um die Gesamtlänge dieser Zeichenfolge zu durchlaufen, und sollte problemlos mit jeder Größe umgehen können:

<?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"

Beachten Sie, dass wenn Sie eine bestimmte Länge mit einer Ganzzahl in PHP überschreiten, diese in wissenschaftliche Notation konvertiert wird, was die Ausnahme auslöst.

Deshalb habe ich diese absichtlich als Zeichenfolge übergeben.

Wenn aus irgendeinem Grund Magento hat diese als exportiert int, was ich nicht gesehen habe, dann ist es würde sprengen, wegen des + Symbols:

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

Haftungsausschluss

Ich bin in 1,2 CE-Tagen darauf gestoßen, also ertrage es mit mir und bedenke das Alter meines Wissens (und vergiss die Tatsache, dass ich 1.14.2.2 EE-Code lese, der diese Annahmen trifft)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit magento.stackexchange
scroll top