Magento 1:Überschreiten der Auffülllänge einer Inkrement-ID
-
13-12-2019 - |
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?
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)