Расширение GUI из плагинов в Grails 3 - PullRequest
0 голосов
/ 16 мая 2019

У меня есть требование, чтобы новые пункты добавлялись в меню приложения при установке различных плагинов. Основная идея заключается в расширении функциональности внешнего интерфейса с помощью плагинов, добавление новых элементов в меню позволит получить доступ к действиям с контроллеров, определенных на этих установленных плагинах.

Я не смог найти какую-либо документацию или руководство, в котором говорится об этом, и не уверен, что это какая-либо рекомендация в этой области. Также мне нужно проверить, можно ли это сделать с помощью плагинов и есть ли лучшая альтернатива, чем плагины.

Кроме того, я хочу любой ценой избежать создания собственной инфраструктуры плагинов в Grails.

1 Ответ

2 голосов
/ 16 мая 2019

Сгенерированное по умолчанию grails-app/views/index.gsp для вновь созданного приложения Grails на самом деле делает это.

<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 проверяет меню "Книги". Если вы закомментируете одну из этих зависимостей плагина и перезапустите приложение, вы увидите, что соответствующее меню исчезнет в приложении. Это указывает на то, что приложение динамически создает меню на основе компонентов, предоставляемых плагинами. Простая библиотека тегов 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-компонентов, которые вводятся туда, но плагин может предоставить любое их количество. Каждый из плагинов добавляет компоненты в свои doWithSpring методы.

Код https://github.com/jeffbrown/pablopazosmenus/blob/345bcf17a12639df6b7c9e980c39f01102f1eb2c/app/grails-app/views/index.gsp#L36 вызывает этот тег lib.

<pablo:renderMenu/>

Есть много разных способов собрать все это вместе, и то, как я это сделаю, будет зависеть от понимания реальных требований.

Надеюсь, это поможет.

...