我创建了一个自定义插件来为群组添加一些额外的字段。但它们只适用于名称中包含“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`,它应该是一个组件,但未找到任何内容。
我明白了,我需要自己创建这些函数,不像 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 扩展名。
Inspired from this discussion https://meta.discourse.org/t/adding-share-buttons-to-every-post-image/27590 I decided to look into what would be involved with creating such a plugin. Expanding on what I’ve learned previously, That is, plugin.rb...
Reading time: 1 mins 🕑
Likes: 1 ❤
所以我把我的 contains.js 移到了那个目录,并添加了 .e6 作为扩展名,但我收到了同样的错误。一些帮助或文档将非常有帮助