1
我正在努力在基於xml的Coldfusion中構建一個菜單。coldfusion xml菜單
當前工作功能:
<cffunction name="xmlNav" access="private" returntype="struct" output="false">
<cfargument name="qGetNav" type="query" required="true">
<cfscript>
var qNav=Arguments.qGetNav;
var xmlNav=StructNew();
var myXmlDoc=xmlNew();
var route='';
myXmlDoc.XMLRoot = XMLElemNew(myXmlDoc,"UL");
myXmlDoc.UL.xmlAttributes.ID="nav-main-links";
for(q=1;q<=qNav.recordCount;q++){
//setup li
myXmlDoc.UL.XmlChildren[q]=XmlElemNew(myXmlDoc,"LI");
myXmlDoc.UL.XmlChildren[q].xmlAttributes.ID="id" & qNav["navid"][q];
myXmlDoc.UL.XmlChildren[q].xmlAttributes.CLASS="standby";
//setup route
myXmlDoc.UL.XmlChildren[q].a=XmlElemNew(myXmlDoc,"A");
route=qNav["Route"][q];
if(qNav["Version"][q] Eq "CB"){
route="/?event=" & route;
}
else if(qNav["Version"][q] Eq "L"){
route="http://" & route;
}
myXmlDoc.UL.XmlChildren[q].A.xmlAttributes.HREF=route;
myXmlDoc.UL.XmlChildren[q].A.xmlAttributes.TARGET=qNav["LinkTarget"][q];
myXmlDoc.UL.XmlChildren[q].A.xmlAttributes.TITLE=qNav["LinkTitle"][q];
//setup route text
myXmlDoc.UL.XmlChildren[q].A.SPAN=XmlElemNew(myXmlDoc,"SPAN");
myXmlDoc.UL.XmlChildren[q].A.SPAN.xmlText=qNav["TextDesc"][q];
myXmlDoc.UL.XmlChildren[q].A.SPAN.FONT=XmlElemNew(myXmlDoc,"FONT");
myXmlDoc.UL.XmlChildren[q].A.SPAN.FONT.xmlAttributes.CLASS="menuItemType";
myXmlDoc.UL.XmlChildren[q].A.SPAN.FONT.xmlText="(" & qNav["Version"][q] & ")";
}
xmlNav.xmlNavString=toString(myXmlDoc);
xmlNav.xmlNavString=replaceNoCase(xmlNav.xmlNavString,">",CHR(62),"all");
xmlNav.xmlNavString=replaceNoCase(xmlNav.xmlNavString,"<",CHR(60),"all");
xmlNav.xmlNavString=replaceNoCase(xmlNav.xmlNavString,"&",CHR(38),"all");
xmlNav.xmlNav=myXmlDoc;
return xmlNav;
</cfscript>
</cffunction>
我需要考慮到孩子和我遇到了一些困難顯著。這裏是我使用的基於陣列和結構的示例:
<cffunction name="arrayNav" access="private" returntype="struct" output="false">
<cfargument name="qGetNav" type="query" required="true">
<cfscript>
var qNav=Arguments.qGetNav;
var arrayNav=StructNew();
var aNavTree = arrayNew(1);
var aNavMenuItems = arrayNew(1);
var sNavLookup = structNew();
for(q=1;q<=qNav.recordCount;q++){
sThis = structNew();
sThis.data = structNew();
sThis.data.navid = qNav["navid"][q];
sThis.data.Route = qNav["Route"][q];
sThis.data.Version = qNav["Version"][q];
if(qNav["Version"][q] Eq "CB"){
arrayAppend(aNavMenuItems,qNav["Route"][q]);
}
sThis.data.LinkTarget = qNav["LinkTarget"][q];
sThis.data.LinkTitle = qNav["LinkTitle"][q];
sThis.data.TextDesc = qNav["TextDesc"][q];
sThis.children = arrayNew(1);
/*
now loop through
avoid dupes from the levelid, this should prob be handled in the query above by only selecting
the right levels, or using a select distinct without the levelid in there
*/
if(Not structKeyExists(sNavLookup,qNav["navid"][q])){
sNavLookup[qNav["navid"][q]] = sThis;
}
else{
//do nothing
}
if(qNav["NavParentId"][q] EQ 0){
arrayAppend(aNavTree, sThis);
}
else{
if(structKeyExists(sNavLookup, qNav["NavParentId"][q])){
arrayAppend(sNavLookup[qNav["NavParentId"][q]].children, sThis);
}
else{
//parent not found
}
}
}
arrayNav.arrayNav=aNavTree;
arrayNav.arrayNavMenuItems=aNavMenuItems;
return arrayNav;
</cfscript>
</cffunction>
希望避免遞歸,如果可以的話。所以我的問題是如何將一個塊添加到搜索xml文件的父節點並添加子節點的for循環。我從字面上停留在搜索片上。到目前爲止,我可以找到節點,例如使用xmlNav.findNode=XmlSearch(myXmlDoc,"/UL/LI[@ID='id57']");
來查找位置,但無法在該位置插入項目。
問題在哪裏? – Henry 2012-03-23 00:01:36
@Henry我剛纔說得更清楚了,謝謝 – 2012-03-23 00:06:07
基本上它提供了一個查詢「qGetNav」,裏面有所有的菜單項,並且我想動態生成xml – 2012-03-23 00:37:46