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 ?

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top