سؤال

هل يمكن لنظام Magento 1 أن يتحمل معرف الزيادة الذي يتجاوز طول الحشو الخاص به؟

ذلك - eav_entity_type يحتوي الجدول على increment_pad_length العمود الافتراضي هو 8.وهذا يعني أنه عندما تقوم Magento بإنشاء معرف زيادة لطلب (أو عرض أسعار، أو شحنة، وما إلى ذلك) من eav_entity_store الجدول، وسوف لوحة الرقم لتبدو شيئا من هذا القبيل

100000012

هل سيظل نظام Magento يعمل بشكل طبيعي إذا تم ضبط هذه الحشوة على؟ 1 أو 0؟هل سيظل نظام Magento يعمل بشكل طبيعي إذا تم تقليل هذه المساحة المتروكة إلى شيء من هذا القبيل 4, ، وقيمة معرف الزيادة الفعلية في eav_entity_store أكبر من 10000؟

هل كانت مفيدة؟

المحلول

لن ينفجر إلا إذا تجاوزت طول العمود في Magento eav_entity_type طاولة.

المكان الوحيد الذي يتم فيه استخدام إعداد اللوحة في Magento هو Mage_Eav_Model_Entity_Increment_Alphanum::getNextId, ، ويستخدم مجموعة المعرف الأخير لزيادة الرقم (الأرقام) الأخير.

أثناء حساب المعرف التالي، فإنه يقوم بقص البادئة البادئة، ولا يتبقى سوى منصات السلسلة.ويستخدم وظيفة inbuild PHP للقيام بذلك، والتي تتجاهل السلاسل الأطول من اللوحة.

انظر هذا الناتج repl:

[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 تعد الحلقة بعد ذلك ذكية بما يكفي للتنقل عبر الطول الإجمالي لتلك السلسلة، ويجب أن تتعامل بسهولة مع أي حجم:

<?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