rssをバインドして、CFCをCFTreeItemに読み取ります
-
22-09-2019 - |
質問
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>
解決 2
私の最初の問題は、フィード内のすべてのアイテムにLeafNode = True属性を使用していませんでした。それから、私の次の最大の問題は、引数を適切に設定しないことでした。価値があるので、何が起こっているのかは、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>
他のヒント
まず、2つのことを確認する必要があります。
- 必ずJSONエンコードアレイを返してください(参照してください マニュアル).
- FirefoxにFirebugをインストールし、[コンソール]タブを使用して正確なリクエストと応答を追跡します。
CFCでは、提供された引数を使用して、フィードからのデータをフィルタリングする必要があります。たぶん、フェッチされたデータのQOQのようなものです。
また、サーバー側のコードに関するメモはほとんどありません。
どこでも#を使用する必要はありませんが、明示的なスコープを使用する必要があります。
<cfset feed.href = "#rsslink#" />
<cfset feed.href = eliteRSS.rsslink />
構造を複製してインデックスを追跡する必要はありません。これははるかに簡単になる可能性があります:
<cfloop query="eliteRSS">
<cfset feed = {} />
...
<cfset ArrayAppend(feedArray, feed) />
</cfloop>