如果组名包含特定名称,则隐藏某些组设置

我创建了一个自定义插件来为群组添加一些额外的字段。但它们只适用于名称中包含“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" 也会失败。

发生错误:

- 渲染时:
  - 顶层
    application
      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: