我有一个要求,在安装了不同的插件时,应将新项目添加到应用程序的菜单中。关键思想是使用插件扩展前端功能,在菜单上添加新项目将允许从安装的那些插件上定义的控制器访问操作。
我找不到任何有关此内容的文档或指南,也不确定这方面是否有任何建议。另外,我还需要验证是否可以通过插件完成此操作,以及是否有比插件更好的选择。
此外,我想不惜一切代价避免在Grails中创建自己的插件基础结构。
答案 0 :(得分:2)
实际上是为新创建的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])
}
}
每个插件都提供注入其中的MenuHelper
bean中的1个,但是一个插件可以提供任意数量的。每个插件都在其doWithSpring
方法中添加bean。
https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/grails-app/views/index.gsp#L36处的代码正在调用该标签lib。
<pablo:renderMenu/>
有很多不同的方法可以将所有这些组合在一起,而我将如何做则取决于理解实际需求。
我希望有帮助。