我与Fusebox合作了很长时间,但仍然无法理解这一部分:
电路结构类似于/foo/bar/widgets/
无论如何,曾经我的想法是为每个控制器融合使用名为“parent”(或任何东西)的自定义词汇,在这里您放置上一级融合的名称。
但我记得,这个方法仅在使用XML样式的电路时才适用,在这种电路中,您总是可以从全局容器中获取任何FuseAction信息,所以我没有做到这一点,因为大量使用了非XML样式。
编辑:带词典的示例
这只适用于
传统保险丝盒5
.
假设我们已经创建了以下词汇定义
/lexicon/bc/parent.cfm
:
<cfscript>
if (fb_.verbInfo.executionMode is "start") {
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#.");
}
circuit = fb_.verbInfo.action.getCircuit().getName();
fa = fb_.verbInfo.action.getCircuit().getFuseactions();
fa[#fb_.verbInfo.fuseaction#].parent = circuit & "." & fb_.verbInfo.attributes.value;
} else {
}
</cfscript>
基本上,这是专门为lexicon复制粘贴的标准lexicon标记
parent
.
假设我们使用的是Fusebox 5骨架示例,那么Contler可以如下所示:
<?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
稍后它不会出现在自定义属性结构中。
可以只使用FuseAction名称作为父级,如果您在同一个电路中拥有所有链,则以后可以更容易地使用它。
最后,一些快速代码来构建这些东西。请看评论,它们应该足够有用。
<cfset arrBreadcrumbs = [] />
<cfset ArrayAppend(arrBreadcrumbs, attributes.fuseaction) />
<cfset fuseactions = myFusebox.getApplication().circuits[ListFirst(attributes.fuseaction,'.')].getFuseactions() />
<cfset fa = ListLast(attributes.fuseaction,'.') />
<cfset customAttributes = fuseactions[fa].getCustomAttributes('bc') />
<cfif StructKeyExists(customAttributes, "parent")>
<cfset ArrayPrepend(arrBreadcrumbs, customAttributes.parent) />
</cfif>
<cfset fa = ListLast(customAttributes.parent,'.') />
<cfset customAttributes = fuseactions[fa].getCustomAttributes('bc') />
<cfif StructKeyExists(customAttributes, "parent")>
<cfset ArrayPrepend(arrBreadcrumbs, customAttributes.parent) />
</cfif>
<cfoutput>
<cfloop index="crumb" from="1" to="#ArrayLen(arrBreadcrumbs)#">
<a href="#myself##arrBreadcrumbs[crumb]#">#arrBreadcrumbs[crumb]#</a> <cfif crumb LT ArrayLen(arrBreadcrumbs)>></cfif>
</cfloop>
</cfoutput>
所以输出应该如下所示:
app.welcome > app.widgets > app.widget