(غير موصى به) تجاوز قوالب Discourse من سمة أو إضافة

من الناحية المثالية، عند تخصيص Discourse عبر الثيمات/الإضافات (plugins)، يجب عليك استخدام CSS، أو واجهة برمجة تطبيقات إضافات جافاسكريبت (JavaScript Plugin API)، أو مخارج الإضافات (plugin outlets). إذا لم ينجح أي من هذه الخيارات في حالة الاستخدام الخاصة بك، فلا تتردد في فتح طلب سحب (PR) لـ Discourse core أو بدء موضوع Dev هنا في Meta. يسعدنا دائمًا مناقشة إضافة مخارج/واجهات برمجة تطبيقات جديدة لتسهيل التخصيص.

إذا استنفدت جميع الخيارات الأخرى، فقد تحتاج إلى اللجوء إلى تجاوزات القوالب (template overrides). تسمح لك هذه التقنية بتجاوز القالب الكامل لأي مكون Ember أو مسار (Route) من الثيم/الإضافة الخاصة بك.

:rotating_light: هذه ليست طريقة موصى بها لتخصيص Discourse. التغييرات اليومية في Discourse core سوف تتعارض مع تجاوز القالب الخاص بك في النهاية، مما قد يسبب أخطاء كارثية عند عرض المنتدى.

إذا قررت اتباع هذا النهج، فتأكد من أن لديك اختبارات آلية وعمليات ضمان جودة (QA) كافية لاكتشاف التراجعات. إذا قمت بتوزيع ثيم/إضافة مع تجاوزات للقوالب، فيرجى التأكد من أن مسؤولي المنتدى على دراية بمخاطر الاستقرار التي تحملها الثيم/الإضافة الخاصة بك.

:rotating_light: :rotating_light: :rotating_light: تحديث أكتوبر 2023: بالنسبة للميزات الجديدة، يتجه Discourse بشكل متزايد نحو استخدام المكونات التي تم إنشاؤها باستخدام تنسيق ملف .gjs الخاص بـ Ember. يتم تعريف قوالب هذه المكونات داخليًا، ولا يمكن تجاوزها بواسطة الثيمات/الإضافات.

للمضي قدمًا، يجب إجراء جميع تخصيصات القوالب باستخدام مخارج الإضافات (Plugin Outlets)

أتفهم أن هذا سيتعطل في المستقبل القريب، أرني المستندات على أي حال

تجاوز قوالب المكونات (Overriding Component Templates)

لتجاوز قالب مكون Ember (أي أي شيء تحت components/* في Discourse core)، يجب عليك إنشاء ملف .hbs يحمل الاسم نفسه في الثيم/الإضافة الخاصة بك. على سبيل المثال، لتجاوز قالب مكون badge-button في Discourse core، ستقوم بإنشاء ملف قالب في الثيم/الإضافة الخاصة بك في هذا الموقع:

:art: {theme}/javascripts/discourse/templates/components/badge-button.hbs

:electric_plug: {plugin}/assets/javascripts/discourse/templates/components/badge-button.hbs

يجب أن يكون التجاوز دائمًا متداخلاً داخل دليل /templates، حتى لو كان مكون core يحتوي على قالب “موضوع في مكانه” (colocated).

تجاوز قوالب المسارات (Overriding Route Templates)

تجاوز قوالب المسارات (أي جميع القوالب غير المكونات تحت templates/*) يعمل بنفس طريقة المكونات. أنشئ قالبًا يحمل الاسم نفسه في الثيم/الإضافة الخاصة بك. على سبيل المثال، لتجاوز discovery.hbs في core، يمكنك إنشاء ملف مثل

:art: {theme}/javascripts/discourse/templates/discovery.hbs

:electric_plug: {plugin}/assets/javascripts/discourse/templates/discovery.hbs

تجاوز القوالب “الخام” (.hbr)

سيتم قريبًا استبدال نظام القوالب “الخام” في Discourse بمكونات Ember العادية. ولكن في غضون ذلك، يعمل تجاوز القوالب الخام بنفس طريقة قوالب Ember. على سبيل المثال، لتجاوز topic-list-item.hbr في core، يمكنك إنشاء ملف مثل:

:art: {theme}/javascripts/discourse/templates/list/topic-list-item.hbr

:electric_plug: {plugin}/assets/javascripts/discourse/templates/list/topic-list-item.hbr

التفاعل بين الثيمات/الإضافات المتعددة

إذا قامت ثيمات/إضافات مثبتة متعددة بتجاوز نفس القالب، فإن “الفائز” هو صاحب أدنى تصنيف مرقم في هذه القائمة:

  1. تجاوزات الثيمات (الأولوية لأعلى “معرّف” ثيم)
  2. تجاوزات الإضافات (الأولوية لأحدث اسم إضافة أبجديًا)
  3. core

هذه الأسبقية تعني أيضًا أنه يمكنك تجاوز قوالب الإضافات من الثيمات. من الناحية الفنية، يمكنك أيضًا تجاوز قوالب الثيمات من ثيمات أخرى، وقوالب الإضافات من إضافات أخرى، ولكن قد يكون السلوك مفاجئًا بسبب الاعتماد على اسم الإضافة ومعرّف الثيم.

كيف يعمل هذا؟

يقوم Discourse بتجميع وتحديد أولوية القوالب في الفئة DiscourseTemplateMap. بالنسبة للقوالب المكونة الموجودة في مكانها، يتم استخدام تلك المعلومات أثناء تهيئة التطبيق لاستبدال ارتباطات قوالب core. بالنسبة لجميع القوالب الأخرى، يتم استخدام الخريطة بواسطة المحلل في وقت التشغيل لجلب القالب الصحيح.


يتم التحكم في إصدار هذا المستند - اقترح تغييرات على github.

17 إعجابًا

وماذا عن قوالب الجوال؟ ما هو هيكل الدليل لإعادة كتابة القوالب من النواة؟

يجب أن يعمل بنفس الطريقة تمامًا - أنت تطابق اسم القالب الأساسي. لذا إذا كان يحتوي على /mobile، فقم بتضمين ذلك في تجاوزك.

أحاول إعادة كتابة قالب تسجيل الدخول للجوال login.hbs ولا يعمل Imgur: The magic of the Internet هل أنا على المسار الصحيح؟

المسار الكامل غير مرئي في لقطة الشاشة الخاصة بك على حد علمي. هل يمكنك لصقه هنا كنص.

themeroot/javascripts/mobile/modal/login.hbs

أنت تفتقد discourse/templates من مسارك

لذلك في حالتك، سيكون {theme}/javascripts/discourse/templates/mobile/modal/login.hbs

إعجابَين (2)

هل هذا لا يزال هو الحال؟

أنا حزين بعض الشيء لإزالة القدرة على تجاوز الكثير من التعليمات البرمجية.

من المنطقي استبدال نظام الأدوات (Widgets) المخصص، إلى حد ما، ولكنه منحنا القدرة على الربط بالتعليمات البرمجية الموجودة على مستويات متعددة، مما قلل من الكثير من مخاطر التغيير المكسور حيث يمكننا استهداف كتل صغيرة فقط بطرق ذكية تسمح لنا بما يلي:

  • إضافة ميزات
  • عدم إزعاج أي شيء آخر.

لقد اضطررت للتو إلى إزالة ميزتين هامتين من Discourse Journal، على سبيل المثال، والتي كانت تستند إلى تجاوزات دقيقة للأدوات لأن الطريقة الوحيدة لإعادة إنشائها في Glimmer هي عبر زوج من تجاوزات القوالب (بما في ذلك محاولة تغيير ملف .gjs) وهو ما لم يعد مدعومًا على ما يبدو.

حتى لو كان هذا مدعومًا، فسنترك مع تجاوز أجزاء أكبر من التعليمات البرمجية مقارنة بإطار الأدوات، مع زيادة مرتبطة في مخاطر تعارض تغييرات النواة مع التجاوزات.

هذا ليس صحيًا لقابلية توسيع المنصة.

هل يمكن فعل أي شيء حيال ذلك؟

7 إعجابات

نعم، أسمعك - كانت هناك بعض الأشياء الجيدة في واجهات برمجة تطبيقات قابلية توسيع الأدوات.

لكن على الجانب الآخر، كان من الصعب للغاية علينا تعديل أي واجهة مستخدم قائمة على الأدوات في النواة، لأننا لا نعرف ما هي الطرق/الزخارف العشوائية التي قد يقدمها الأشخاص. لهذا السبب بدت تخصيصات الأدوات مستقرة نسبيًا - كنا خائفين جدًا من لمس تطبيقات النواة.

حلنا لهذا المضي قدمًا هو منافذ توصيل الأدوات المساعدة. تسمح هذه الأدوات للقوالب والإضافات بتجاوز أجزاء صغيرة جدًا من القوالب اختياريًا بتنفيذها الخاص.

على سبيل المثال، انظر كيف يقوم الدردشة بشكل شرطي بتجاوز شعار الصفحة الرئيسية باستخدام مكون مخصص. يعمل هذا مع رأس الأدوات الحالي، ورأس Glimmer الجديد (قريبًا! :tm:).

نحن سعداء بشكل عام بقبول طلبات السحب لإضافة منافذ توصيل أدوات مساعدة جديدة في أماكن مختلفة. إذا كنت غير متأكد من حالة استخدام معينة، فلا تتردد في فتح موضوع Dev مع التفاصيل!

10 إعجابات

حسنًا، هذا يبدو طريقًا للمضي قدمًا، شكرًا لك.

سأحتاج إلى استيعاب تداعيات ذلك والتكيف مع استراتيجية تتماشى مع ذلك.

أقدر الرد!

6 إعجابات