Панировочные сухари в Fusebox 4/5 - PullRequest
3 голосов
/ 13 мая 2010

Я задаюсь вопросом, придумал ли кто-нибудь чистый способ создания цепочки крошек в 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 > Бар > Виджеты > Удивительный виджет

В настоящий момент кажется, что единственный способ действительно сделать это - создать структуру для каждого плавкого предохранителя в каком-то плавком предохранителе (или предохранитель дисплея или плавкий предохранитель, предназначенный для создания следа крошки).

Ответы [ 2 ]

2 голосов
/ 14 мая 2010

Я давно работаю с Fusebox, но до сих пор не могу понять эту часть:

структура схемы что-то вроде / foo / bar / widgets /

В любом случае, однажды моя идея состояла в том, чтобы использовать пользовательский лексикон, называемый «родитель» (или что-нибудь еще), для каждой операции слияния контроллера, где вы помещаете имя слияния предыдущего уровня.

Но, насколько я помню, этот метод был применим только при использовании схем в стиле XML, где вы всегда можете получить любую информацию о fuseaction из глобального контейнера - поэтому я этого не сделал из-за интенсивного использования стиля 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, контроллер может выглядеть так:

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

0 голосов
/ 15 мая 2010

Вот что я использую ...

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