إخفاء إعدادات مجموعة معينة إذا كان اسم المجموعة يتضمن اسمًا محددًا

لقد أنشأت إضافة مخصصة لتضمين بعض الحقول الإضافية للمجموعات. لكنها تنطبق فقط على المجموعات التي تحتوي على الاسم “chapter” فيها. لذلك لا معنى لوجودها في مجموعات لأغراض أخرى. هل هناك طريقة لإنشاء شرط يتحقق مثلاً if chapter in group.name; then chapter = true؟

لدي ما يلي:

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

  • إذا كان Jinja2 متاحًا بالكامل، فكيف يمكنني الوصول إلى متغير اسم المجموعة لإنشاء الشرط؟
  • إذا لم يكن Jinja2 متاحًا (بالكامل)، فكيف يمكنني إنشاء هذا الشرط إذن؟ ربما يجب على بعض JavaScript الأخرى تعيين قيمة منطقية أفترض. لكن هيكل متغيرات المجموعة هذه ومنطق JavaScript غير معروف لي، وأي أمثلة ستكون رائعة!

انتظر… الآن أرى فجأة بعض الطرق للاختبار. إذا كان Jinja2 يعمل هنا، فبالتأكيد في g.json يكون اسم المجموعة مرئيًا ويمكن استخدامه كشرط…

لا، هذا لا يعمل. وهو ليس Jinja2، بل هو أشياء خاصة بـ Handlebars (ولكن أفترض أن contains ليست دالة أصلية؟).

{{#contains "chapter" group.name}}
<div class='control-group'>
    <label class="control-label">{{i18n 'admin.groups.my_map.map_title'}}</label>
    {{input type="checkbox" checked=group.custom_fields.show_map}}
    <span>{{i18n 'admin.groups.my_map.map_switch'}}</span>
</div>
{{/contains}}

لكن هذا لا يعمل، وأحصل على مجموعة من الأخطاء. ربما لا أستخدم البحث الصحيح عن المتغيرات. على الرغم من أن استبدال group.name بـ "chapter_netherlands" ببساطة يفشل أيضًا.

حدث خطأ:

- أثناء التصيير:
  - المستوى الأعلى
    التطبيق
      discourse-root
        group
          group.manage
            group.manage.profile
              groups-form-profile-fields
                plugin-outlet
                  plugin-connector

خطأ غير معالج: تم محاولة حل `contains`، والذي كان من المتوقع أن يكون مكونًا، ولكن لم يتم العثور على شيء.

هل يمكن لأي شخص أن يوجهني في الاتجاه الصحيح، من فضلك؟ :nerd_face:

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

ولكن أين أقوم بإنشاء دوال handlebars هذه في المكون الإضافي الخاص بي؟ أرى العديد من الأمثلة هنا: Repository search results · GitHub

ولكنني لا أرى حقًا نمطًا في بنية المجلد هذه. لقد أنشأت دالتي الخاصة في discourse-group-custom-fields/assets/javascripts/discourse/app/helpers/contains.js، ولكن عندما أحاول استخدامها في discourse-group-custom-fields/assets/javascripts/discourse/connectors/group-edit/field-container.hbs، أحصل على الخطأ Uncaught Error: Attempted to resolve "contains", which was expected to be a component, but nothing was found.. لذا من الواضح أن هذا ليس مسارًا يبحث فيه Discourse، أو أنني أفعل شيئًا خاطئًا.

import RawHandlebars from "discourse-common/lib/raw-handlebars";
import { htmlSafe } from "@ember/template";
import { rawConnectorsFor } from "discourse/lib/plugin-connectors";

//RawHandlebars.registerHelper("contains", function (args) {
//  const connectors = rawConnectorsFor(args.hash.name);
//  if (connectors.length) {
//    const output = connectors.map((c) => c.template({ context: this }));
//    return htmlSafe(output.join(""));
//  }
//});


Handlebars.registerHelper('contains', function(needle, haystack, options) {
     needle = Handlebars.escapeExpression(needle);
     haystack = Handlebars.escapeExpression(haystack);
     return (haystack.indexOf(needle) > -1) ? options.fn(this) : options.inverse(this);
});

يقترح الموضوع أدناه أنه يمكن أن يكون في دليل initializers وأن يكون له امتداد es6.

لذا نقلت ملف contains.js الخاص بي إلى هذا الدليل وأضفت .e6 كملحق وحصلت على نفس الخطأ. بعض المساعدة أو المستندات ستكون رائعة :slight_smile: