الاستبدال الموصى به لـ modifyClass("model:composer") عند تجاوز save()

أقوم بالانتقال بعيداً عن api.modifyClass("model:composer", ...) التي تم إيقاف استخدامها.

تعريفي الحالي لطريقة Composer#save يغير سلوك الحفظ بشكل شرطي، ولكنه يحتاج في الحالات الأخرى إلى استدعاء super.save(opts).

أرى واجهات برمجة التطبيقات الجديدة addModelMethod / addModelCallback، لكنني لا أجد مثالاً في الكود الأساسي لاستخدام addModelMethod لتجاوز طريقة موجودة مع الحفاظ على إمكانية الوصول إلى التنفيذ الأصلي.

هل يُقصد بـ addModelMethod تجاوز طرق النموذج الموجودة على هذا النحو؟ إذا كان الأمر كذلك، كيف ينبغي أن تفوض الإضافة (plugin) إلى التنفيذ الأصلي لطريقة save()؟

أم هل هناك نقطة توسيع أخرى ينبغي استخدامها لهذا الاستخدام الخاص بـ Composer؟

أعتقد أن الأمر يعتمد على ما تريد أن يفعله أسلوب الحفظ الذي تقوم بتعديله…

إذا كنت تحاول منع الحفظ بناءً على شرط معين، يمكنك استخدام محول القيم الخاص بنا composer-service-cannot-submit-post

إذا كنت تقوم بشيء ما بعد إنشاء المنشور، فهناك api.onAppEvent("post:created")

إذا كنت تضيف حقلًا، فهناك api.serializeOnCreate

هل يناسب أيٌّ من هذه ما تبحث عنه؟

شكرًا! أنا بالفعل أستخدم composer-service-cannot-submit-post — فهو يتولى التحقق على مستوى الخدمة. لكن دالة save() في نموذج المُحرر (composer) تتحقق أيضًا من cantSubmitPost، والتي تتضمن missingReplyCharacters > 0، لذلك لا يزال الجسم الفارغ محظورًا هناك.

يكون onAppEvent("post:created") متأخرًا جدًا لأن المنشور لا يتم إنشاؤه أبدًا، و serializeOnCreate يضيف حقولًا إلى الطلب فقط، لذا فهو لا يساعد في التحقق من طول الجسم.

إذن، المشكلة المتبقية هي تجاوز missingReplyCharacters / cantSubmitPost للمنشور الأول. هل توجد نقطة توسيع مدعومة لهذا الغرض؟

إليك مُهيئ الحالي للمرجعية:

@david ، أقدّر أي رأي قد يكون لديك بشأن أفضل نهج هنا.

أفضل ما يمكن فعله هو إضافة خطاف (hook) جديد إلى نواة Discourse يتيح لك تحقيق ما تحتاجه بطريقة مدعومة. ما رأيك بشيء كهذا:

وبذلك، سيقوم إضافتك (plugin) بالآتي:

api.registerValueTransformer(
  "composer-minimum-post-length",
  ({ value, context: { composer } }) => {
    if (
      composer.siteSettings.discourse_optional_topic_body_enabled &&
      composer.topicFirstPost
    ) {
      return 0;
    }

    return value; // Keep core logic
  }
);

أخبرني إذا كان هذا يناسب حالتك، وسأخرج طلب المساهمة (PR) من وضع المسودة وأتمكن من جعله يمر بمراجعة/دمج.

شكراً ديفيد! لقد اختبرت محوّل composer-minimum-post-length وهو يعمل — يتم إنشاء المواضيع ذات الأجسام الفارغة بنجاح.

شيء واحد لاحظته: المحرر لا يزال يعرض رسالة «لا يمكن أن يكون المنشور فارغاً» لأن خاصية validation في composer-editor تحتوي على فحص مُرمَّز صلباً هو replyLength < 1 لا يستخدم minimumPostLength.

هل يمكن أن يحترم هذا الفحص المحوّل أيضاً، أو أن يُتخطى عندما يكون minimumPostLength مساوياً لـ0؟

يبدو الأمر جيدًا - تمت إضافته إلى طلب الدمج (PR) :+1:

يعمل بشكل مثالي الآن. شكرًا جزيلاً لإضافتك لهذا، @david! :raising_hands: