تعطّل القوالب الخاصة بـ "المكون" الخاص بي. كيف يمكنني إصلاحه؟

في مثيل Discourse الذي أديره، لدي مكوّن (موروث من القائم السابق على صيانة المثيل) لعرض شعارات الجهات الراعية لهذا المثيل في التذييل. كان المكوّن يعمل بشكل جيد حتى وقت قريب، ولكنه الآن يُعرض بشكل خاطئ، حيث يعرض توجيهات قالب التحكم حرفيًا (ويضع عناصر نائبة لقيم القالب حرفيًا في HTML، بحيث لا يتم حل المسارات المؤدية إلى الصور):

لا تتم صيانة المكوّن في مستودع git، بل يتم تكوينه مباشرةً ضمن “Admin” → “Appearance” → “Themes & components” → علامة التبويب “Components”:

Custom Code

Custom sections:

  • Common: CSS, Footer, JS

Uploads

Extra files

Export theme to view these files.
  • javascripts/discourse/api-initializers/theme-initializer.gjs

محتوى تلك “الأقسام”

كما يظهر عند النقر على “Edit Code”؛ المسار إلى الملفات المقابلة في التصدير معطى بين قوسين

CSS (common/common.scss)
.sponsors {
    .inner {
        display: flex;
        align-items: center;
        justify-content: space-around;
        margin-bottom: 10px;
    }

    .heading {
        font-size: 1.75em;
    }

    .sponsor-image {
        max-height: 55px;
    }

    .geoaargau {
        max-height: 45px;
    }
}
Footer (common/footer.html)
  {{#if displaySponsors}}
    <div class="sponsors-wrapper wrap">
      <div class="inner">
        <h3 class="heading">Sponsoren</h3>
        <a href="http://www.asseco-berit.ch/"><img src="{{theme-setting "theme_uploads.asseco_berit"}}" alt="Asseco Berit" class="sponsor-image asseco-berit"></a>
        <a href="http://www.geoaargau.ch/"><img src="{{theme-setting "theme_uploads.geoaargau"}}" alt="GEOAargau" class="sponsor-image geoaargau"></a>
      </div>
    </div>
  {{/if}}
JS (javascripts/discourse/api-initializers/theme-initializer.gjs)
import { apiInitializer } from "discourse/lib/api";

export default apiInitializer((api) => {
  // This is the plugin outlet, followed by a custom name for the component
  api.registerConnectorClass("above-footer", "sponsors", {

    setupComponent(args, component) {
        
     var topMenuRoutes = 
        component.siteSettings.top_menu.split('|')
        .map(function(route) {return '/' + route});
      
     var homeRoute = topMenuRoutes[0];
     
     api.onPageChange((url) => {

        if (url === "/" || url === homeRoute ){ 
          document.querySelector("html").classList.add("sponsors"); 
          component.set("displaySponsors", true); 
        } else {
          document.querySelector("html").classList.remove("sponsors"); 
          component.set("displaySponsors", false); 
        }
      });
    }
    
  });
});

يحتوي التصدير بالإضافة إلى ذلك على:
about.json (466 Bytes)
والذي أفترض أنه يتم إنشاؤه عند التصدير، لذا لا أعتقد أنه ذو صلة.

الجزء ذو الصلة من شجرة DOM الفعالة مع هذا الخلل هو:

<div class="custom-footer-content">
    {{#if displaySponsors}}
    <div class="sponsors-wrapper wrap">
      <div class="inner">
        <h3 class="heading">Sponsoren</h3>
        <a href="http://www.asseco-berit.ch/"><img src="{{theme-setting " theme_uploads.asseco_berit"}}"="" alt="Asseco Berit" class="sponsor-image asseco-berit"></a>
        <a href="http://www.geoaargau.ch/"><img src="{{theme-setting " theme_uploads.geoaargau"}}"="" alt="GEOAargau" class="sponsor-image geoaargau"></a>
      </div>
    </div>
  {{/if}}
</div>

لذا يمكننا أن نرى أن توجيه التحكم {{#if ...}}...{{/if}} والعناصر النائبة {{theme-setting "..."}} قد تم استخدامها كـ HTML حرفي بدلاً من تنفيذها / تقييمها / استيفائها.

كيف ولماذا تغير ذلك وكيف يجب أن أصلحه؟

هل قد يكون مرتبطًا بـ Upcoming Header Changes - Preparing Themes and Plugins (على الرغم من أنني لا أرى تغييرات في بناء جملة القالب مذكورة هناك.)

إعجاب واحد (1)

(بقولي “كيف ولماذا” أعني: ما هو التغيير الأساسي، وهل فاتني أي إشعارات بشأنه؟ أنا متأكد بما فيه الكفاية من أن أي شيء تسبب في هذا التغيير في السلوك قد وصل إلى تلك النسخة من خلال تحديثات Discourse التلقائية التي تم تفعيلها، ولكني أود أن أعرف السبب الجذري.)

هل يوجد أي خطأ أو تحذير في وحدة التحكم لتقديم مزيد من المعلومات؟

إعجاب واحد (1)

في وحدة التحكم بالمتصفح؟ ربما — لست متأكدًا مما هو “طبيعي” هناك وما الذي يمكن أن يشير إلى المشكلة. هل يمكنني فقط لصق محتوياته هنا أم أن ذلك قد يؤدي إلى تسريب معلومات حساسة؟

نعم، وحدة التحكم بالمتصفح - لا بأس من لصقها :slight_smile: غالبًا، إذا تم إهمال شيء ما، فستعرض وحدة التحكم بعض المعلومات المفيدة

إعجاب واحد (1)
محتوى وحدة تحكم المتصفح بالكامل عند تحميل https://www.geowebforum.ch/c/feedback/2
ℹ️ Discourse v2026.3.0-latest — https://github.com/discourse/discourse/commits/38ad2acd2c — Ember v6.6.0 chunk.f47b6dc1cc59c827db42.d41d8cd9.js:275:35231
[PLUGIN discourse-weekly-newsletter] لمنع الأخطاء في الاختبارات، أضف مفتاح `pluginId` إلى استدعاء `modifyClass` الخاص بك. سيضمن ذلك تطبيق التعديل مرة واحدة فقط. chunk.f47b6dc1cc59c827db42.d41d8cd9.js:209:136918
DEPRECATION NOTICE: إن تعريف فئات الموصل عبر registerConnectorClass أصبح قديمًا. راجع https://meta.discourse.org/t/32727 للحصول على أنماط أحدث. [deprecation id: discourse.register-connector-class-legacy] chunk.f47b6dc1cc59c827db42.d41d8cd9.js:134:74065
خطأ في تحليل القيمة لـ ‘-webkit-text-size-adjust’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:800
خطأ في تحليل القيمة لـ ‘-moz-text-size-adjust’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:827
خاصية غير معروفة ‘text-size-adjust’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:849
فئة زائفة أو عنصر زائف غير معروف ‘-moz-focus-inner’. تم تجاهل مجموعة القواعد بسبب محدد سيئ. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:1:1615
تم توقع ‘none’ أو عنوان URL أو دالة تصفية ولكن تم العثور على ‘alpha(’. خطأ في تحليل القيمة لـ ‘filter’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:622
تم تجاهل مجموعة القواعد بسبب محدد سيئ. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:36117
خطأ في تحليل القيمة لـ ‘justify-content’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:181379
خطأ في تحليل القيمة لـ ‘text-wrap’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:205516
خطأ في تحليل القيمة لـ ‘image-rendering’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:264428
خطأ في تحليل القيمة لـ ‘-webkit-text-size-adjust’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268491
خطأ في تحليل القيمة لـ ‘-moz-text-size-adjust’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268518
خاصية غير معروفة ‘text-size-adjust’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:268540
خطأ في تحليل القيمة لـ ‘font-size’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:298136
تم توقع ‘none’ أو عنوان URL أو دالة تصفية ولكن تم العثور على ‘alpha(’. خطأ في تحليل القيمة لـ ‘filter’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:447258
تم توقع ‘none’ أو عنوان URL أو دالة تصفية ولكن تم العثور على ‘alpha(’. خطأ في تحليل القيمة لـ ‘filter’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:4:447681
تم توقع ‘none’ أو عنوان URL أو دالة تصفية ولكن تم العثور على ‘alpha(’. خطأ في تحليل القيمة لـ ‘filter’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:33799
خطأ في تحليل القيمة لـ ‘text-wrap’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:105390
خطأ في تحليل القيمة لـ ‘text-wrap’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:105471
خطأ في تحليل القيمة لـ ‘padding’. تم إسقاط التصريح. common_6dfc7bba61f3a7b80a86f119f30594abc84aaa6d.css:6:257744

أعتقد أنه يتعين عليّ إلقاء نظرة على Using Plugin Outlet Connectors from a Theme or Plugin

لذا، أعتقد أن registerConnectorClass مع setupComponent قد تم إهمالهما، راجع سجل الأخطاء الخاص بك:

DEPRECATION NOTICE: Defining connector classes via registerConnectorClass is deprecated. See https://meta.discourse.org/t/32727 for more modern patterns. [deprecation id: discourse.register-connector-class-legacy] chunk.f47b6dc1cc59c827db42.d41d8cd9.js:134:74065

ولست متأكداً أيضاً مما إذا كنا ما زلنا نتسامح مع رمز HTML الخام، كما في مكون التذييل الخاص بك.

لذا سيتعين إعادة هيكلة هذا المكون ليتبع الأنماط الحديثة، وأنصح بنقله إلى مكون مناسب أيضاً، بدلاً من مكانه الحالي تحت الإدارة (Admin).

للإجابة على سؤالك الآخر

يرجع ذلك إلى العمل الجاري لتحديث Discourse والانتقال إلى المعايير الحديثة الجديدة باستخدام مكونات Glimmer.

3 إعجابات

إذا لم يكن ترميز HTML خامًا (-template)، فما هو المحتوى المتوقع لـ https://www.geowebforum.ch/admin/customize/themes/3/common/footer/edit؟ هل هو ترميز Markdown، كما هو الحال في المحتوى المقدم من المستخدم؟

هل يمكنك الإشارة إلى بعض الإرشادات حول كيفية القيام بذلك؟ أشعر ببعض الضياع لأن وثائق Discourse تبدو منتشرة في جميع أنحاء منتدى meta.

للقيام بذلك، هل يمكنني فقط فك ضغط “التصدير” (export) وإيداعه في مستودع Git؟

أليس المكون الخاص بي بالفعل مكون Glimmer إذا كان يحتوي على ملف *.gjs في التصدير؟ أم أن هذا هو في الواقع جزء من المشكلة - هل يخطئ Discourse الحالي في اعتبار مكوني مكون Glimmer (وبالتالي تصديره بهذا الاسم للملف) على الرغم من أنه ليس كذلك من الناحية البرمجية بعد؟

(أرجو المعذرة على جهلي. أنا لست مطور ويب وأعرف القليل جدًا عن Ember و Glimmer.)

إعجاب واحد (1)

كنت أعني: لم يعد ترميز HTML الخام يُحلل بشكل صحيح مع أحدث إصدار، ولهذا السبب ترى فقط ترميز HTML مُلقى بدلاً من عرضه.

نعم، ملف .gjs أشار بالفعل إلى مكون glimmer، لكن طريقة registerConnectorClass المستخدمة فيه لن تعمل (بعد الآن).

هذا مفهوم تمامًا. ما تقوله Using Plugin Outlet Connectors from a Theme or Plugin أساسًا هو أنه لعرض معلومات في مكان ما على الصفحة عبر طريقة registerConnectorClass تلك، بالطريقة التي فعلها ملفك footer.html، نستخدم الآن عنصرًا محددًا يسمى منفذ الإضافة (plugin outlet). بالنسبة لتذييل الصفحة، سيعمل منفذ above-footer بشكل جيد.

من المحتمل أن تكون فكرة جيدة قراءة Beginner's guide to using Discourse Themes و Developing Discourse Themes & Theme Components

يمكن أن يساعد أيضًا إلقاء نظرة على مكون سمة بسيط لفهم البنية. على سبيل المثال: GitHub - discourse/discourse-minimal-footer · GitHub

وأخيرًا، قد يتمكن روبوت Discourse من مساعدتك طوال الطريق: فهو يعرف أنماط Discourse جيدًا، لذا يمكنك تزويده بالرمز الحالي الخاص بك، وشرح المشكلة، وتطلب منه مساعدتك في إعادة هيكلته.

إعجابَين (2)