【问题标题】:Breadcrumbs in Fusebox 4/5保险丝盒中的面包屑 4/5
【发布时间】:2010-05-13 16:41:18
【问题描述】:

我想知道是否有人想出了一种干净的方法来在 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 > 很棒的小部件

目前看来,真正做到这一点的唯一方法是为某种熔断器中的每个熔断动作创建结构(显示熔断器或专用于创建 crumbtrail 的熔断器)。

【问题讨论】:

    标签: coldfusion breadcrumbs fusebox


    【解决方案1】:

    我和Fusebox合作了很长时间,但还是看不懂这部分:

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

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

    但我记得,这种方法只适用于使用 XML 样式的电路,您总是可以从全局容器中获取任何 fuseaction 信息——所以我没有这样做,因为大量使用了非 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 骨架示例,控制器可能如下所示:

    <?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 名称作为父级,如果所有链都在同一电路中,以后使用起来会更容易。

    最后,一些快速的代码来构建这些东西。请参阅 cmets,它们应该足够有用。

    <!--- 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 &gt; app.widgets &gt; app.widget

    【讨论】:

    • 我的意思是文件夹结构。在 Fusebox 3 中,我相信这确实有所作为,但我认为在 Fusebox 4/5 中并没有。但是,如果有某种方法可以获取该信息,那就太好了。
    • @Jordan 请查看更新。它非常快速和肮脏,但有效。
    【解决方案2】:

    这是我使用的东西...

    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>
    

    【讨论】:

    • 认为这不是现在所谓的“网站面包屑”,更像是文学中这个词的“经典”含义。如果有人会直接打开一些内页怎么办?你的session.clickstream 不够用。
    猜你喜欢
    • 1970-01-01
    • 2015-07-18
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多