Магенто 1:Превышение длины заполнения идентификатора приращения
-
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, делая эти предположения)