في المثالي، عند تخصيص Discourse عبر السمات/الإضافات، يجب عليك استخدام CSS، أو واجهة برمجة تطبيقات JavaScript Plugin، أو فتحات الإضافات (plugin outlets). إذا لم تنجح أي من هذه الخيارات لحالتك، فلا تتردد في فتح طلب سحب (PR) إلى نواة Discourse أو بدء موضوع في Development هنا على Meta. نحن سعداء دائمًا بمناقشة إضافة فتحات/واجهات برمجة تطبيقات جديدة لتسهيل التخصيص.
إذا استنفدت جميع الخيارات الأخرى، فقد تضطر للجوء إلى تجاوز القوالب (template overrides). تتيح لك هذه التقنية تجاوز قالب أي مكوّن Ember أو مسار (Route) بالكامل من سمة/إضافة.
هذا ليس الطريقة الموصى بها لتخصيص Discourse. التغييرات اليومية في نواة Discourse ستتعارض في النهاية مع تجاوزات القوالب الخاصة بك، مما قد يتسبب في أخطاء كارثية عند عرض المنتدى.
إذا قررت اتباع هذا النهج، فتأكد من وجود عمليات اختبار آلية كافية وعمليات ضمان جودة (QA) لكشف الانحسارات (regressions). إذا كنت توزّع سمة/إضافة تتضمن تجاوزات للقوالب، فيرجى التأكد من أن مشرفي المنتدى على علم بالمخاطر المتعلقة بالاستقرار التي تحملها سمتك/إضافتك.
![]()
![]()
تحديث أكتوبر 2023: للميزات الجديدة، تتجه Discourse بشكل متزايد نحو استخدام المكونات المكتوبة باستخدام صيغة ملف
.gjsالخاصة بـ Ember. يتم تعريف قوالب هذه المكونات بشكل مضمّن (inline)، ولا يمكن تجاوزها بواسطة السمات/الإضافات.من الآن فصاعدًا، يجب تنفيذ جميع تخصيصات القوالب باستخدام فتحات الإضافات (Plugin Outlets)
أفهم أن هذا سيتوقف عن العمل في المستقبل القريب، لكن أظهر لي الوثائق على أي حال
تجاوز قوالب المكونات (Component Templates)
لتجاوز قالب مكوّن Ember (أي شيء تحت components/* في نواة Discourse)، يجب عليك إنشاء ملف .hbs بنفس الاسم في سمة/إضافة. على سبيل المثال، لتجاوز قالب مكوّن badge-button في نواة Discourse، ستنشئ ملف قالب في سمة/إضافة في هذا الموقع:
{theme}/javascripts/discourse/templates/components/badge-button.hbs
{plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs
يجب أن يكون التجاوز دائمًا متداخلًا داخل دليل /templates، حتى لو كان للمكوّن الأساسي قالب “موضع بجانبه” (colocated).
تجاوز قوالب المسارات (Route Templates)
يعمل تجاوز قوالب المسارات (أي جميع قوالب غير المكونات تحت templates/*) بنفس طريقة المكونات. أنشئ قالبًا بنفس الاسم في سمة/إضافة. على سبيل المثال، لتجاوز discovery.hbs في النواة، ستنشئ ملفًا مثل
{theme}/javascripts/discourse/templates/discovery.hbs
{plugin}/assets/javascripts/discourse/templates/discovery.hbs
التفاعل بين السمات/الإضافات المتعددة
إذا تجاوزت سمات/إضافات متعددة مثبّتة نفس القالب، فإن “الرابح” هو الذي يحمل أدنى رقم ترتيب في هذه القائمة:
- تجاوزات السمة (ترتفع أولوية السمة ذات “المعرّف” الأعلى)
- تجاوزات الإضافة (ترتفع أولوية اسم الإضافة الأبجدي الأحدث)
- النواة (Core)
تعني هذه الأولوية أيضًا أنه يمكنك تجاوز قوالب الإضافات من السمات. تقنيًا، يمكنك أيضًا تجاوز قوالب السمات من سمات أخرى، وقوالب الإضافات من إضافات أخرى، لكن السلوك قد يكون مفاجئًا بسبب الاعتماد على اسم الإضافة ومعرّف السمة.
كيف يعمل هذا؟
تقوم Discourse بجمع القوالب وتحديد أولوياتها في فئة DiscourseTemplateMap. بالنسبة لقوالب المكونات الموضوعة بجانبها (colocated)، يتم استخدام تلك المعلومات أثناء تهيئة التطبيق لاستبدال ارتباطات القوالب الأساسية. لجميع القوالب الأخرى، تُستخدم الخريطة بواسطة المحلل (resolver) وقت التشغيل لجلب القالب الصحيح.
هذا المستند مُتحكم فيه إصداريًا - اقترح تغييرات على github.