Bind RSS leggere CFC ad un cftreeitem
-
22-09-2019 - |
Domanda
In CF8, ho un cftree di lavoro con un feed RSS per nodo (più nodi). Il problema è che non sono attualmente in uso un vicolo cieco che significa che tutti i feed vengono letti quando la pagina viene caricata, che prende un tempo molto lungo. Quello che voglio fare è associare il cftreeitem ad un CFC in modo che il feed viene letto solo quando l'utente seleziona la cftreeitem genitore e non al caricamento della pagina. La pagina non sta gettando un errore, ma nessuno dei bambini nodi del mangime stanno mostrando sotto il genitore.
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>
La ringrazio molto per tutto l'aiuto.
apportate le seguenti modifiche e ora ottenere l'uscita, ma è annidato / loop e non riesco a ottenere il nodo principale di livello superiore in modo che essi non sono tutti piatta. Il punto di fare questo è stato così che non ci sarebbe 1 genitore che non sarebbe caricare il feed fino controllato.
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>
Soluzione 2
Il mio primo problema non stava usando il leafnode = true attributo per tutti gli elementi all'interno del feed. Poi il mio prossimo più grande problema non stava tramontando adeguatamente l'arguments.value così che cosa stava accadendo è che sparava CFC fuori ogni volta che è stato selezionato un nodo che ha appena ripetuto il cffeed, ancora una volta. Ecco il codice CFC che funziona come avevo sperato:
<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>
Altri suggerimenti
Prima di tutto è necessario verificare due cose:
- Assicurati di restituire la matrice JSON-codificato (vedi manuale).
- Installa Firebug in Firefox e tenere traccia delle richieste e le risposte esatte tramite scheda Console.
Nel CFC si dovrebbe utilizzare argomenti forniti per filtrare i dati dai mangimi. Forse tipo di trim sui dati recuperati.
Anche alcune note riguardo il codice lato server.
Non è necessario usare # ovunque, ma si consiglia di utilizzare scoping esplicito:
<cfset feed.href = "#rsslink#" />
<cfset feed.href = eliteRSS.rsslink />
Non è necessario duplicare le strutture e monitorare l'indice. Questo può essere molto più semplice:
<cfloop query="eliteRSS">
<cfset feed = {} />
...
<cfset ArrayAppend(feedArray, feed) />
</cfloop>