Магенто 1:Превышение длины заполнения идентификатора приращения

magento.stackexchange https://magento.stackexchange.com//questions/90031

  •  13-12-2019
  •  | 
  •  

Вопрос

Может ли система Magento 1 пережить идентификатор приращения, превышающий длину заполнения?

Это eav_entity_type таблица содержит increment_pad_length столбец, который по умолчанию равен 8.Это означает, что когда Magento генерирует идентификатор приращения для заказа (или предложения, отгрузки и т. д.) из eav_entity_store таблицу, она дополнит число, чтобы оно выглядело примерно так

100000012

Будет ли система Magento работать нормально, если для этого поля установлено значение 1 или 0?Будет ли система Magento работать нормально, если это дополнение будет уменьшено до чего-то вроде 4, и фактическое значение идентификатора приращения в eav_entity_store больше 10 000?

Это было полезно?

Решение

Он не взорвется, если вы не превысите длину столбца в Magento. eav_entity_type стол.

Единственное место, где в Magento используется настройка площадки, — это Mage_Eav_Model_Entity_Increment_Alphanum::getNextId, и он использует набор Last ID для увеличения последней цифры.

При вычислении следующего идентификатора он отсекает начальный префикс, и остаются только пробелы в строке.Для этого он использует встроенную функцию PHP, которая игнорирует строки длиннее, чем клавиатура.

См. этот вывод ответа:

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

Таким образом, по сути, он просто обрабатывает полученную строку идентификатора, как если бы это была любая другая строка.А for Loop after достаточно умен, чтобы циклически повторять всю длину этой строки, и должен легко обрабатывать любой размер:

<?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, чего я не видел, то это бы взорваться из-за символа +:

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