从 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/>

有很多不同的方法可以将所有这些放在一起,我将如何做将取决于对实际需求的理解。

希望对您有所帮助。