【问题标题】:Extending the GUI from plugins in Grails 3从 Grails 3 中的插件扩展 GUI
【发布时间】:2019-10-04 00:16:37
【问题描述】:

我有一个要求,当安装不同的插件时,应将新项目添加到应用程序的菜单中。关键思想是使用插件扩展前端功能,在菜单上添加新项目将允许从已安装插件上定义的控制器访问操作。

我找不到任何有关此内容的文档或指南,并且不确定是否有关于该领域的任何建议。我还需要验证这是否可以通过插件来完成,以及是否有比插件更好的替代方案。

另外,我想不惜一切代价避免在 Grails 中创建自己的插件基础架构。

【问题讨论】:

    标签: grails grails-plugin grails3


    【解决方案1】:

    为新创建的 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
    

    在主页面上,您会看到“书籍”菜单和“音乐”菜单。

    该应用程序依赖于 2 个插件,每个插件都提供动态菜单信息。插件被拉入应用程序https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/build.gradle#L62-L63

    runtime project(':pluginone')
    runtime project(':plugintwo')
    

    pluginone 提供“音乐”菜单。 plugintwo 正在证明“书籍”菜单。如果您注释掉其中任何一个插件依赖项并重新运行应用程序,您将看到相应的菜单在应用程序中消失。这表明应用程序正在根据插件提供的 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])
        }
    }
    

    每个插件都提供 1 个 MenuHelper bean,这些 bean 被注入到那里,但插件可以提供任意数量的这些。每个插件都在其doWithSpring 方法中添加bean。

    https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/grails-app/views/index.gsp#L36 处的代码正在调用该标签库。

    <pablo:renderMenu/>
    

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

    希望对你有帮助。

    【讨论】:

    • 列出了已安装的插件,但是插件如何将项目添加到应用程序菜单中,我正在讨论一个应用程序,该应用程序具有从 gsp 上的菜单访问的一些功能以及是否安装了插件,它可以向该菜单添加许多额外的项目以访问新功能(这些新插件中定义的控制器和视图)。
    • 这个问题很模糊。一种可能性是提供该功能的插件可以提供描述该功能的 bean,并且您可以拥有一个 TagLib,您可以在其中插入这些 bean 的所有实例,并且该标签库会生成相关菜单。
    • 您知道在哪里可以找到您推荐的示例吗?我可以为问题添加更多细节,但这是基本要求:安装插件时,在 GUI 上获取更多项目(某些菜单上的按钮、链接等),允许访问这些插件添加的功能(控制器、服务,视图等),这无需在基础应用程序上进行硬编码(大多数插件以这种方式工作,以扩展用于构建应用程序的框架,我需要的是实际扩展应用程序,并尝试使用插件来做到这一点,如果可能)。
    • 我创建了一个示例项目,并在上述答案的更新中描述了关键点。显然,您可以在这里做很多事情,例如添加对相对菜单定位/排序、子菜单等的支持……但我认为该示例以一种向您展示了一些可供考虑的选项的方式展示了管道。
    • 哇,谢谢,让我检查一下!顺便说一句,感谢命名空间;)
    猜你喜欢
    • 2011-07-16
    • 1970-01-01
    • 2015-03-27
    • 2015-09-13
    • 2015-08-28
    • 2015-12-16
    • 1970-01-01
    • 2011-11-18
    • 1970-01-01
    相关资源
    最近更新 更多