【发布时间】:2023-03-24 23:03:02
【问题描述】:
我找到了一个用于生成面包屑的 Grails 框架here。它确实根据 breadcrumbs.xml 文件中的静态定义生成面包屑,其中定义了面包屑的层次结构:
<map>
<nav id="homeCrumb" matchController="samplePages" matchAction="homeBreadCrumbPage">
<!-- levels navigation -->
<nav id="itemsLevel1Crumb" matchController="samplePages" matchAction="level1BreadCrumbPage">
<nav id="itemsLevel2Crumb" matchController="samplePages" matchAction="level2BreadCrumbPage">
<nav id="itemsLevel3Crumb" matchController="samplePages" matchAction="level3BreadCrumbPage">
<nav id="showItemCrumb" matchController="samplePages" matchAction="itemDetailsBreadCrumbPage"/>
</nav>
</nav>
</nav>
<nav id="simple1Crumb" matchController="samplePages" matchAction="simpleBreadCrumb"/>
<nav id="simple2Crumb" matchController="samplePages" matchAction="simpleBreadCrumbWithAttr"/>
<!-- levels navigation -->
</nav>
</map>
此文件由 taglib 评估和打印:
class BreadCrumbTagLib {
static def log = LogFactory.getLog("grails.app.breadCrumbTag")
def breadCrumb = { attrs , body ->
def manager = BreadCrumbManager.getInstance()
def uri = request.getRequestURI()
def context = request.getContextPath()
def controller = params.controller
def action = params.action
def attrTitle = attrs.title
def attrLink = attrs.link
// if controller and action are missing from params try to get them from request url
if (!controller && !action && uri && context && uri.indexOf(context) != -1) {
def uriParams = uri.substring(uri.indexOf(context) + (context.length() + 1), uri.length())
def uriArray = uriParams.split('/')
if (uriArray.size() >= 2 ) {
controller = uriArray[0]
action = uriArray[1]
}
}
def crumbs = manager.getBreadCrumbs(controller, action)
if (crumbs) {
out << '<div class="breadcrumb"><ul>'
def size = crumbs.size()
crumbs.eachWithIndex { crumb, index ->
out << '<li>'
// override title and link of breadcrumb on current page (i.e. last bread crumb in hierarchy)
// if name, link attributes are supplied
if (index == size - 1) {
if (attrTitle)
crumb.title = attrTitle
if (attrLink)
crumb.link = attrLink
}
// set title to undefined if not found, associated
// renderer if present can overwrite it
if (!crumb.title)
crumb.title = "undefined"
if (crumb.title && crumb.title.size() > 40)
crumb.title = crumb.title.substring(0, 40) + "..."
if (crumb.viewController && crumb.viewAction) {
def content = g.include(controller:crumb.viewController, action:crumb.viewAction, breadcrumb:crumb, params:params)
out << content
} else if (crumb.viewTemplate) {
def content = g.include(view:crumb.viewTemplate, breadcrumb:crumb, params: params)
out << content
} else if (crumb.linkToController && crumb.linkToAction && (size - 1 > index)){
out << "<a href=\"${g.createLink (controller: crumb.linkToController, action: crumb.linkToAction)}\">${crumb.title}</a>"
// if crumb has a link and its not the last vread crumb then show link else
// just show the text
} else if (crumb.link && (size - 1 > index)){
out << "<a href=\"${crumb.link}\">${crumb.title}</a>"
} else {
out << "${crumb.title}"
}
out << "</li>"
// do not print for last bread crumb
if (size - 1 > index)
out << "<li>»</li>"
}
out << "</ul></div>"
}
}
}
问题:当我的结构需要一些无法修复的参数时。
示例:我在导航的第三级可以说
A1 / A2 / A3
在我的情况下,A2 应该打开一个类似user/show/1234 的页面,其中 1234 是要显示的用户 ID。问题是我无法在 breadcrumbs.xml 文件中添加 1234 硬编码,因为此 id 会根据您要显示的用户而变化。
当中间面包屑链接需要动态参数时,我该如何处理?
【问题讨论】:
-
该插件不是为该用例设计的。它专为面包屑的静态映射而设计。您需要 fork 插件并使其具有此功能,或使用其他方式创建面包屑。
-
你能画出怎么做吗?
-
好吧,你需要为标签提供一个新属性,这将是你想要用来获取值的实例(例如,id 值)然后出现使用配置 xml 中的一些新属性,您可以存储一个模式,您将在标签库中评估以将参数添加到正在生成的 href 的 URL。我建议您查看一些内置 Grails 标记的源代码,看看是否可以从那里获得有关如何执行此操作的任何想法(特别是链接标记)。
-
您能否在更详细的答案中提供它。至少在哪里设置面包屑正在获取的参数?
-
您的想法的问题是您只能对面包屑中的最后一个标签执行此操作。但是,您需要之前访问过的标签的标签属性。生成链接。您不需要当前面包屑的链接。你会如何解决这个问题?
标签: html grails groovy breadcrumbs