2010-05-13 4 views
3

Je me demande si quelqu'un a trouvé une façon propre de générer un fil d'Ariane dans Fusebox. Plus précisément, y a-t-il un moyen de garder une trace de «où vous êtes» et de faire en sorte que cela génère de la panoplie pour vous? Ainsi, par exemple, si vous exécutezBreadcrumbs in Fusebox 4/5

/index.cfm?fuseaction=Widgets.ViewWidget&widget=1 

et la structure du circuit est quelque chose comme /foo/bar/widgets/ alors en quelque sorte le système crée automatiquement un tableau comme:

[ 
    { 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: '' } 
] 

qui peut ensuite être rendu sous la forme

Foo>Bar>Widgets> Widget Impressionnant

En ce moment, il se La seule façon de vraiment faire cela est de créer la structure pour chaque fusée dans un fusible quelconque (soit le fusible de l'afficheur, soit un fusible dédié à la création de la chaîne).

Répondre

2

Je travaille avec Fusebox depuis longtemps, mais ne comprends pas cette partie:

structure de circuit

est quelque chose comme/foo/bar/widgets/

De toute façon , une fois mon idée était d'utiliser le lexique personnalisé appelé "parent" (ou quoi que ce soit) pour chaque fuseaction du contrôleur, où vous mettez le nom de fuseaction de niveau précédent. Mais comme je me souviens, cette méthode ne s'appliquait que lorsque vous utilisiez des circuits de style XML, où vous pouvez toujours obtenir des informations de fuséaction du conteneur global - donc je ne l'ai pas fait à cause de l'utilisation intensive de no-XMl style.

EDIT: exemple avec lexique

Cela fonctionne uniquement avec Fusebox 5 traditionnelle.

Disons que nous avons créé la définition du lexique ci-dessous /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> 

Fondamentalement, il est étiquette lexique norme collé copie spécialement pour lexique parent.

En supposant que nous utilisons par exemple squelette Fusebox 5, peut ressembler à 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> 

Il montre comment le lexique utilisé pour chaque fuseaction. S'il vous plaît noter que si vous ne définissez pas l'attribut bc:parent il apparaîtra plus tard dans la structure des attributs personnalisés.

Il est possible d'utiliser uniquement le nom de la réaction en tant que parent, si vous avez toute la chaîne dans le même circuit, il peut être plus facile à utiliser plus tard.

Enfin, un code rapide pour construire le truc. S'il vous plaît voir les commentaires, ils devraient être assez utiles.

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

Ainsi, la sortie devrait ressembler à ceci: app.welcome > app.widgets > app.widget

+0

je voulais dire la structure du dossier. Dans Fusebox 3, je crois que cela a vraiment fait une différence, mais je pense que dans Fusebox 4/5, ce n'est pas vraiment le cas. Cependant, s'il y a un moyen d'obtenir cette information, ce serait génial. –

+0

@Jordan S'il vous plaît voir la mise à jour. C'est assez rapide et sale, mais ça marche. – Sergii

0

est ici quelque chose que j'utilise ...

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> 
+0

Pensez que ce n'est pas vraiment la chose appelée "chapelure du site" ces jours-ci, plus comme la signification "classique" de ce mot de la littérature. Que faire si quelqu'un va ouvrir une page intérieure directement? Votre 'session.clickstream' sera inadéquat. – Sergii

Questions connexes