Coldfusion 保险丝盒中的面包屑4/5
我想知道是否有人想出了一个干净的方法来在Fusebox中生成面包屑痕迹。具体来说,有没有一种方法可以跟踪“你在哪里”,并让它以某种方式为你生成面包屑?例如,如果你正在执行Coldfusion 保险丝盒中的面包屑4/5,coldfusion,breadcrumbs,fusebox,Coldfusion,Breadcrumbs,Fusebox,我想知道是否有人想出了一个干净的方法来在Fusebox中生成面包屑痕迹。具体来说,有没有一种方法可以跟踪“你在哪里”,并让它以某种方式为你生成面包屑?例如,如果你正在执行 /index.cfm?fuseaction=Widgets.ViewWidget&widget=1 电路结构类似于/foo/bar/widgets/,然后系统会自动创建一个数组,如: [ { title: 'Foo', url: '#self#?fuseaction=Foo.Main' }, { t
/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: '' }
]
然后可以将其渲染为
>>>很棒的小部件
现在看来,真正做到这一点的唯一方法是在某种保险丝(显示器保险丝或专用于创建碎屑痕迹的保险丝)中为每个保险丝动作创建结构。我在Fusebox工作了很长时间,但仍然无法理解这一部分: 电路结构类似于/foo/bar/widgets/ 不管怎样,我曾经的想法是为每个控制器fuseaction使用名为“parent”(或任何内容)的自定义词典,在其中输入上一级fuseaction的名称 但正如我所记得的,这种方法只适用于使用XML样式的电路,在这种电路中,您总是可以从全局容器中获取任何fuseaction信息——因此我没有这样做,因为大量使用了非XML样式 编辑:带有词典的示例 这仅适用于Fusebox 5 traditional 假设我们创建了以下词典定义
/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>
它显示了词汇如何用于每个融合。请注意,如果您不定义属性bc:parent
,它将不会在以后的自定义属性结构中出现
可以仅使用fuseaction名称作为父级,如果在同一回路中有所有链,则以后使用会更方便
最后,一些快速代码来构建这些东西。请看评论,它们应该足够有用
<!--- 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)>></cfif>
</cfloop>
</cfoutput>
因此,输出应该如下所示:
app.welcome>app.widgets>app.widget
以下是我使用的东西
act_breadcrum.cfm
=============================
<cfscript>
if (NOT structKeyExists(session, 'clickstream'))
{
session.clickstream = arrayNew(1);
}
</cfscript>
<cflock name="addNewPage" type="exclusive" timeout="10">
<cfscript>
if ((arrayIsEmpty(session.clickstream))
OR (compare(myFusebox.originalCircuit, session.clickstream[arrayLen(session.clickstream)].Circuit))
OR (compare(myFusebox.originalFuseaction, session.clickstream[arrayLen(session.clickstream)].Fuseaction))
)
{
if (arrayLen(session.clickstream) EQ 10)
{
temp = arrayDeleteAt(session.clickstream, 1);
}
temp = arrayAppend(session.clickstream, structNew());
session.clickstream[arrayLen(session.clickstream)].Fuseaction = myFusebox.originalFuseaction;
session.clickstream[arrayLen(session.clickstream)].Circuit = myFusebox.originalCircuit;
}
</cfscript>
</cflock>
dsp_Breadcrum.cfm
==========================
<cfoutput>
<center>
<b><u>Last Clicked</u></b><BR>
<cfloop from="#arrayLen(session.clickstream)#" to="1" index="i" step="-1">
<cfset Opaque=i*.2>
<a href="#Myself##session.clickstream[i].Circuit#.#session.clickstream[i].Fuseaction#" style=opacity:#Opaque#>
#session.clickstream[i].Circuit#
</a><BR>
</cfloop>
</center>
</cfoutput>
act_breadcrum.cfm
=============================
如果(不存在(会话“clickstream”))
{
session.clickstream=arrayNew(1);
}
if((数组为空(session.clickstream))
或者(比较(myFusebox.originalCircuit,session.clickstream[arrayLen(session.clickstream)].Circuit))
或者(比较(myFusebox.originalFuseaction,session.clickstream[arrayLen(session.clickstream)].Fuseaction))
)
{
if(arrayLen(会话.点击流)等式10)
{
temp=arrayDeleteAt(session.clickstream,1);
}
temp=arrayAppend(session.clickstream,structNew());
session.clickstream[arrayLen(session.clickstream)].Fuseaction=myFusebox.originalFuseaction;
session.clickstream[arrayLen(session.clickstream)].Circuit=myFusebox.originalCircuit;
}
dsp_Breadcrum.cfm
==========================
上次单击
我指的是文件夹结构。在Fusebox3中,我相信这确实起到了作用,但我认为在Fusebox4/5中并不是这样。不过,如果有什么方法可以获得这些信息,那就太好了。@Jordan请查看更新。这是相当快和肮脏,但工作。认为这不是真正的东西所谓的“网站面包屑”这些天,更像是“经典”这个词的含义从文学。如果有人直接打开一些内部页面呢?您的会话。单击流将不充分。
act_breadcrum.cfm
=============================
<cfscript>
if (NOT structKeyExists(session, 'clickstream'))
{
session.clickstream = arrayNew(1);
}
</cfscript>
<cflock name="addNewPage" type="exclusive" timeout="10">
<cfscript>
if ((arrayIsEmpty(session.clickstream))
OR (compare(myFusebox.originalCircuit, session.clickstream[arrayLen(session.clickstream)].Circuit))
OR (compare(myFusebox.originalFuseaction, session.clickstream[arrayLen(session.clickstream)].Fuseaction))
)
{
if (arrayLen(session.clickstream) EQ 10)
{
temp = arrayDeleteAt(session.clickstream, 1);
}
temp = arrayAppend(session.clickstream, structNew());
session.clickstream[arrayLen(session.clickstream)].Fuseaction = myFusebox.originalFuseaction;
session.clickstream[arrayLen(session.clickstream)].Circuit = myFusebox.originalCircuit;
}
</cfscript>
</cflock>
dsp_Breadcrum.cfm
==========================
<cfoutput>
<center>
<b><u>Last Clicked</u></b><BR>
<cfloop from="#arrayLen(session.clickstream)#" to="1" index="i" step="-1">
<cfset Opaque=i*.2>
<a href="#Myself##session.clickstream[i].Circuit#.#session.clickstream[i].Fuseaction#" style=opacity:#Opaque#>
#session.clickstream[i].Circuit#
</a><BR>
</cfloop>
</center>
</cfoutput>