能否通过插件或主题组件系统修改辅助函数中的函数?

有没有办法重新打开一个类并重写某个函数?

我需要重写的函数是位于 javascripts/discourse/helpers/category-link.js.es6 第 15 行的 function categoryStripe(color, classes) {}

我认为是的。你看过 Developing Discourse Themes & Theme Components

4 个赞

实现你的需求有多种方法。你覆盖 categoryStripe 的目的是什么?

3 个赞

我想将其从:

function categoryStripe(color, classes) {
  var style = color ? "style='background-color: #" + color + ";'" : "";
  return "<span class='" + classes + "' " + style + "></span>";
}

改为:

function categoryStripe(color, classes) {
  var style = color ? "style='border: 1px solid #" + color + ";'" : "";
  return "<span class='" + "my-class" + classes + "' " + style + "></span>";
}

即将背景色改为边框,并添加一个类。

Justin,实现这一点的最佳方法是什么?


我读过那篇文章,但据我所知,它只涵盖了覆盖模板(和小部件)的功能,似乎没有提到辅助函数,是这样吗?

1 个赞

你最初的帖子中并没有明确说明这些。我想你现在会得到一个有价值的回答,我也很期待看到!

1 个赞

您是否考虑过通过 JavaScript 添加该类,或在样式表中使用 !important 覆盖内联样式?虽然您可以尝试覆盖这种方法,但它最终会失效。通过 JS 将内容添加到 DOM 可能是最稳定的方案。

前几天我想弄明白的正是这一点。我想为所有主题中的帖子(但排除主题/原始帖子)添加一个自定义类。我希望能够根据用户组和帖子创建时间(topic created_at)来开启或关闭这个自定义类,但我认为在弄清楚如何为帖子添加自定义类之后,我就能解决这个问题。我没有找到完全符合我需求的示例,但在找到示例之前,其他一些事情可能分散了我的注意力。

我认为那样行不通,因为我需要从分类设置中获取颜色——因此每个分类的边框颜色会有所不同。(我已更新了我上面的 帖子 以反映这一点。)

除非可以通过 JavaScript 获取(或添加到 DOM)?(如果可以,能否请您提供一个示例?)

我需要深入研究具体细节,才能确定仅通过 JS 选择器实现您想要的功能是否可行(可惜我现在没时间)。

不过,您可以参考这里添加类的方法:discourse-knowledge-base-theme/javascripts/discourse/components/knowledge-base.js.es6 at 4694d4a8ad788f8884e3341c852d3f77b2c1d103 · discourse/discourse-knowledge-base-theme · GitHub

您也可以通过 JS 修改内联样式:Setting CSS Styles using JavaScript | KIRUPA

4 个赞

谢谢 Justin,我会看一下。

或者有没有办法像覆盖模板/组件/小部件等那样覆盖辅助函数(https://github.com/discourse/discourse/blob/b25d9e96c1414bf78b44221da4d385675843991e/app/assets/javascripts/discourse/helpers/category-link.js.es6)?

如果需要的话,我不介意随时关注该文件的未来变更 :smiley:

您可以尝试在您的主题中创建文件 javascripts/discourse/helpers/category-link.js.es6,并在其中添加该函数的修改版本。我很久没有深入处理这类问题了,所以无法保证这是否有效!:smiley:

5 个赞

没错,这样应该没问题。

3 个赞

谢谢两位!

最后一个问题(希望如此!)我该如何在那里创建文件呢?:relaxed:

在插件中,只需创建文件夹并复制粘贴即可,非常简单!

1 个赞

啊!!!谢谢罗伯特!

我现在得先出去一下,但一回来就试试。:ok_hand:

1 个赞

演示:

插件文件夹结构:

image

找出那个隐蔽的编辑 :male_detective:

image

5 个赞

谢谢罗伯特!

不过还是不行 :sob:

我做了以下操作:

rails g plugin CategoryAlternative

然后放入以下内容:

在一个我必须创建的 helpers 文件夹中:

接着:

rm -rf tmp
rails s

它在 AdminCP 中显示了,但实际页面上没有反映任何更改(如果我编辑非插件版本的文件并使用完全相同的修改,更改就会显示)。

我是不是漏掉了什么?我还需要配置其他内容吗?

1 个赞

你收到任何 JavaScript 控制台错误吗?

你包含的是_整个文件_吗?

注意:我没有使用插件生成器,而是手动创建了所有内容。

1 个赞

我在撰写时并没有包含(因为我以为 Justin 的意思只是包含那个函数),不过,虽然包含整个文件后它确实能工作了,但效果与我直接编辑文件时并不相同。

例如,它在 latest 页面上可以工作,但在 所有分类 下拉菜单中却无法工作……而当我直接编辑文件时,后者是可以正常工作的!

所以我最终通过一些杂乱的 CSS 来实现所需的更改 :joy:,并且不得不做出一些妥协——这肯定比完全无法实现要好,但理想情况下,我希望能像编辑模板那样简单地更改分类样式 :sweat:

2 个赞

我也想这样做。
这是我试图在主题组件中覆盖的文件路径:
custom_loader\javascripts\discourse\helpers\loading-spinner.js
但 JS 文件未被加载。我遗漏了什么?

1 个赞