ملخص المشكلة
أقوم بتطوير إضافة لـ Discourse تضيف زر شريط أدوات لفتح نموذج نافذة منبثقة. لقد اتبعت وثائق واجهة برمجة تطبيقات DModal الرسمية خطوة بخطوة، لكنني ما زلت أواجه أخطاء في استيراد الوحدات وتحذير “تحتاج النافذة المنبثقة إلى تحديث”. أحتاج إلى توجيه حول ما أفتقده.
ملاحظة سريعة: لا أعرف البرمجة، تم إنشاء هذه الإضافة بالكامل بمساعدة الذكاء الاصطناعي.
الأخطاء الحالية
الخطأ 1 - استيراد الوحدة:
Uncaught (in promise) Error: Could not find module `discourse/components/modal/lottery-form-modal` imported from `discourse/plugins/discourse-lottery-v3/discourse/initializers/lottery-toolbar`
الخطأ 2 - تحذير النافذة المنبثقة القديمة:
Error: the 'lottery-form' modal needs updating to work with the latest version of Discourse. See https://meta.discourse.org/t/268057.
الخطأ 3 - إشعار الإهمال:
Deprecation notice: Defining modals using a controller is no longer supported. Use the component-based API instead. (modal: lottery-form) [deprecated since Discourse 3.1] [removal in Discourse 3.2]
الوثائق الرسمية التي اتبعتها
لقد درست بعناية ونفذت بناءً على هذه الموارد الرسمية:
-
تحويل النوافذ المنبثقة من وحدات التحكم القديمة إلى واجهة برمجة تطبيقات مكونات DModal الجديدة
- الرابط:
https://meta.discourse.org/t/268057 - تم اتباع جميع الخطوات الأربع: نقل الملفات إلى
/components/modal/، وتحديث JavaScript لوراثة المكون، وتحديث القالب لاستخدام<DModal>، وتحديث استدعاءات العرض لاستخدامmodal.show()
- الرابط:
-
استخدام واجهة برمجة تطبيقات DModal لعرض نوافذ Modal
- الرابط:
https://meta.discourse.org/t/268304 - تم تنفيذ DModal مع
@closeModalو@titleوكتل مسماة بشكل صحيح
- الرابط:
-
واجهة برمجة تطبيقات مطوري Discourse
- المصدر:
https://github.com/discourse/discourse/blob/main/app/assets/javascripts/discourse/app/lib/plugin-api.gjs - تم استخدام
api.onToolbarCreate()وحقن خدمة النافذة المنبثقة
- المصدر:
-
وثائق مطوري Discourse - تحويل النوافذ المنبثقة
- الرابط:
https://github.com/discourse/discourse-developer-docs/blob/main/docs/03-code-internals/10-converting-modals.md - تمت مقارنة خطوات الترحيل
- الرابط:
ما أحاول القيام به
- إضافة زر شريط أدوات في المنشئ
- النقر على الزر يفتح نموذج نافذة منبثقة
- يقوم المستخدم بملء النموذج والنقر على إرسال
- تغلق النافذة المنبثقة وتدرج المحتوى في المنشئ
ما جربته
النهج 1: الاستيراد الديناميكي + خدمة النافذة المنبثقة (الحالي)
- أواجه خطأ في استيراد الوحدة
النهج 2: showModal() مع وحدة التحكم
- أواجه تحذيرات إهمال بشأن وحدات التحكم القديمة
النهج 3: الاستيراد الثابت
- جربت أيضًا الاستيرادات الثابتة ولكن نفس مشاكل حل الوحدات
هيكل الملفات:
discourse-lottery-v3/
├── plugin.rb
└── assets/javascripts/discourse/
├── initializers/
│ └── lottery-toolbar.js
└── components/modal/
├── lottery-form-modal.js
└── lottery-form-modal.hbs
رمز زر شريط الأدوات:
// assets/javascripts/discourse/initializers/lottery-toolbar.js
import { withPluginApi } from "discourse/lib/plugin-api";
export default {
name: "lottery-toolbar",
initialize() {
withPluginApi("1.0.0", (api) => {
api.onToolbarCreate((toolbar) => {
toolbar.addButton({
id: "lottery-insert",
group: "extras",
icon: "dice",
title: "Insert Lottery",
perform: () => {
const modal = api.container.lookup("service:modal");
// This line causes the import error:
import("discourse/components/modal/lottery-form-modal").then((module) => {
const LotteryFormModal = module.default;
modal.show(LotteryFormModal, { model: {} });
});
}
});
});
});
}
};
مكون النافذة المنبثقة:
// assets/javascripts/discourse/components/modal/lottery-form-modal.js
import Component from "@ember/component";
import { tracked } from "@glimmer/tracking";
import { action } from "@ember/object";
export default class LotteryFormModal extends Component {
@tracked inputValue = "";
@action
submit() {
// Handle form submission
this.args.closeModal();
}
}
قالب النافذة المنبثقة:
{{! assets/javascripts/discourse/components/modal/lottery-form-modal.hbs }}
<DModal @title="My Modal" @closeModal={{this.args.closeModal}} class="my-modal">
<:body>
<input value={{this.inputValue}} />
</:body>
<:footer>
<button {{on "click" this.submit}}>Submit</button>
</:footer>
</DModal>
أسئلة
بناءً على جميع الأكواد والأخطاء والمعلومات الأساسية المقدمة أعلاه، كيف يجب أن أعدل الكود الخاص بي لتنفيذ الميزة الخاصة بي بشكل صحيح؟
سأكون ممتنًا جدًا لأي توجيه بشأن نهج التنفيذ الصحيح.