Grails&导航插件:从不同的控制器渲染子项?

时间:2009-04-25 15:32:38

标签: grails

我正在使用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 个答案:

答案 0 :(得分:2)

您是否尝试使用Config.groovy中的显式控制器属性注册导航信息,如文档中所述? (请参阅“另外,在Config.groovy中添加项目”1

一节

它可能有用,但我认为它不会正确地突出显示“活动”项目。真的,这不会很好地工作,你正在做的是与基于“常规”的设置不兼容。

导航插件2.0(还没有ETA)将有一个不同的非基于控制器的机制来检测当前活动的菜单项,这在这种情况下可能会更好。

您可以随时通过电子邮件向我(插件的作者)发送电子邮件。

答案 1 :(得分:1)

好的,得到了​​另一种解决方法......

改变
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")
}

}

答案 2 :(得分:0)

你的gsp看起来像什么? ......即:

<nav:render group="modules" /><br />
<nav:renderSubItems group="modules" />

答案 3 :(得分:0)

解决了我的问题!!!!

我不知道这是否是最好的解决方案,但对我来说它就像一个魅力...如果我得到一个更好的解决方案,我会告诉你...

更改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-version:1.3.4 navigation-version:1.1.1


您好,

首先感谢你迄今为止的出色工作。

有问题的解决方案吗?

我刚从grails 1.2.1升级到1.3.4并遇到了这个问题,1.2.1没有那个问题(为什么到目前为止还没有调试过。)

THX

答案 4 :(得分:0)

解决此问题的最简单方法是编辑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'],
    ],
]