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