从 Grails 3 中的插件扩展 GUI
Extending the GUI from plugins in Grails 3
我有一个要求,当安装了不同的插件时,应将新项目添加到应用程序的菜单中。关键思想是使用插件扩展前端功能,在菜单上添加新项目将允许从安装的插件上定义的控制器访问操作。
我找不到任何关于此的文档或指南,也不确定它是否是关于该领域的任何建议。我还需要验证这是否可以通过插件来完成,以及是否有比插件更好的选择。
此外,我想不惜一切代价避免在 Grails 中创建我自己的插件基础结构。
为新创建的 Grails 应用程序默认生成的 grails-app/views/index.gsp
实际上就是这样做的。
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins <span class="caret"></span></a>
<ul class="dropdown-menu">
<g:each var="plugin" in="${applicationContext.getBean('pluginManager').allPlugins}">
<li class="dropdown-item"><a href="#">${plugin.name} - ${plugin.version}</a></li>
</g:each>
</ul>
</li>
希望对您有所帮助。
编辑:根据下面的评论添加信息
在 https://github.com/jeffbrown/pablopazosmenus 查看项目。
运行 应用...
./gradlew app:bootRun
在主主页上,您将看到一个 "Books" 菜单和一个 "Music" 菜单。
该应用依赖于 2 个插件,每个插件都提供动态菜单信息。正在 https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/build.gradle#L62-L63.
将插件拉入应用程序
runtime project(':pluginone')
runtime project(':plugintwo')
pluginone
正在提供 "Music" 菜单。 plugintwo
正在验证 "Books" 菜单。如果您注释掉其中任何一个插件依赖项和 re-run 应用程序,您将看到相应的菜单在应用程序中消失。这表明应用程序正在基于插件提供的 bean 动态构建菜单。 https://github.com/jeffbrown/pablopazosmenus/blob/master/app/grails-app/taglib/pablopazosmenus/MenuTagLib.groovy 的简单标签库就是其中的一部分。
package pablopazosmenus
import org.springframework.beans.factory.annotation.Autowired
class MenuTagLib {
static namespace = 'pablo'
@Autowired
List<MenuHelper> menuHelpers
def renderMenu = { attrs ->
out << render(template: '/dynamicMenu', model: [menuHelpers: menuHelpers])
}
}
每个插件都提供了其中注入的 MenuHelper
个 bean,但一个插件可以提供任意数量的这些 bean。每个插件都在其 doWithSpring
方法中添加 bean。
https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/grails-app/views/index.gsp#L36 处的代码正在调用该标记库。
<pablo:renderMenu/>
有很多不同的方法可以将所有这些放在一起,我将如何做将取决于对实际需求的理解。
希望对您有所帮助。
我有一个要求,当安装了不同的插件时,应将新项目添加到应用程序的菜单中。关键思想是使用插件扩展前端功能,在菜单上添加新项目将允许从安装的插件上定义的控制器访问操作。
我找不到任何关于此的文档或指南,也不确定它是否是关于该领域的任何建议。我还需要验证这是否可以通过插件来完成,以及是否有比插件更好的选择。
此外,我想不惜一切代价避免在 Grails 中创建我自己的插件基础结构。
为新创建的 Grails 应用程序默认生成的 grails-app/views/index.gsp
实际上就是这样做的。
<li class="dropdown">
<a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Installed Plugins <span class="caret"></span></a>
<ul class="dropdown-menu">
<g:each var="plugin" in="${applicationContext.getBean('pluginManager').allPlugins}">
<li class="dropdown-item"><a href="#">${plugin.name} - ${plugin.version}</a></li>
</g:each>
</ul>
</li>
希望对您有所帮助。
编辑:根据下面的评论添加信息
在 https://github.com/jeffbrown/pablopazosmenus 查看项目。
运行 应用...
./gradlew app:bootRun
在主主页上,您将看到一个 "Books" 菜单和一个 "Music" 菜单。
该应用依赖于 2 个插件,每个插件都提供动态菜单信息。正在 https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/build.gradle#L62-L63.
将插件拉入应用程序runtime project(':pluginone')
runtime project(':plugintwo')
pluginone
正在提供 "Music" 菜单。 plugintwo
正在验证 "Books" 菜单。如果您注释掉其中任何一个插件依赖项和 re-run 应用程序,您将看到相应的菜单在应用程序中消失。这表明应用程序正在基于插件提供的 bean 动态构建菜单。 https://github.com/jeffbrown/pablopazosmenus/blob/master/app/grails-app/taglib/pablopazosmenus/MenuTagLib.groovy 的简单标签库就是其中的一部分。
package pablopazosmenus
import org.springframework.beans.factory.annotation.Autowired
class MenuTagLib {
static namespace = 'pablo'
@Autowired
List<MenuHelper> menuHelpers
def renderMenu = { attrs ->
out << render(template: '/dynamicMenu', model: [menuHelpers: menuHelpers])
}
}
每个插件都提供了其中注入的 MenuHelper
个 bean,但一个插件可以提供任意数量的这些 bean。每个插件都在其 doWithSpring
方法中添加 bean。
https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/grails-app/views/index.gsp#L36 处的代码正在调用该标记库。
<pablo:renderMenu/>
有很多不同的方法可以将所有这些放在一起,我将如何做将取决于对实际需求的理解。
希望对您有所帮助。