Magento1 :Dépassement de la longueur de remplissage d'un ID d'incrément
-
13-12-2019 - |
Question
Un système Magento 1 peut-il survivre à un ID d'incrément qui dépasse sa longueur de remplissage ?
C'est le eav_entity_type
le tableau contient un increment_pad_length
colonne dont la valeur par défaut est 8.Cela signifie que lorsque Magento génère un identifiant d'incrément pour une commande (ou un devis, une expédition, etc.) à partir du eav_entity_store
tableau, cela remplira le numéro pour qu'il ressemble à ceci
100000012
Un système Magento fonctionnera-t-il toujours normalement si ce remplissage est défini sur 1
ou 0
?Un système Magento fonctionnera-t-il toujours normalement si ce remplissage est réduit à quelque chose comme 4
, et la valeur réelle de l'ID d'incrément dans eav_entity_store
est supérieur à 10 000 ?
La solution
Il n'explosera pas, sauf si vous dépassez la longueur de la colonne dans Magento. eav_entity_type
tableau.
Le seul endroit où le paramètre pad est utilisé dans Magento est dans Mage_Eav_Model_Entity_Increment_Alphanum::getNextId
, et qui utilise le dernier ID défini pour incrémenter le(s) dernier(s) chiffre(s).
Lors du calcul de l'ID suivant, il supprime le préfixe principal et ne laisse que les pads de chaîne.Pour ce faire, il utilise la fonction PHP intégrée, qui ignore les chaînes plus longues que le pad.
Voir cette sortie de réponse :
[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"
Donc, en substance, il traite simplement la chaîne d'identification résultante comme s'il s'agissait de n'importe quelle autre chaîne.Le for
la boucle ultérieure est suffisamment intelligente pour parcourir la longueur totale de cette chaîne et devrait facilement gérer n'importe quelle taille :
<?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"
Sachez que si vous dépassez une certaine longueur avec un entier en PHP, celui-ci sera converti en notation scientifique, ce qui déclenchera l'exception.
Par conséquent, je les ai intentionnellement transmis sous forme de chaîne.
Si pour une raison quelconque Magento les a exportés en tant que int
, que je n'ai pas vu, alors serait exploser, à cause du symbole + :
test(2.3409235092835E+34)
// =>PHP Fatal error: Uncaught exception 'Exception' with message 'Invalid character found'
Clause de non-responsabilité
Je me suis heurté à cela en 1,2 jours CE, alors soyez indulgents avec moi et considérez l'âge de mes connaissances (et peu importe le fait que je lis le code 1.14.2.2 EE en faisant ces hypothèses)