إنشاء إضافة علاقة مستخدم - علامة

مرحباً، أنا أعمل حاليًا على إضافة معينة ولكن لم أتمكن من معرفة من أين أبدأ بعد (لقد قرأت المواد التمهيدية هنا وقمت بتثبيت بعض الإضافات البسيطة ولعبت بمصادرها قليلاً).

الإعداد: لدي ملف CSV يحتوي على عدة أسماء مستخدمين من النظام وبعض العلامات التي يرتبطون بها. على سبيل المثال، إدخال “user1, tag#1” يقرأ: “user1 يعرف عن tag#1”. يمكن ربط العديد من المستخدمين بعلامة واحدة ويمكن ربط مستخدم واحد بالعديد من العلامات. علاوة على ذلك، سيتم تحديث ملف CSV هذا من وقت لآخر (مرة واحدة تقريبًا كل يوم). الملف موجود على نفس الخادم الذي يستضيف مثيل discourse.

كيف ستعمل الإضافة بشكل مثالي: سأشرح هذا باستخدام مثال لملف CSV وصورة.

CSV:

userOP, tag#1
userOP, tag#2
user2, tag#1

بالنظر إلى ملف CSV هذا، كلما تم إنشاء موضوع بأي من العلامات المدرجة في ملف CSV (قد لا يكون مؤلف الموضوع ضمن القائمة). يجب أن يكون الناتج المثالي كما يلي:

علاوة على ذلك، يمكن للمستخدم رؤية علاماته المعروفة كروابط قابلة للنقر عليها في لوحة المستخدم الخاصة به مع علامة تبويب إضافية تسمى “العلامات المعروفة”:

من الناحية المثالية، يجب أن تكون علامة التبويب هذه قابلة للوصول بسرعة من القائمة العلوية اليسرى:

أي، بناءً على العلاقة المحددة في ملف CSV، يجب أن يكون هناك نص صغير أو شارة لأي مستخدم (OP أو غيره) ينشر في موضوع بعلامة يرتبط بها.

أنا منفتح على الاقتراحات حول كيفية تحقيق ذلك.

أحد الأشياء التي ستحتاج إلى القيام بها من جانب Rails هو إضافة علاقات المستخدم/العلامة هذه إلى المُسلسِل (serializer) بحيث تكون هذه البيانات متاحة للواجهة الأمامية. ابحث عن بعض المكونات الإضافية الأخرى التي تستدعي add_to_serializer أو ابحث عنها في مصدر Discourse، حيث إنها موثقة جيدًا هناك.

بعد ذلك، ستتمكن من استخدام منفذ مكون إضافي (plugin outlet) في Ember لإضافته إلى الصفحة. تحتوي وثائق مكونات الثيم (theme component) على أمثلة لذلك.

أعتقد أنني سأضيف مسارًا (route) لإدارة الحقول المخصصة للمستخدم بدلاً من استخدام ملف CSV، ولكن إذا كنت تريد اتباع طريقة CSV، فقد ترغب في إنشاء مهمة (job) تقرأه كل ساعة أو شيء من هذا القبيل، لذا ابحث عن مكون إضافي يحتوي على شيء ما في jobs/scheduled.

يوجد مستودع Discourse يسمى all_the_plugins والذي أقوم أحيانًا بالبحث فيه للعثور على أمثلة للأشياء. إذا قمت بالتصفح عبر github.com/discourse، فيجب أن تكون قادرًا على العثور عليه.

شكراً على المعلومات. النموذج الذهني الذي لدي الآن هو أنه يجب عليّ إضافة حقل مخصص إلى العلامات (مثل tag_description) يسمى attached_users. بالنسبة للمثال أعلاه، يجب أن تحتوي العلامة #1 على attached_users: [“userOP”, “user1”].

بعد ذلك، يجب عليّ إضافة هذا بطريقة ما إلى المُسلسِل (serializer) ومعرفة كيفية عرضه في المنشور.

أثناء التفكير في هذا، خطرت لي فكرة أخرى. إذا استخدمت discourse assign (Discourse Assign) لتعيين هؤلاء المستخدمين للمواضيع بناءً على العلامات. يمكنني بالفعل استرداد هذه المعلومات من الموضوع وأعتقد أن عرضها سيكون أسهل. ومع ذلك، لا يوفر discourse assign أي طريقة لإضافة المستخدمين برمجيًا.

يبدو استخدام التعيين فكرة جيدة. أنا متأكد من أنه يمكنك إضافة مستخدمين باستخدام واجهة برمجة التطبيقات. انظر كيفية هندسة واجهة برمجة تطبيقات Discourse العكسية

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

سيكون استخدام إضافة موجودة تتم صيانتها أسهل بكثير من تطوير وصيانة إضافتك الخاصة.

يمكنك القيام بذلك باستخدام إضافة بسيطة.

ما تحتاج إلى القيام به

ستحتاج الإضافة إلى القيام بما يلي:

  1. إضافة حقل مخصص للمستخدم يسمى known_tags، وهو قائمة من السلاسل النصية.

  2. إضافة واجهة في ملف تعريف المستخدم حيث يمكن للمستخدم تعديل known_tags. لا أعتقد أنه من الضروري إضافة علامة تبويب جديدة تمامًا للملف الشخصي لهذا الغرض، ولكن يمكنك فعل ذلك إذا أردت. إذا كنت لا تريد أن يقوم المستخدمون بتعديلها بأنفسهم، فاجعلها قابلة للتعديل فقط من قبل المسؤولين وادخل إلى ملفات تعريف المستخدمين وقم بتحديثها بناءً على ملف CSV الخاص بك.

  3. إضافة خطاف حدث يستخدم أحداث before_create_post أو post_created في PostCreator لإضافة المحتوى الذي تريده إلى المنشور بناءً على العلامات في الموضوع.

كيف تفعل ذلك

الجزءان 1 و 2 متشابهان جدًا مع الإضافات النموذجية لنماذج أخرى في الموضوع المرتبط أدناه. حاول اكتشاف الأمر بالقياس. إذا واجهت صعوبة حقًا، فاطلب مني توجيهًا هناك.

سيتم وضع الجزء 3 أيضًا في ملف plugin.rb الخاص بك. سيبدو شيئًا كهذا

on(:post_created) |post, opts, user|
  if post.is_first_post? && post.topic.tags.present?
     user_ids = UserCustomField.where(name: 'known_tags', value: post.topic.tags).pluck(:user_id)
     usernames = User.where(id: user_ids).pluck(:username)
     new_raw = post.raw + "شيء ما شيء ما #{usernames}"
     PostRevisor.new(post).revise!(
      user,
      {
        raw: new_raw,
        edit_reason: "سبب ما"
      },
      skip_validations: true,
      bypass_bump: true
    )
  end
end

حاول بنفسك. إذا واجهت صعوبة حقًا، فسأساعد. أنا دائمًا أميل أكثر إلى المساعدة إذا كان هناك دليل قوي على أنك تحاول اكتشاف الأمر بنفسك :slight_smile:

إعجابَين (2)

شكراً جزيلاً على تقديم خارطة طريق رائعة، أنا أعمل عليها! سؤال صغير:

هل يجب أن يكون هذا الجزء يدوياً باستخدام هذا النهج (بواسطة يدوياً، أعني إضافة إدخالات واحداً تلو الآخر عبر واجهة)؟ من الناحية المثالية، أود إضافة هذا باستخدام مفتاح واجهة برمجة التطبيقات الإدارية الخاص بي لأن ملف CSV كبير بعض الشيء وسينمو بمرور الوقت.

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

إعجاب واحد (1)