代码之家  ›  专栏  ›  技术社区  ›  Jordan Reiter

保险丝盒中的面包屑4/5

  •  3
  • Jordan Reiter  · 技术社区  · 14 年前

    我想知道是否有人想出了一种在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 gt; Bar gt; Widgets >很棒的小部件

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   Sergey Galashyn    14 年前

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

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

    无论如何,曾经我的想法是为每个控制器融合使用名为“parent”(或任何东西)的自定义词汇,在这里您放置上一级融合的名称。

    但我记得,这个方法仅在使用XML样式的电路时才适用,在这种电路中,您总是可以从全局容器中获取任何FuseAction信息,所以我没有做到这一点,因为大量使用了非XML样式。

    编辑:带词典的示例

    这只适用于 传统保险丝盒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>
    

    基本上,这是专门为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名称作为父级,如果您在同一个电路中拥有所有链,则以后可以更容易地使用它。

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

    <!--- 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

        2
  •  0
  •   Joseph Bullock-Palser    14 年前

    这是我用的东西…

    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>