Я давно работаю с 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)>></cfif>
</cfloop>
</cfoutput>
Таким образом, результат должен выглядеть следующим образом: app.welcome > app.widgets > app.widget