gpt4 book ai didi

html - 如何为具有动态参数的页面提供面包屑?

转载 作者:行者123 更新时间:2023-12-02 15:05:42 25 4
gpt4 key购买 nike

我找到了一个用于生成面包屑的 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>&raquo;</li>"
}
out << "</ul></div>"
}
}
}

问题:当我有一个需要一些未修复的参数的结构时。

示例:我在导航的第三级让我们说
A1 / A2 / A3

就我而言 A2应该打开一个类似 user/show/1234 的页面其中 1234 是要显示的用户的 ID。问题是我无法在 breadcrumbs.xml 文件中添加 1234 硬编码,因为此 ID 会根据您要显示的用户而变化。

当中间面包屑链接需要动态参数时,我该如何处理?

最佳答案

再想一想,我意识到最好不要使用 HttpSession。如果您改用 session 范围的服务,则对面包屑代码进行单元测试会更容易。

首先,创建一个 session 范围的服务来维护用户的导航历史。

class NavigationHistoryService {
static transactional = false
static scope = "session"

def history = [:]

public List push(String controller, String action, Map params) {
def crumb = [
action: action,
params: params]

history.controller = crumb

return history
}

在您的 Controller 中注入(inject)服务并使用它来跟踪用户所在的位置。然后将历史记录添加为 Action 模型返回的内容的一部分:
class CompanyController {
def navigationHistoryService

def show() {
navigationHistoryService.push('company', 'show', params)
...
[crumbs: navigationHistoryService.history]
}
}

最后,使用 GSP 中的历史记录来呈现面包屑。
<ol class="breadcrumb">
<li><g:link controller="company" action="${crumbs.company.action}" params="${crumbs.company.params}">SOMETHING</a></li>
</ol>

关于html - 如何为具有动态参数的页面提供面包屑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31755520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com