سؤال

أتساءل عما إذا كان أي شخص قد توصل إلى طريقة نظيفة لتوليد مسار فتات الخبز في 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: '' }
]

التي يمكن بعد ذلك تقديمها كـ

فو > شريط > الحاجيات > عنصر واجهة مستخدم رهيبة

في الوقت الحالي ، يبدو أن الطريقة الوحيدة للقيام بذلك حقًا هي إنشاء بنية لكل FuseAction في فتيل من نوع ما (إما فتيل العرض أو المصهر المخصص لإنشاء Crumbtrail).

هل كانت مفيدة؟

المحلول

أنا أعمل مع Fusebox لفترة طويلة ، لكن ما زلت لا أستطيع فهم هذا الجزء:

هيكل الدائرة هو شيء مثل/foo/bar/widgets/

على أي حال ، بمجرد أن كانت فكرتي هي استخدام المعجم المخصص الذي يسمى "الأصل" (أو أي شيء) لكل وحدة تحكم FUSEACTION ، حيث تضع اسم المستوى السابق.

ولكن كما أتذكر ، كانت هذه الطريقة قابلة للتطبيق فقط عند استخدام دوائر على غرار 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 Skeleton ، يمكن أن يبدو Contoller مثل:

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

إنه يوضح كيف يستخدم المعجم لكل FuseAction. يرجى ملاحظة أنه إذا لن تحدد السمة 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

نصائح أخرى

هذا شيء أستخدمه ...

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>
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top