Плагин Grails & Navigation: Рендеринг подэлементов с разных контроллеров? - PullRequest
5 голосов
/ 25 апреля 2009

Я использую Grails 1.1 и плагин навигации 1.0.4 и только столкнулся с проблемой. Я хочу, чтобы действия от 3 разных контроллеров вносились в качестве подэлементов в меню от другого контроллера.

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

Я попытался использовать полностью отделенный контроллер просто для удаления там навигационной системы, используя перенаправления для подпунктов (см. Ниже). Но в этом случае подэлементы просто не отображаются.

class ResourceNavController {

// Navigation
static navigation = [ group:'modules', order:100, title:'Test', action:'listResources',
    subitems: [
        [group:'modules', order:10, title:'Resources', action:'listResources'],
        [group:'modules', order:20, title:'Environments', action:'listEnvironments'],
        [group:'modules', order:30, title:'Settings', action:'listSettings']
    ]
]

def listResources = {
    redirect(controller:"resource",action:"list")
}

def listEnvironments = {
    redirect(controller:"environment",action:"list")
}

def listSettings = {
    redirect(controller:"setting",action:"list")
}

}

Любая подсказка?

Спасибо, Ролло

Ответы [ 5 ]

2 голосов
/ 05 января 2010

Вы пытались зарегистрировать навигационную информацию с явными атрибутами контроллера внутри Config.groovy, как объяснено в документации? (см. раздел «Как вариант, добавление элементов в Config.groovy» 1

Это может сработать, но я не думаю, что оно будет правильно выделять «активные» элементы. На самом деле это не всегда будет работать хорошо, то, что вы делаете, несовместимо с установкой на основе «соглашения».

Плагин навигации 2.0 (пока нет ETA) будет иметь другой механизм, не основанный на контроллере, для обнаружения активных в данный момент пунктов меню, которые могут лучше работать в этом сценарии.

Вы всегда можете написать мне (автору плагина) напрямую об этом.

1 голос
/ 23 сентября 2010

хорошо, есть другой обходной путь ...

изменить с

def eachSubItem = { attrs, body ->
...
   searchKey = GrailsClassUtils.getLogicalName(controllerName, 'Controller')
...
}

до

def eachSubItem = { attrs, body ->
...
   searchKey = flash.prevcon ?: GrailsClassUtils.getLogicalName(controllerName, 'Controller')
...
}

и добавить ко всем вызовам перенаправления / пересылки "flash.prevcon = controllerName"

class ResourceNavController {

// Navigation
static navigation = [ group:'modules', order:100, title:'Test', action:'listResources',
        subitems: [
                [group:'modules', order:10, title:'Resources', action:'listResources'],
                [group:'modules', order:20, title:'Environments', action:'listEnvironments'],
                [group:'modules', order:30, title:'Settings', action:'listSettings']
        ]
]

def listResources = {
        flash.prevcon = controllerName
        redirect(controller:"resource",action:"list")
}

def listEnvironments = {
        flash.prevcon = controllerName
        redirect(controller:"environment",action:"list")
}

def listSettings = {
        flash.prevcon = controllerName
        redirect(controller:"setting",action:"list")
}

}
0 голосов
/ 27 октября 2010

Самый простой способ решить эту проблему - отредактировать NavigationService.groovy и изменить строку 62:

это

result.controller = p.controller

в

result.controller = subitem.controller ? subitem.controller : p.controller

Чем вы можете установить параметр контроллера в параметрах навигации, например:

static navigation = [
    group: 'tabs',
    order: 1,
    title: 'Title',
    subItems: [
            [action: 'list', title: 'Title 1'],
            [action: 'anotherList', title: 'Another title'],
            [controller: 'someOtherController', action: 'list', title: 'Last title'],
    ],
]
0 голосов
/ 22 сентября 2010

решил это за мою проблему !!!!

Я не знаю, является ли это лучшим решением, но для меня это работает как шарм ... если я найду лучшее решение, я дам вам знать ...

изменить на NavigationTagLib.groovy с

def eachSubItem = { attrs, body ->
...
   searchKey = GrailsClassUtils.getLogicalName(controllerName, 'Controller')
...
}

до

def eachSubItem = { attrs, body ->
...
   searchKey = GrailsClassUtils.getLogicalName(controllerName, 'Controller').split(/[A-Z]/)[0]
...
}

Соглашение (для этого изменения в примере):

class ResourcenavController {

// Navigation
static navigation = [ group:'modules', order:100, title:'Test', action:'listResources',
        subitems: [
                [group:'modules', order:10, title:'Resources', action:'listResources'],
                [group:'modules', order:20, title:'Environments', action:'listEnvironments'],
                [group:'modules', order:30, title:'Settings', action:'listSettings']
        ]
]

def listResources = {
        redirect(controller:"resourcenavResource",action:"list")
}

def listEnvironments = {
        redirect(controller:"resourcenavEnvironment",action:"list")
}

def listSettings = {
        redirect(controller:"resourcenavSetting",action:"list")
}

}

Grails-версия: 1.3.4 навигационная версия: 1.1.1


Привет

сначала спасибо за вашу большую работу.

Есть ли решение проблемы?

Я только что обновился с Grails 1.2.1 до 1.3.4 и столкнулся с этой проблемой, с 1.2.1 такой проблемы не было (хотя до сих пор не отлажен до сих пор).

THX

0 голосов
/ 08 мая 2009

Как выглядит ваш gsp? ... т.е.

<nav:render group="modules" /><br />
<nav:renderSubItems group="modules" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...