我正在尝试开发一个插件,将头部区域修改为类似这样的样式:
外观具体如何并不重要,重要的是我不想通过
/admin/customize/css_html 路径进行自定义。我希望开发一个插件,能够神奇地修改所有我需要的内容。
目前我发现的是,头部没有对应的模板,它是通过虚拟 DOM(virtual-dom)渲染的。
其渲染流程如下:
-
assets/javascripts/discourse/templates/application.hbs模板(可以被重载)渲染site-header组件。{{plugin-outlet “above-site-header”}}
{{site-header canSignUp=canSignUp
showCreateAccount=“showCreateAccount”
showLogin=“showLogin”
showKeyboard=“showKeyboardShortcutsHelp”
toggleMobileView=“toggleMobileView”
toggleAnonymous=“toggleAnonymous”
logout=“logout”}}
{{plugin-outlet “below-site-header”}} -
assets/javascripts/discourse/components/site-header.js.es6组件继承并返回header部件(widget)。const SiteHeaderComponent = MountWidget.extend(Docking, {
widget: ‘header’,
..
});export default SiteHeaderComponent;
-
assets/javascripts/discourse/widgets/header.js.es6部件为头部生成虚拟 DOM。export default createWidget(‘header’, {
tagName: ‘header.d-header.clearfix’,html(attrs, state) {}
});
我的想法
我可以创建一个名为 my-header 的新部件,继承现有的 header,在其中仅更新 html 方法。我不想复制粘贴任何内容,只想重写 html() 方法。
/plugins/discourse-foo/assets/javascripts/discourse/widgets/my-header.js.es6
然后,我可以创建一个名为 my-site-header 的新组件,继承现有的 site-header,仅将其重写以指向 my-header 部件。
/plugins/discourse-foo/assets/javascripts/discourse/components/my-site-header.js.es6
最后,我重载 application 模板,使其显示 my-site-header 组件而不是 site-header。
/plugins/discourse-foo/assets/javascripts/discourse/templates/application.hbs
{{plugin-outlet "above-site-header"}}
{{my-site-header canSignUp=canSignUp
showCreateAccount="showCreateAccount"
showLogin="showLogin"
showKeyboard="showKeyboardShortcutsHelp"
toggleMobileView="toggleMobileView"
toggleAnonymous="toggleAnonymous"
logout="logout"}}
{{plugin-outlet "below-site-header"}}
问题是,我该如何扩展所有这些组件和部件?能否请您指点一下正确的做法?谢谢。
