تحرير المشاركات باستخدام مكون سمة

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

بعد الرجوع إلى بعض أجزاء كود إضافة Discourse AI والنظر إلى البيانات التي يتم تمريرها إلى منفذ الإضافة الذي أستخدمه، توصلت إلى الكود للحصول على النص المحدد، ولفه برموز fencss حوله، باستخدام منفذ quote-share-buttons-before.

ثم الآن، أنا عالق نوعًا ما. تقوم إضافة Checklist (بطريقة ما) بذلك باستخدام وسيطة في الدالة checklistSyntax تسمى postDecorator، والتي يمكنهم بعد ذلك الحصول على النموذج (أعتقد أنه نموذج post؟) باستخدام .getModel(). كيف يتم تمرير ذلك لا أعرف، ولكن لا أعتقد أنه متاح لي في إعدادي؟

إذا كان نموذج المشاركة هو المستخدم بالفعل في إضافة Checklist، يبدو أنني أواجه صعوبة في العثور على مكان وجود الدالة البسيطة ‘save’ المستخدمة في

await postModel.save({
  raw: newRaw,
  edit_reason: i18n("checklist.edit_reason"),
});

في models/post.js، إلا إذا كنت أفهم الأمر بشكل خاطئ.

أنا حاليًا أستخدم this.args.outletArgs.data.editPost(this.post) (والذي إذا كنت أتذكر بشكل صحيح موجود في models/topic.js، ولكن يرجى تصحيحي إذا كنت مخطئًا) والذي يفتح فقط المؤلف لتعديل المشاركة، وليس تعديلها مباشرة.

لذا سؤالي هو هذا - كيف يمكنني تعديل المشاركة مثل إضافة Checklist، بدون مشاكل؟ هل هناك طريقة للقيام بذلك إذا كنت أضع زرًا في منفذ بدلاً من api.decorateCookedElement كما تفعل Checklist؟ ويفضل أن يكون ذلك بدون استخدام واجهة برمجة تطبيقات REST؟

مستودعي:

شكرًا!

حسنًا، أعتقد أنني أصبحت قريبًا جدًا الآن.

لقد جربت this.post.save() ويبدو أنها “تعمل” - يبدو أن طلب PUT يتم تنفيذه (باستخدام ajax في الخلفية)، ولكنه واجه بعض الأخطاء بمعلومات قليلة أو معدومة. ولكن هذا كان قبل هذا…

this.post.save() يعمل. المشكلة الوحيدة هي المشكلة المدرجة أدناه:

وظيفتي الآن تبدو كالتالي:

@action
async addCodeFences() {
  let selectedText = this.selectedText;
  let newText = "```" + "\n" + selectedText + "\n" + "```";

  let post = this.post;
  console.log(this.post.cooked); // يعمل
  
  let rawPost = post.raw; // غير موجود!!
  console.log(rawPost); // غير معرف!

  rawPost.replace(selectedText, "\n" + newText + "\n"); // خطأ، لأن rawPost غير معرف!

  await this.post.save({
    raw: rawPost,
    edit_reason: I18n.t(themePrefix("add_code_fence_edit_reason"))
  });
}

لسبب ما، لا يمكنني الحصول على المحتويات الأولية للمنشور، فقط المحتوى المطبوخ. بخلاف إجراء طلب ajax، هل هناك طريقة للقيام بذلك؟ لا يبدو أنني أجد raw كأحد سمات المنشور… هل هناك سبب لعدم تضمينه؟

ملاحظة: أحاول ألا ألجأ إلى Ask Discourse. سأكون ممتنًا جدًا لأي مساعدة!


تعديل: أعتقد أن كل منشور يعتمد على طلب API هذا؟ ويبدو أن الاستجابة لا تحتوي على raw كأحد مفاتيح JSON :face_exhaling:.

نعم هذا صحيح - نحن لا نضمن raw في الاستجابة الافتراضية. إنها ليست ضرورية للعرض العادي، لذا فإن تضمينها سيكون هدراً من حيث نقل البيانات/السرعة.

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

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

حسنًا، شكرًا لك. سأعمل على طلب Ajax هذا.

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.