修改“新主题”按钮的默认行为

大家好,

我正在尝试修改 Discourse 2.6.1 中“新建主题”按钮的默认行为。我编写了一个自定义插件,通过修改默认的 Ember 操作来运行我的函数。在之前的 Discourse 版本(1.8.0)中,这能正常工作,但我无法在新版本中找到实现同样效果的方法。代码如下:

const NavigationDefaultController = require('discourse/controllers/navigation/default').default;
const SearchResultsDefaultController = require('discourse/controllers/full-page-search').default;
...

function myFunction() {
    CODE HERE
}
...
NavigationDefaultController.reopen({
  actions: {
    createTopic: myFunction,
  },
});

SearchResultsDefaultController.reopen({
  actions: {
    createTopic: myFunction,
  },
});

第一个控制器定义了主站点的操作(在新版本中不起作用),而第二个控制器定义了在执行应用内搜索时运行的操作(在新版本中也能正常工作)。

我注意到“新建主题”按钮是通过 createTopicclickCreateTopicButton 操作创建的,但它们在主站点上均不生效。我是否需要修改其他操作,或者需要使用不同的控制器?

谢谢。

1 个赞

有人能帮我吗?

1 个赞

我理解你的感受。

如何在主题中添加自定义字段 是我能想到的最佳方案。虽然它与你的问题关联不大,但文档非常详尽。

1 个赞

你好 @pfaffman

感谢你的建议。不过,如果我没记错的话,那个插件允许你在主题中添加自定义字段,而我想做的是在点击“新建主题”按钮时运行自己的 JavaScript 代码。我认为我的问题主要涉及应该使用 Discourse 的哪个控制器、要运行的函数名称以及如何覆盖该函数。能否请你指点一下?

谢谢

哎呀,真糟糕。抱歉。我原以为里面有一些 JavaScript 代码(例如在 discourse-topic-custom-fields/assets/javascripts/discourse 中),或许能有助于了解如何将这些功能连接起来。我对前端技术还不太熟练,所以恐怕这已经是我能给出的最好建议了。:man_shrugging:

感谢你的帮助 @pfaffman。我终于找到了需要修改的控制器和操作,该插件在 Discourse 2.6.x 中又正常运行了。

const NavigationDefaultController = require('discourse/components/d-navigation').default;
const SearchResultsDefaultController = require('discourse/controllers/full-page-search').default;
...

function myFunction() {
    在此处编写代码
}
...
NavigationDefaultController.reopen({
  actions: {
    clickCreateTopicButton: myFunction,
  },
});

SearchResultsDefaultController.reopen({
  actions: {
    createTopic: myFunction,
  },
});

注意:这是插件代码,位于 yourPlugin/assets/javascripts/discourse/initializers 目录下。

一旦我点击“新建主题”按钮,我的 JavaScript 代码就会执行,用户将看到我为论坛构建的菜单。

3 个赞

太好了!真高兴你收到了!不过,东西该放在哪里、该取什么名字,对我来说仍然有些神秘,尽管我已经在逐渐进步了。