在CF8中,我有一个工作的cftree,每个节点有一个RSS feed(多个节点)。问题是我目前没有使用绑定,这意味着在加载页面时会读取所有提要,这需要很长时间。我想要做的是将cftreeitem绑定到cfc,这样只有当用户选择父cftreeitem而不是页面加载时才会读取feed。页面没有抛出错误,但Feed的子节点都没有显示在父节点下。
cfm:
<cfform name="RSS_exercise">
<cftree name="Xfeeds" format="html" cache="no">
<cftreeitem value="elite" display="<div style='color:##4c4c4c'>ELITE FTS</div>" queryasroot="true" expand="no">
<cftreeitem value="" bind="cfc:components.rssQ.getEliteRSS({cftreeitempath}, {cftreeitemvalue})">
</cftree>
</cfform>
cfc:
<cffunction name="getEliteRSS" access="remote" returntype="any" hint="gets EliteFTS RSS feed">
<cfargument name="itemPath" type="string" required="false"/>
<cfargument name="itemValue" type="string" required="false"/>
<cffeed source="http://feeds2.feedburner.com/EliteftsArticles" properties="eliteProps" query="eliteRSS">
<cfset var feedArray = ArrayNew(1) />
<cfset var feed = StructNew() />
<cfset var i = 1 />
<cfoutput query="eliteRSS">
<cfset feed.value = "" />
<cfset feed.display = "#title# <div style='color:gray'>Published: #DateFormat(publisheddate)#</div><br/>" />
<cfset feed.href = "#rsslink#" />
<cfset feed.target = "_blank" />
<cfset feed.parent = "elite" />
<cfset feed.queryAsRoot = "false" />
<cfset feed.expand = "no" />
<cfset feedArray[i] = Duplicate(feed) />
<cfset var i = "i++" />
</cfoutput>
<cfreturn feedArray />
</cffunction>
非常感谢您的帮助。
进行了以下更改,现在获取输出,但它是嵌套/循环的,我无法获得顶级父节点,因此它们不是全部平坦。这样做的目的是在检查之前有1个父母不会加载Feed。
cfm
<cfform name="RSS_exercise">
<cftree name="Xfeeds" format="html" cache="no">
<cftreeitem bind="cfc:components.rssQ.getEliteRSS({cftreeitempath}, {cftreeitemvalue})">
</cftree>
</cfform>
cfc
<cffunction name="getEliteRSS" access="remote" returntype="array" output="no" hint="gets EliteFTS RSS feed">
<cfargument name="itemPath" type="string" required="false"/>
<cfargument name="itemValue" type="string" required="false"/>
<cfset var feedArray = ArrayNew(1) />
<cfset var feed = StructNew() />
<cfset var i = 1 />
<cffeed source="http://feeds2.feedburner.com/EliteftsArticles" properties="eliteProps" query="eliteRSS">
<cfloop query="eliteRSS">
<cfset StructClear(feed) />
<cfset feed.value = "1" />
<cfset feed.display = "#title# <div style='color:gray'>Published: #DateFormat(publisheddate)#</div><br/>" />
<cfset feed.href = "#rsslink#" />
<cfset feed.target = "_blank" />
<cfset feed.parent = "elite" />
<cfset feed.queryAsRoot = "false" />
<cfset feed.expand = "no" />
<cfset feedArray[i] = Duplicate(feed) />
<cfset i++ />
</cfloop>
<cfreturn feedArray />
</cffunction>
答案 0 :(得分:1)
首先,您必须检查两件事:
在CFC中,您应该使用提供的参数来过滤来自Feed的数据。可能对获取的数据有QoQ。
关于服务器端代码的几点说明。
您不必在任何地方使用#,但您应该使用显式范围界定:
<cfset feed.href = "#rsslink#" />
<cfset feed.href = eliteRSS.rsslink />
您不必复制结构并跟踪索引。这可以简单得多:
<cfloop query="eliteRSS">
<cfset feed = {} />
...
<cfset ArrayAppend(feedArray, feed) />
</cfloop>
答案 1 :(得分:1)
我的第一个问题是没有对Feed中的所有项使用leafnode = true属性。然后我的下一个最大的问题是没有正确设置arguments.value,所以发生的事情就是每次选择一个节点时它都会关闭cfc,这只是重复了cffeed。这是cfc代码,按照我的希望工作:
<cffunction name="getEliteRSS" access="remote" returntype="array" output="no" hint="gets EliteFTS RSS feed">
<cfargument name="path" required="true"/>
<cfargument name="value" required="true"/>
<cfset var feedArray = ArrayNew(1) />
<cfset var feed = StructNew() />
<cfif arguments.value IS "">
<cfset feed.value = "elite" />
<cfset feed.display = "<div style='color:##4c4c4c'>ELITE FTS</div>" />
<cfset feed.leafnode = "false" />
<cfset feed.expand = "no" />
<cfset ArrayAppend(feedArray, feed) />
<cfelse>
<cffeed source="http://feeds2.feedburner.com/EliteftsArticles" properties="eliteProps" query="eliteRSS">
<cfloop query="eliteRSS">
<cfset feed = {} />
<cfset feed.value = "" />
<cfset feed.leafnode = "true" />
<cfset feed.display = "#title# <div style='color:gray'>Published: #DateFormat(eliteRSS.publisheddate)#</div><br/>" />
<cfset feed.href = "#rsslink#" />
<cfset feed.target = "_blank" />
<cfset feed.parent = "elite" />
<cfset feed.queryAsRoot = "false" />
<cfset ArrayAppend(feedArray, feed) />
</cfloop>
</cfif>
<cfreturn feedArray />
</cffunction>