将RSS读取cfc绑定到cftreeitem

时间:2010-01-01 18:19:49

标签: coldfusion cfc

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

2 个答案:

答案 0 :(得分:1)

首先,您必须检查两件事:

  1. 确保返回JSON编码的数组(请参阅manual)。
  2. 在Firefox中安装Firebug,并使用“控制台”选项卡跟踪确切的请求和响应。
  3. 在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>