Меню построения из NavigableMap - PullRequest
0 голосов
/ 30 января 2019

В приложении Grails 3.3 я пытаюсь создать конфигурацию меню, и я хотел бы использовать для этого application.groovy.

application.groovy:

mainmenuconfig {
    menuitem_1 {
        id = 'menuitem-1'
        name='Home'
        sub=null
    }
    menuitem_2 {
        id ='menuitem-2'
        name='Stammdaten'
        sub = submenuitem_2 {
            menuitem_2_1 {
                id = 'menuitem-2-1'
                name ='Stamm-A'
                sub=null
            }
    }}
}

Получение конфигурации через grailsApplication.config.get('mainmenuconfig') даст мне следующее:

[menuitem_1:[id:menuitem-1, name:Home, sub:null], menuitem_2:[id:menuitem-2, name:Stammdaten, submenuitem_2:[menuitem_2_1:[id:menuitem-2-1, name:Stamm-A]], sub:null]]

Если я посмотрюв getClass() он говорит, что это org.grails.config.NavigableMap

Теперь, для моего понимания, генерация дерева <UL> ... <LI> должна выполняться внутри слоя View.Для перебора этой структуры мне понадобится рекурсия, потому что она может быть n уровней глубиной.

Если я смотрю из main.gsp, я знаю место, куда я хочу вставить дерево меню, но как мне перенести туда данные и где я могу выполнить эту рекурсию?Нужен ли мне контроллер меню, который вызывается из GSP?ИМХО GSP не должен делать такие звонки.А с другой стороны, ни один контроллер не должен генерировать <UL> ... <LI> деревьев.Мне нужен кусок клея.

1 Ответ

0 голосов
/ 30 января 2019

Звучит как хорошее применение для перехватчика .Вы можете добавить его в свою модель после завершения каждого действия.Тогда ваш вид получит доступ к menu в своей модели и сможет построить меню.Хорошо делать рекурсию в вашем представлении, если это делается для отображения.

class NavigationMenuInterceptor {

    NavigationMenuInterceptor() {
        matchAll()
    }

    boolean after() {
        model.menu = grailsApplication.config.getProperty('mainmenuconfig', Map)
        true
    }
}

Для отображения вашего меню вы можете использовать шаблон, который рекурсивно отображает себя.В зависимости от желаемого вывода HTML, это может быть что-то вроде ниже.

В основном теле:

<ul>
    <g:each in="${menu}" var="menuitem">
        <g:render template="menuitem" model="[menuitem: menuitem]"/>
    </g:each>
</ul>

В вашем шаблоне _menuitem.gsp:

<li id="${menuitem.id}">
    ${menuitem.name}
</li>
<g:if test="${menuitem.sub}">
    <li>
        <ul>
            <g:render template="menuitem" model="[menuitem: menuitem.sub]"/>
        </ul>
    </li>
</g:if>
...