استيراد سكريبتات vbulletin5.rb

أنا أستخدم سكربت الاستيراد الرسمي لـ vBulletin v5 وواجهت مشكلة.

هيكل منتدى vBulletin الخاص بي هو كالتالي:

/forum/
/forum/sub-category1/
/forum/sub-category1/thread1/
/forum/sub-category1/thread2/
/forum/sub-category2/
/forum/sub-category2/thread1/
/forum/sub-category2/thread2/

عند تشغيل سكربت الاستيراد، ينتج عن ذلك فئتان في Discourse بدون أي مواضيع:

/c/sub-category1
/c/sub-category2

لقد تفحصت منتدى vBulletin آخر ولاحظت أنهم لا يقومون بتضمين الروابط بشكل متداخل. الآن أفترض أن هذا هو التغيير الذي يجب أن أجريه على منتدي قبل أن أتمكن من استخدام السكربت:

/forum/
/forum/sub-category1/
/forum/sub-category2/
/forum/thread1a/
/forum/thread2a/
/forum/thread1b/
/forum/thread2b/

بعد ذلك، سأضطر إلى تعيين الفئات يدوياً لكل موضوع مرة أخرى.

هل لدى أحدكم خبرة في استخدام هذا السكربت؟

هل هناك شيء ربما يلفت انتباهك داخل السكربت يمكن تعديله ليتعامل مع هيكل أكثر تداخلاً؟ قد أكون على مسار خاطئ تماماً.

هل تقصد بمصطلح “خيط” موضوعًا في منصة Discourse؟ هل المواضيع تُنشأ ولكنها لا تظهر في الفئات الصحيحة؟

مرحبًا جاى،

شكرًا لك على ردك.

آه نعم - أعني مواضيع Discourse. لا يوجد هناك سوى تلك الفئات الفارغة. وتم استيراد جميع المستخدمين بنجاح.

مايك

يبدو أن هناك شيئًا ما يمنع استيراد المواضيع والمشاركات. أعتقد أنك ستلاحظ وجود أخطاء عند تشغيل العملية. يتم إنشاء المواضيع والمشاركات بعد إنشاء المستخدمين. أعتقد أن إنشاء المواضيع والمشاركات يتم عبر دوال منفصلة. يجب أن يعرض برنامج الاستيراد لك تقدم عملية الاستيراد هذه تمامًا كما فعل مع المستخدمين.

لا توجد رسائل خطأ أثناء الاستيراد — فقط بعض التحذيرات بشأن عناوين بريد إلكتروني غير صالحة للمستخدمين عند تشغيل دالة create_users. ومع ذلك، فإن استيراد المستخدمين ناجح في النهاية. إليك سجل الأحداث (أزلت التحذيرات لأنها تحتوي على عناوين بريد إلكتروني للعملاء):

importing posts...
5 / 5 (100.0%)  [290527 items/min]                                                            
importing attachments...   
20182 / 5 (403640.0%)

هنا أعتقد أن النظام يرى فئاتي الخمس فقط كمنشورات ويقوم باستيرادها. ولا يعرف ماذا يفعل بجميع المرفقات للمواضيع الفعلية التي لم يتم استيرادها؟

إخلاء مسؤولية:

في البداية، فشل الاستيراد لأن قاعدة بيانات vBulletin التي تم تسليمها لي لم تكن تحتوي على جدول customprofilepic — لذا أضفت جدولًا فارغًا هناك.

ولم تكن هناك صور رمزية مخصصة — لذا فإن AVATAR_DIR، المشار إليها في نص الاستيراد، هي مجرد مجلد فارغ قمت بإنشائه. قمت بتعليق الأسطر التالية في نص الاستيراد التي كانت تشير إلى هذه الأصول:

create_users(users, total: user_count, offset: offset) do |user|
        username = @htmlentities.decode(user["username"]).strip
        {
          id: user["userid"],
          name: username,
          username: username,
          email: user["email"].presence || fake_email,
          admin: user['admin'] == 1,
          password: user["password"],
          website: user["homepage"].strip,
          title: @htmlentities.decode(user["usertitle"]).strip,
          primary_group_id: group_id_from_imported_group_id(user["usergroupid"]),
          created_at: parse_timestamp(user["joindate"])
          # post_create_action: proc do |u|
          #   @old_username_to_new_usernames[user["username"]] = u.username
          #   import_profile_picture(user, u)
          #   import_profile_background(user, u)
          # end
        }
      end

لكن حسب فهمي، فإن هذه التغييرات تؤثر فقط على إنشاء المستخدمين. ويتم إنشاء المستخدمين بنجاح.

هذا هو نص الاستيراد الكامل الذي أستخدمه:

يقوم السكربت بجمع جميع المواضيع من جدول node داخل قاعدة بيانات vBulletin. وهو موجود ويحتوي على حوالي 34 ألف منشور. أسماء الأعمدة مطابقة لما يشير إليه السكربت:

يبدو وكأنه يجب أن يعمل ببساطة :roll_eyes:

يبحث سكريبت الاستيراد عن contenttypeid=23 و contenttypeid=22 لإنشاء المنشورات.

من خلال التصفح السريع لجدول node، يمكنني القول إن 23 تمثل منشورًا مرفقًا به ملف، بينما 22 يجب أن تمثل الملف المرفق نفسه.

معظم المنشورات لها contenttypeid=21 — أي منشورات بدون مرفقات. ولا أرى عملية استيراد مخصصة لها. أم أن ذلك مُغطى بواسطة:

post_count = mysql_query("SELECT COUNT(nodeid) cnt FROM #{DBPREFIX}node WHERE parentid NOT IN (
SELECT nodeid FROM #{DBPREFIX}node WHERE contenttypeid=23 ) AND contenttypeid=22;").first["cnt"]

هذا السكربت يعالج كل ما تبقى بعد انتهاء الاستيراد من 23/22. لكن هناك معرفات أنواع محتوى أخرى غير 23/22/21 — وبالتالي سيتم تضمين تلك أيضًا.


كما يتم استيراد الفئات نسبةً إلى ROOT_NODE الذي تم تعيينه مسبقًا إلى 2. قد أحتاج إلى تغييره إلى 3 لدعم عناوين URL ذات “ثلاث مستويات متداخلة”؟

تحديث: أعيدت تشغيل عملية الاستيراد الآن مع ROOT_NODE=3، ولم يطرأ أي تغيير.

يبدو أن نسخة vBulletin لديك تختلف عما يتوقعه السكربت. قبل أن تتمكن من استيراد المنشورات، ستحتاج إلى معرفة سبب عدم إنشاء أي من المواضيع.

حسناً، المشكلة تكمن في contenttypeid:

def import_categories
    puts "", "importing top level categories..."

    categories = mysql_query("SELECT nodeid AS forumid, title, description, displayorder, parentid
	      FROM #{DBPREFIX}node
          WHERE parentid=#{ROOT_NODE}
        UNION
          SELECT nodeid, title, description, displayorder, parentid
          FROM #{DBPREFIX}node
          WHERE contenttypeid = 20
            AND parentid IN (SELECT nodeid FROM #{DBPREFIX}node WHERE parentid=#{ROOT_NODE})").to_a

على سبيل المثال، تستخدم دالة import_categories القيمة contenttypeid = 23، وهي نفس المعرّف الذي يستخدمه السكربت للمنشورات. أما المعرّف الخاص بالفئات فهو 20. بتغيير هذه القيمة داخل السكربت، تمكّنت أخيراً من رؤية الفئات الفرعية/المواضيع الخاصة بي :raised_hands:

الآن، كل ما يتبقى هو استيراد المواضيع/المنشورات.

لقد قدمت طلب دمج (Pull Request) يتضمن بعض التحديثات لمُستورد VBulletin5. ومن بين أهم التغييرات أنه تم التخلص من هذه المعرفات (IDs) الثابتة.

كما أن هناك دعمًا أفضل للملفات المرفقة، والآن يقوم المستورد باستيراد الوسوم وإنشاء روابط دائمة للمواضيع والفئات (والفئات الفرعية).