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

عند تخصيص Discourse عبر السمات/الإضافات، يجب عليك استخدام CSS، وواجهة برمجة تطبيقات JavaScript، أو نقاط خروج الإضافات. إذا لم تنجح أي من هذه الطرق لحالة الاستخدام الخاصة بك، فلا تتردد في فتح طلب سحب إلى Discourse الأساسي أو بدء موضوع Dev هنا على Meta. يسعدنا دائمًا مناقشة إضافة نقاط خروج/واجهات برمجة تطبيقات جديدة لتسهيل التخصيص.

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

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

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

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

للمضي قدمًا، يجب إجراء جميع تخصيصات القوالب باستخدام نقاط خروج الإضافات

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

تجاوز قوالب المكونات

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

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

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

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

تجاوز قوالب المسارات

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

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

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

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

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

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

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

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

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

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

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

كيف يعمل هذا؟

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


هذه الوثيقة تخضع للتحكم في الإصدار - اقترح تغييرات على 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 إعجابات