تغييرات العناوين القادمة - إعداد السيمات والإضافات

لقد عملنا مؤخرًا على تحديث رأس صفحة Discourse من نظام “الويدجات” (widgets) القديم إلى مكونات Glimmer الحديثة. هذا التغيير متاح الآن في نواة Discourse خلف إعداد الموقع glimmer header mode.

:timer_clock: الجدول الزمني التقريبي

(تقديرات تقريبية جدًا - قابلة للتغيير في أي اتجاه)

الربع الأول من 2024:

  • :white_check_mark: اكتمال التنفيذ الأساسي وتمكينه على موقع Meta

  • :white_check_mark: نشر نصائح الترقية؛ تفعيل رسائل الإيقاف عن الاستخدام في وحدة التحكم

  • :white_check_mark: بدء العمل لتحديث جميع الإضافات والمظاهر الرسمية والطرف الثالث

الربع الثاني من 2024:

  • :white_check_mark: البدء في تمكين تنفيذ الرأس الجديد افتراضيًا

  • :white_check_mark: جاهزية المظاهر والإضافات الرسمية والطرف الثالث للترقية

  • :white_check_mark: بدء رسائل الإيقاف عن الاستخدام في تشغيل شريط تحذير للمسؤولين لأي مشكلات متبقية

الربع الثالث من 2024:

  • :white_check_mark: نشر موضوع إعلان لزيادة الوضوح: Preparing your community for behind-the-scenes header changes

  • :white_check_mark: الأسبوع الذي يبدأ في 5 أغسطس 2024 (v3.4.0.beta1): تمكين الرأس الجديد لجميع المواقع افتراضيًا. سيظل بإمكان المسؤولين التبديل إلى الرأس القديم عن طريق تبديل إعداد الموقع glimmer header mode.

  • :white_check_mark: الأسبوع الذي يبدأ في 2 سبتمبر 2024: الإزالة النهائية لعلم الميزة والكود القديم

:eyes: ماذا يعني هذا بالنسبة لي؟

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

:person_tipping_hand: كيف يمكنني تجربة الرأس الجديد؟

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

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

في الحالة غير المرجحة التي لا يعمل فيها هذا النظام التلقائي كما هو متوقع، يمكنك تجاوز هذا “علم الميزة التلقائي” مؤقتًا عبر إعداد الموقع glimmer header mode. إذا قمت بذلك، يرجى إخبارنا بالسبب في هذا الموضوع.

:technologist: هل أحتاج إلى تحديث إضافتي/مظهري؟

لتحديد ما إذا كان تخصيصك يحتاج إلى تحديث، تحقق مما إذا كان يستخدم decorateWidget، أو changeWidgetSetting، أو reopenWidget، أو attachWidgetAction على أي من هذه الويدجات:

  • header
  • site-header
  • header-contents
  • header-buttons
  • user-status-bubble
  • sidebar-toggle
  • header-icons
  • header-topic-info
  • header-notifications
  • home-logo
  • user-dropdown

أو يستخدم أحد طرق واجهة برمجة التطبيقات (plugin API) التالية:

  • addToHeaderIcons
  • addHeaderPanel

ستؤدي جميع هذه الأمور الآن إلى طباعة رسائل الإيقاف عن الاستخدام في وحدة التحكم. معرّفات الإيقاف عن الاستخدام هي:

  • discourse.add-header-panel
  • discourse.header-widget-overrides

:warning: إذا كنت تستخدم أكثر من مظهر في نسختك، فتأكد من فحص جميعها.

إشعار المسؤول

اعتبارًا من 20 يونيو 2024، قمنا بتمكين إشعار المسؤول للإيقافات المذكورة أعلاه.

إذا تم نشر نسختك بعد هذا التاريخ، وأثّرت الإضافات أو المظاهر أو مكونات المظاهر الحالية في نسختك على أحد تحذيرات الإيقاف عن الاستخدام، فسيتم عرض الرسالة التالية فقط للمسؤولين*:

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

:twisted_rightwards_arrows: ما هي البدائل؟

كل مظهر/إضافة يختلف عن الآخر، ولكن إليك بعض التوجيهات لأكثر حالات الاستخدام شيوعًا:

addToHeaderIcons

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

تم إيقاف واجهة برمجة التطبيقات addToHeaderIcons لصالح واجهة headerIcons الجديدة. وهي موجودة للسماح بإضافة أو إزالة أو إعادة ترتيب الأيقونات في الرأس. تتطلب تمرير مكون (Component).

يمكن تمرير المكون على النحو التالي:

قبل بعد
api.addToHeaderIcons(“widget-foo”) api.headerIcons.add(“foo”, FooIcon)
api.decorateWidget(“header-icons:before”, () => return helper.h(“div”, “widget-foo”)) api.headerIcons.add(“foo”, FooIcon, { before: “search” })
api.decorateWidget(“header-icons:after”, () => return helper.h(“div”, “widget-foo”)) api.headerIcons.add(“foo”, FooComponent, { after: “search” })

يستخدم هذا المثال تنسيق قالب Ember (gjs) لتعريف مكون مضمن وتمريره إلى واجهة headerButtons.add:

// .../discourse/api-initializers/add-my-button.gjs

import DButton from "discourse/components/d-button";
import { apiInitializer } from "discourse/lib/api";

export default apiInitializer("1.0", (api) => {
  api.headerIcons.add("some-unique-name", <template>
    <li><DButton class="icon btn-flat" @href="/u" @icon="address-book" /></li>
  </template>);
});

أو لقائمة منسدلة، يمكنك استخدام <DMenu بدلاً من <DButton:

import DButton from "discourse/components/d-button";
import { apiInitializer } from "discourse/lib/api";
import DMenu from "float-kit/components/d-menu";

export default apiInitializer("1.0", (api) => {
  api.headerIcons.add("some-unique-name", <template>
    <li>
      <DMenu class="icon btn-flat" @icon="address-book">
        <DButton @translatedLabel="User 1" @href="/u/user1" />
        <DButton @translatedLabel="User 2" @href="/u/user2" />
        <DButton @translatedLabel="User 3" @href="/u/user3" />
      </DMenu>
    </li>
  </template>);
});

تسويات ترقية أمثلة:

decorateWidget("header-buttons:*")

:information_source: بالنسبة لروابط الرأس المخصصة، نوصي بإزالة الكود الخاص بك وتثبيت مكون مظهر Custom Header Links الرسمي. إذا لم يلبي ذلك متطلباتك، راجع أدناه للحصول على تفاصيل حول تغييرات الكود المطلوبة:

تم إيقاف ويدجة header-buttons وقمنا بإدخال واجهة برمجة تطبيقات headerButtons. وهي موجودة للسماح بإضافة أو إزالة أو إعادة ترتيب الأزرار في الرأس. تتطلب تمرير مكون (Component).

قبل بعد
api.decorateWidget(“header-buttons:before”) api.headerButtons(“button-name”, ButtonComponent, { before: “auth” })
api.decorateWidget(“header-buttons:after”) api.headerButtons(“button-name”, ButtonComponent, { after: “auth” })

changeWidgetSetting(...) لويدجات الرأس

:information_source: يمكن تحقيق الاستخدامات الأكثر شيوعًا لـ changeWidgetSetting باستخدام مكونات المظاهر التالية:

إذا لم تناسب هذه الحالات استخدامك، فاستمر في القراءة…

استخدمت بعض التخصيصات على ويدجات الرأس واجهة برمجة التطبيقات changeWidgetSetting.

على الرغم من عدم وجود بديل مباشر للتخصيصات مثل المذكورة أعلاه، نظرًا لكيفية عمل حقول مكونات Glimmer، فقد قمنا بإدخال واجهة برمجة تطبيقات جديدة في Discourse 3.3.0.beta3 للتعامل مع بعض هذه الحالات.

يمكن استخدام registerValueTransformer لتجاوز القيم التي تم وضع علامة عليها في الكود المصدري على أنها قابلة للتجاوز، وهي نهج مشابه لكيفية عمل منافذ الإضافات (plugin outlets).

لقد أضفنا بالفعل محولين (transformers) للحالات التي وجدناها شائعة في قاعدة الكود المصدري لدينا:

  • home-logo-href: يمكن استخدامه لتجاوز URL في رابط شعار الصفحة الرئيسية. راجع القسم home-logo أدناه للحصول على أمثلة.

  • header-notifications-avatar-size: يمكن استخدامه لتغيير حجم الصورة المسترجعة لصورة المستخدم في الرأس. مثال:

الكود أدناه:

api.changeWidgetSetting(
  "header-notifications",
  "avatarSize",
  settings.header_avatars_size
);

سيتم تحويله إلى:

api.registerValueTransformer(
  "header-notifications-avatar-size",
  () => settings.header_avatars_size
);

يجب إضافة هذه المحولات إلى الكود المصدري لـ Discourse. إذا كنت بحاجة إلى محول مختلف، يرجى إخبارنا بنشر حالتك الاستخدامية أدناه.

يمكن العثور على مزيد من التفاصيل حول واجهات برمجة تطبيقات محول القيم الجديدة هنا.

home-logo

لقد قمنا بإدخال منفذ إضافة (plugin outlet) لـ home-logo هنا كبديل لزينات الويدجات home-logo:before أو home-logo:after. يمكنك استخدام التسمية التلقائية __before و __after في ملف الاتصال (connector file) لتحديد مكان وضع المحتوى المخصص الخاص بك.

يمكن العثور على مزيد من التفاصيل حول تسمية ملف الاتصال قبل/بعد هنا.

قبل بعد
api.decorateWidget(“home-logo:before”) نقل المحتوى إلى /connectors/home-logo__before
api.decorateWidget(“header-buttons:after”) نقل المحتوى إلى /connectors/home-logo__after)

تغيير رابط URL لشعار الصفحة الرئيسية:

حاجة شائعة جدًا هي تغيير الرابط الذي يشير إليه home-logo. لقد قمنا بإدخال محول القيمة home-logo-href لمعالجة ذلك. أمثلة:

  • لتغيير الرابط إلى عنوان URL ثابت

    api.registerValueTransformer("home-logo-href", () => "https://example.com");
    
  • لإرجاع عنوان URL ديناميكي بناءً على المستخدم الحالي

    api.registerValueTransformer("home-logo-href", () => {
      const currentUser = api.getCurrentUser();
      return `https://example.com/${currentUser.username}`;
    });
    
  • لإرجاع عنوان URL بناءً على إعداد مكون المظهر

    api.registerValueTransformer("home-logo-href", () => {
      return settings.example_logo_url_setting;
    });
    

:sos: ماذا عن التخصيصات الأخرى؟

إذا لم يمكن تحقيق تخصيصك باستخدام CSS، أو منافذ الإضافات (PluginOutlets)، أو واجهات برمجة التطبيقات الجديدة التي قدمناها، فيرجى إخبارنا بإنشاء موضوع Development جديد لمناقشته.

:sparkles: كيف يمكنني تحديث مظهر/إضافة لدعم الرأسين القديم والجديد؟

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

ولكن كيف يمكنني تعريف FooIcon؟

في إضافة، حاولت إنشاء /assets/javascripts/discourse/components/server-link.js (مثل المكونات الأخرى التي أستخدمها في ملف hbs)

import Component from "@ember/component";
import discourseComputed from "discourse-common/utils/decorators";

export default Component.extend({
// هل يجب أن يذهب شيء ما إلى هنا؟
});

و assets/javascripts/discourse/templates/components/server-link.hbs مع
this is a link (أعتقد أنه يمكنني جعله رابطًا إذا نجحت في تشغيل “Hello, world” هذا)

المثال أعلاه يحتوي على const IconWithDropdown = ... ولكن أين يجب أن يذهب ذلك؟ حاولت وضعه في مُهيئ (حيث كان api.decorateWidget) ولكنه لا يبدو كـ JavaScript صالح بالنسبة لي أو لـ Ember، على أفضل تقدير.

قبل ذلك كان لدي مصفوفة headerlinks وكنت أقوم بـ

        headerLinks.push(
          h(
            `li.headerLink.no-servers`,
            h("a", anchorAttributes, I18n.t("pfaffmanager.no_servers_title"))
          )
        );

لإضافة الروابط التي أردتها. أعتقد أنه إذا تمكنت من جعل

      api.headerIcons.add("foo", ServerLink, { before: "search" });

يعمل، فيمكنني فقط وضعه في الحلقة التي بنت تلك المصفوفة.

OMG. هل تذهب مكونات Glimmer إلى assets/javascripts/discourse/component وتذهب مكونات Ember إلى assets/javascripts/discourse/components؟!؟!\n\nلدي الآن server-link.gjs\n\nimport Component from "@ember/component";\nexport default class ServerLink extends Component {\n // Required argument for the URL\n url = null;\n // Optional argument for the link text\n text = 'asdf';\n click() {\n console.log('ServerLink clicked!',this);\n\n }\n // Template for the component\n <template>\n {{log "my template" this}}\n LINK!\n <a href={{this.url}}>{{this.text}}</a>\n </template>\n}\n\n\nوفي تهيئتي هذه:\n\n api.headerIcons.add("foo", ServerLink, { param: "url, yo", before: "search" });\n\n\nالآن لدي شيء في الرأس.\n\nولكن كيف أرسل الأشياء إلى ServerLink؟ أحتاج إلى استدعائه عدة مرات بعناوين URL مختلفة ونصوص مختلفة للنقر عليها. لا يمكنني رؤية الأشياء الموجودة في {} في المكون.\n\nوأنت لا تريد حقًا وضع جافاسكريبت قبل \u003ctemplate\u003e، حيث لن يتم تحليل console.log("") الخاص بي!\n\nلقد حاولت أيضًا القيام بما يلي:\n\n const x = new ServerLink({\n url: "mylink",\n text: "my-text",\n name: 'Bob',\n message: 'Generated from JavaScript',\n });\n \nثم تمرير x بدلاً من ServerLink، ولكن لا يزال لا يوجد نجاح.

هل تقصد أنك تريد أزرارًا متعددة في الرؤوس بأيقونات/نصوص/عناوين URL مختلفة أو نفس الزر، ولكن اعتمادًا على السياق، يمكن أن يتغير النص/عنوان URL؟

نعم، أنت في فئة - ستقوم بتعريف المتغيرات أو الدوال أو القوالب هناك!

نعم. تتغير الروابط لمستخدمين مختلفين. ربط الكود القديم عبر مصفوفة من servers ودفعها إلى هذه المصفوفة:

            headerLinks.push(
              h(
                `li.headerLink${deviceClass}${newClass}`,
                h("a", anchorAttributes, linkText)
              )
            );

ثم فعلت هذا:

      // api.decorateWidget("header-buttons:before", (helper) => {
      //   return helper.h("ul.pfaffmanager-header-links", headerLinks);
      // });

لذلك كان لدي ما يصل إلى 3 روابط تمت إضافتها إلى الرأس، كل منها يربط بعنوان URL منفصل للخادم.

آها. الآن فهمت.

لا تقلق - لا يزال الاصطلاح هو /components/ :sweat_smile:

(من الناحية الفنية، يمكنك تعريف مكونات gjs وتمريرها كيفما تشاء، لذا يمكنك اختيار أي اسم دليل تريده. لكننا نلتزم بـ /components/.)

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

في هذه الأثناء، قد ترغب في إلقاء نظرة على تحديث discourse-icon-header-links للإلهام. الشيء الرائع في استخدام GJS هو أنه يمكنك تعريف المكونات في أي مكان، ولها وصول إلى المتغيرات في النطاق المحلي.

لذا، إذا قمت بإعادة تسمية المُهيئ الخاص بك إلى .gjs، يمكنك القيام بأشياء مثل

servers.forEach((server) => {
  api.headerIcons.add(`server-${server.id}`, <li><DButton @translatedLabel={{server.name}} @icon="server" /></li>);
});

أو يمكنك تعريف مكون في وقت سابق في نفس الملف، واستخدامه مثل

class ServerButton extends Component {
  get icon(){
    // some logic to decide the icon
  }
  <li><DButton @translatedLabel={{@server.name}} @icon={{this.icon}} /></li>
}

...

servers.forEach((server) => {
  api.headerIcons.add(`server-${server.id}`, <ServerButton @server={{server}} />);
});

أو يمكنك نقل التكرار داخل القالب (مفيد إذا كانت قائمة الخوادم عبارة عن TrackedArray قد تتغير في وقت التشغيل!)

api.headerIcons.add("server-buttons", {{#each servers as |server|}}
    <ServerButton @server={{server}} />
  {{/each}});

أوه. رائع. اعتقدت أنني جربتها في components ولم تنجح.

شكراً! أعتقد أنني أستطيع جعل أحد هذه الأشياء يعمل. الرابط إلى روابط الرأس هو مساعدة كبيرة. أنا متأكد تمامًا عندما كتبت الكود الخاص بي كان لدي ما يكفي من الحس للنظر في هذا المكون نفسه لمعرفة ذلك حينها.

رؤية بصيص أمل!

مرحباً @david و @Arkshine! لقد فعلتها!

ماذااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااااا–

          servers.filter(Boolean).map((server) => {
            const linkHref = `/pfaffmanager/servers/${server.id}`;
            const linkTitle = `click to configure server ${server.id}`;
            let host = String(server.hostname);
            const linkText = host.replace(
              /www.|community.|forums?.|talk.|discourse./,
              ""
            );
            const serverLink = <template>
              <li class="headerLink">
                <a class="btn-flat" href={{linkHref}} title={{linkTitle}}>
                  {{host}}
                </a>
              </li>
            </template>;
            const beforeIcon = ["chat", "search", "hamburger", "user-menu"];
            api.headerIcons.add(host, serverLink, { before: beforeIcon });
          });

وهو يفعل ما كان يفعله من قبل، وهذا ما أردته!

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

أفترض أنك ستحذف الحشو الإضافي الخاص بي هنا عندما تقوم بتحديث الأشياء المذكورة أعلاه (أو ربما لم أكن ثرثارة جدًا في موضوع توثيق. . .)

لقد قمت بتحديث OP ببعض الأمثلة الكاملة لـ gjs، وأدرجت رابطًا إلى وثائق Ember الأصلية. كيف يبدو لك هذا يا @pfaffman؟ هل هناك أي شيء آخر تعتقد أنه يستحق الإضافة؟

من الأفضل لأنه يحتوي على مثال عملي. ولكن هل أفهم بشكل صحيح أن هناك مكونات Ember ومكونات Glimmer؟ وإذا كان الأمر كذلك، فيجب أن تقول إن مكون Glimmer مطلوب، على ما أعتقد؟

وربما ترتبط بوثائق Glimmer حول كيفية عمل هذه المكونات؟

يبدو أنه يمكنك الحصول على مكونات مضمنة كما في مثالك، ونوع آخر حيث تقوم بتعيينه لشيء مثل متغير في نفس الملف أو وضعه في ملف آخر تضعه في دليل المكونات ثم تضمينه؟ أعتقد أن كل هذا قد يكون أكثر من اللازم لهذا الموضوع، ولكني أود موضوعًا مخصصًا حول ذلك.

إنها قابلة للتبديل تمامًا - يمكنك استخدام مكون Ember كلاسيكي، أو مكون Glimmer. ولكل منهما، يمكنك اختيار تأليفهما باستخدام التنسيق القديم .js/.hbs، أو التنسيق الجديد .gjs.

سأرى ما إذا كان بإمكاني إضافة بعض الروابط إلى وثائق Ember :+1:

:mega: اليوم قمنا بدمج هذا التغيير، والذي سيقوم تلقائيًا بتمكين تطبيق الرأس الجديد للمواقع ذات السمات/الإضافات المتوافقة.

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

في حالة عدم احتمال تسبب هذا التغيير التلقائي في حدوث مشكلات، يمكنك تجاوز “علم الميزة التلقائي” هذا مؤقتًا عبر إعداد الموقع glimmer header mode. إذا قمت بذلك، فيرجى إخبارنا بالسبب في هذا الموضوع.

لم أكن أتطلع إلى إجراء أي تغييرات ولكن إشعارات الإهمال تخبرني بخلاف ذلك،

إذًا هناك خيار وربما طريقة سهلة للحفاظ على الوضع الراهن؟

أو

ما الذي سأفتقده لاختيار محاولة الحفاظ على رأس قديم، لا أفهم ما يعنيه الجديد، أرى إعدادات المجموعة، التخصيص لمجموعات مختلفة أمر مثير للاهتمام، ولكن ما الذي يمكن تخصيصه؟

هذا ما وجدته اليوم،

أنا لست خبيرًا أو بارعًا في هذه التغييرات، فهي تستغرق وقتًا ولا أقوم بها كثيرًا لأرغب حقًا في تعلم التقنيات التي يبدو أن المستخدمين هنا يفهمونها/يعرفونها بسهولة.

أنا أكره إلى حد ما الاضطرار إلى القيام بها في المقام الأول، ولكن قبل أن أصرخ مثل رجل عجوز نفد منه البودينغ، أود أن أعرف، ما ولماذا وإلى أين يتجه هذا؟

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

أنا رجل عجوز وأشعر بألمك.

إنها مجرد تقدم، أخشى ذلك. ترقية الإمبر هذه كسرت الكثير من الأشياء ولم ينته الأمر بعد.

لقد “طلبت ذلك” عندما قمت بهذا التخصيص. أراهن أنك في السنوات الخمس الماضية حصلت على هاتف أو كمبيوتر محمول جديد.

لو كنت مكانك (وكنت مثلي، بدون وظيفة ديسكورس بدوام كامل)، لكنت سأنشر في Marketplace. لو كنت أنا، ربما لن أستجيب بأقل من 300 دولار، ولكن هناك فرصة معقولة أن يقوم شخص آخر بذلك مقابل 100 دولار أو 200 دولار. أقدر أن الأمر لن يتعطل مرة أخرى لمدة 5 سنوات أو أكثر.

أعتقد أنه يمكنك التخلص من محدد سمات الهامبرغر واستخدام الشريط الجانبي.

رد لطيف وصادق، أقدر ذلك ولكن ليس لدي الكثير لأعمل عليه، ربما هناك المزيد قادم (آمل)

لم أكن أعرف حتى أننا نتعامل مع جافا هنا :man_shrugging:

لا أريد لأحد أن يأخذ حلوىك أيضًا :face_with_hand_over_mouth:

بالتأكيد، ولكن ما هو الهدف المنشود، هذا البرنامج يتعامل مع الكثير من الأشياء التي أتساءل من يرى ما النهاية؟

هل هذا مطلوب ببساطة من ترقية ember؟

لا أعرف لماذا تم إجراء ember أيضًا ولكن إذا كان يعمل فلماذا إصلاحه، أنا متأكد من أن هناك شرحًا طويلاً وعميقًا يؤدي إلى مستقبل الأشياء ولكن أليس هناك رؤية حقيقية لمشاركتها؟

أزور منتديات أخرى تستخدم برامج قديمة جدًا، شخصيًا أرى أن discourse أفضل بكثير من أي منها، لكنها لا تبدو أنها تعاني في المقارنة، لديها نفس مشاكل النمو، معظمها شخصية مقابل البرنامج في رأيي، الكثير من القدامى الذين فقدوا حلوىهم، أتساءل، هل هناك مستقبل إنترنت الأشياء سيجعل كل تلك المنتديات قديمة بحيث لن تعمل على الإطلاق و discourse على علم ويستعد؟

هناك المزيد من هذا الصدق الذي تقدمه :grin: صحيح بما فيه الكفاية، وكنت أكثر حماسًا للتعلم، وأكثر طموحًا، وشعرت بأن الأمر يستحق أكثر، تعرضت للضرب والسحق وتركت للموت منذ ذلك الحين

حسنًا، أنت في الرهان، سأقبل هذا الرهان وبما أنك خسرت بالفعل، فأنت تساعدني في هذا، سنكون أصدقاء.

إذًا ربما كنت قد استقلت منذ وقت طويل، كان الضرب والسحق والترك للموت وصفًا مجازيًا، أنا فقط من بقي في عجلة القيادة، أعتقد أن أي شخص آخر في بعض اللوحات يحاول إصلاح المحرك فائق السرعة، لا أعرف لأنني لا أتواصل كثيرًا مع الآخرين، ليس لدينا تمويل، تم تجريدنا (FULL30) من وسائل التواصل الاجتماعي و discourse أيضًا، أتساءل كم عدد العملاء الآخرين الذين قطعتهم discourse طواعية أو كم عدد الآخرين الذين اعتبروا معتقداتهم مسيئة لدرجة أن discourse وضع أموالًا ضدها علنًا؟

ومع ذلك، بينما أتحدث الحقيقة، لا أخذ الإساءة، عش ودع الناس يعيشون، أعرف أن هناك مستقبلًا قادمًا، ما لا أعرفه هو لماذا ما زلت هنا وما زلت أحاول، لكنني أفعل، لذا، سأستمر في المحاولة، مثل AA، فقط لهذا اليوم :hugs:

لكنه كان كل الغضب عندما استخدمته :expressionless:

الشريط الجانبي (هنا) يمكن إغلاقه بقائمة هامبرغر، لا يوجد فرق كبير في الوظيفة، يفتح ويغلق نافذة تنقل، ولكن هل لا يمكن حفظ نافذتي بسهولة؟

نعم، أود بشدة وأفضل أن أدفع لشخص ما لتنظيف الكود المخصص الخاص بي وجعل الأشياء تعمل بشكل جيد، وسأدفع بسعادة، أستمتع بتوظيف الآخرين، مشاركة الثروة، عندما أكبر أريد أن أكون فاعل خير، ولكن اليوم أحتاج إلى فاعل خير :innocent: ومرة أخرى أقدر أي مساعدة يمكن للآخرين تقديمها.

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

للأسف لا. القدرة على الالتزام بـ “الرأس القديم” هي مجرد شيء مؤقت خلال الفترة الانتقالية. قريبًا، سيكون الرأس الجديد هو الخيار الوحيد.

نعم! يسعدنا دائمًا المساعدة في الأسئلة في Dev. بالإضافة إلى ذلك، فإن مشاركة الكود والحلول علنًا تنشئ موردًا مفيدًا للآخرين.

الحمد لله، مجتمعي أكثر انسجامًا مع القضايا الأخرى

بالتأكيد يمكنني المشاركة هنا ولكن بعد ذلك يصبح الأمر عكسيًا، أي مبرمج يهتم بمساعدتنا؟

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

حسنًا، هذا يعني ماذا بالضبط بالنسبة لي، إنشاء مجموعة مستخدم واحدة، عامة وغير مسجلة الدخول ربما؟

إعدادات المجموعة هذه، أتصور أنها تستند إلى مستويات الثقة مقابل مجموعات مختلفة فعليًا، مثل مجموعة صيد ومجموعة صيد أسماك؟

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


لا أرغب في تعطيل موضوع أي شخص، إذا تم اعتبار أن هذا يجب أن يكون موضوعًا خاصًا به، فأنا على ما يرام

ولكن كيف ستكون هناك علاقة متماسكة حقيقية عندما يشعر الناس بالحاجة إلى إزالة شيء يزعجهم؟

يتطلب الأمر الصبر لفهم الآخرين، تم إزالة الرابط، وأظهر شعارًا مفقودًا بعد ذلك ولكن ليس أثناء النشر، هل هناك مشكلة أخرى في الرأس لمناقشتها؟

كانت مشاركة في منتدى خاص بي كتبها رجل أعتقد أنه في الثمانينيات من عمره، يمكنني التأكد من سؤاله ولكنه يرفض التحدث معي، هل أوبخه أو أحظره أو أنبذه؟

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

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

هل نناقش فقط الحاجة إلى العمل على هذه المجالات الثلاثة؟

لدي استخدام مختلط للمكونات، بدأت بدونها ثم تعلمت أنها يمكن أن تكون مفيدة، لم أستخدم المكونات بالكامل ولدي مجموعة مختلطة.

إليك مظهري الخاص بما يستحق بدون المكونات
discourse-full30-ii.zip (10.1 KB)
يمكنني نشرها أيضًا، بعضها، النوافذ المنبثقة، لا تعمل بالفعل مؤخرًا