1

CF8 では、ノード (複数のノード) ごとに RSS フィードを持つ作業用の cftree があります。問題は、現在バインドを使用していないことです。つまり、ページが読み込まれるとすべてのフィードが読み込まれ、非常に時間がかかります。私がしたいのは、cftreeitem を cfc にバインドして、ユーザーが親 cftreeitem を選択したときにのみフィードが読み取られ、ページの読み込み時ではないようにすることです。ページはエラーをスローしていませんが、フィードの子ノードが親の下に表示されていません。

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 つになるようにすることでした。

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

2 に答える 2

1

まず、次の 2 点を確認する必要があります。

  1. JSON でエンコードされた配列を返すようにしてください (マニュアルを参照してください)。
  2. Firebug を Firefox にインストールし、コンソール タブを使用して正確なリクエストとレスポンスを追跡します。

CFC では、提供された引数を使用して、フィードからデータをフィルタリングする必要があります。フェッチされたデータの QoQ のようなものかもしれません。

また、サーバー側のコードに関するいくつかのメモ。

どこでも # を使用する必要はありませんが、明示的なスコープを使用する必要があります。

<cfset feed.href = "#rsslink#" />
<cfset feed.href = eliteRSS.rsslink />

構造を複製してインデックスを追跡する必要はありません。これははるかに簡単です。

<cfloop query="eliteRSS">
    <cfset feed = {} />
    ...
    <cfset ArrayAppend(feedArray, feed) />
</cfloop>  
于 2010-01-02T11:32:02.033 に答える
1

私の最初の問題は、フィード内のすべてのアイテムに leafnode=true 属性を使用していないことでした。次に、私の次の最大の問題は、arguments.value を適切に設定していなかったため、cffeed を繰り返したばかりのノードが選択されるたびに、cfc がオフになっていました。私が望んでいたように動作する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>
于 2010-01-02T16:01:02.543 に答える