我想知道是否有人想出一种干净的方法来在Fusebox中生成面包屑痕迹。具体来说,有没有一种方法可以跟踪“您在哪里”并以某种方式为您生成面包屑?因此,例如,如果您正在执行

 /index.cfm?fuseaction=Widgets.ViewWidget&widget=1


电路结构类似于/foo/bar/widgets/,那么系统会以某种方式自动创建一个数组,如:

[
    { title: 'Foo', url: '#self#?fuseaction=Foo.Main' },
    { title: 'Bar', url: '#self#?fuseaction=Bar.Main' },
    { title: 'Widgets', url: '#self#?fuseaction=Widgets.Main' },
    { title: 'Awesome Widget', url: '' }
]


然后可以将其呈现为

Foo> Bar> Widgets>很棒的小部件

现在看来,真正做到这一点的唯一方法是为某种类型的保险丝(显示保险丝或专用于创建碎屑的保险丝)的每个保险丝创建结构。

最佳答案

我在Fusebox上工作了很长时间,但仍然无法理解这一部分:


电路结构类似于/ foo / bar / widgets /


无论如何,一旦我的想法是为每个控制器融合使用名为“ parent”(或其他任何东西)的自定义词典,就在其中放置上一级融合的名称。

但是我记得,这种方法仅在使用XML样式的电路时适用,在该电路中,您始终可以从全局容器中获取任何融合信息-因此,由于没有大量使用no-XMl样式,所以我没有使用它。

编辑:词典示例

这仅适用于传统的Fusebox 5。

假设我们已经创建了以下词典定义/lexicon/bc/parent.cfm

<cfscript>
    if (fb_.verbInfo.executionMode is "start") {
        // validate fb_.verbInfo.attributes contents
        if (not structKeyExists(fb_.verbInfo.attributes,"value")) {
            fb_throw("fusebox.badGrammar.requiredAttributeMissing",
                        "Required attribute is missing",
                        "The attribute 'value' is required, for a 'parent' verb in fuseaction #fb_.verbInfo.circuit#.#fb_.verbInfo.fuseaction#.");
        }
        // compile start tag CFML code
        circuit = fb_.verbInfo.action.getCircuit().getName();
        fa = fb_.verbInfo.action.getCircuit().getFuseactions();
        fa[#fb_.verbInfo.fuseaction#].parent = circuit & "." & fb_.verbInfo.attributes.value;
    } else {
        // compile end tag CFML code
    }
</cfscript>


基本上,这是专门用于词典parent的复制粘贴的标准词典标记。

假设我们使用的是Fusebox 5骨架示例,contoller如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE circuit>
<circuit access="public" xmlns:bc="bc/">

    <postfuseaction>
        <do action="layout.mainLayout" />
    </postfuseaction>

    <fuseaction name="welcome" bc:parent="">
        <do action="time.getTime" />
        <do action="display.sayHello" />
    </fuseaction>

    <fuseaction name="widgets" bc:parent="app.welcome">
        <do action="display.showWidgets" />
    </fuseaction>

    <fuseaction name="widget" bc:parent="app.widgets">
        <do action="display.showWidget" />
    </fuseaction>

</circuit>


它显示了词典如何用于每个融合。请注意,如果您不定义属性bc:parent,则以后将不会出现在自定义属性结构中。

可以仅使用融合名称作为父名称,如果您在同一电路中具有所有链,则以后使用起来会更容易。

最后,一些快速的代码来构建这些东西。请查看评论,它们应该足够有用。

<!--- path data container with current fuseaction saved --->
<cfset arrBreadcrumbs = [] />
<cfset ArrayAppend(arrBreadcrumbs, attributes.fuseaction) />

<!--- pull the current circuit fuseactions --->
<cfset fuseactions = myFusebox.getApplication().circuits[ListFirst(attributes.fuseaction,'.')].getFuseactions() />
<!--- OR <cfset fuseactions = application.fusebox.circuits[ListFirst(attributes.fuseaction,'.')].getFuseactions()> --->

<!--- pull the current fuseaction custom attributes --->
<cfset fa = ListLast(attributes.fuseaction,'.') />
<cfset customAttributes = fuseactions[fa].getCustomAttributes('bc') />

<!--- save the parent fuseaction name if present -- KEY CHECK IS RECOMMENDED --->
<cfif StructKeyExists(customAttributes, "parent")>
    <cfset ArrayPrepend(arrBreadcrumbs, customAttributes.parent) />
</cfif>


<!--- let's say we know that parent is there... --->

<!--- pull the found fuseaction custom attributes --->
<cfset fa = ListLast(customAttributes.parent,'.') />
<cfset customAttributes = fuseactions[fa].getCustomAttributes('bc') />

<!--- save the parent fuseaction name if present --->
<cfif StructKeyExists(customAttributes, "parent")>
    <cfset ArrayPrepend(arrBreadcrumbs, customAttributes.parent) />
</cfif>


<!--- render the collected path --->
<cfoutput>
<cfloop index="crumb" from="1" to="#ArrayLen(arrBreadcrumbs)#">

    <!--- to have a nice labels you can use another lexicon --->
    <a href="#myself##arrBreadcrumbs[crumb]#">#arrBreadcrumbs[crumb]#</a> <cfif crumb LT ArrayLen(arrBreadcrumbs)>&gt;</cfif>

</cfloop>
</cfoutput>


因此输出应如下所示:app.welcome > app.widgets > app.widget

10-08 20:17