Custom Overview Tab - Related Content
FarCry makes it easy to add tabs to an object's overview. This example shows how to use this to add a tab that shows all content in the system that is related to the selected object
The short explanation of this code is that:
- I created a webskin called webtopOverviewTabRelated.cfm and put it in /webskin/types,
- looped over application.stCOAPI[stObj.typename].aJoins to get all the relationships that the type is a part of,
- used application.fapi.getContentObjects() to retrieve content with one of those relationships with this object (with some deduping in the process),
- then outputed that content using the librarySelect webskin (the webskin used in library pickers)
These custom tabs are only loaded when a user clicks on them, via AJAX, which means that all of this is only executed and rendered if the user is actually interested.
webtopOverviewTabRelated.cfm
<cfsetting enablecfoutputonly="true" />
<!--- @@displayname: Related Content --->
<cfimport taglib="/farcry/core/tags/webskin" prefix="skin" />
<cfset stLocal.aRelated = application.stCOAPI[stObj.typename].aJoins />
<cfset stLocal.qRelated = querynew("objectid,typename,notes") />
<cfloop from="1" to="#arraylen(stLocal.aRelated)#" index="stLocal.i">
<cfset stLocal.st = stLocal.aRelated[stLocal.i] />
<cfset stLocal.args = structnew() />
<cfif stLocal.st.direction eq "from">
<cfif structkeyexists(application.stCOAPI[stLocal.st.coapiType],"displayname")>
<cfset stLocal.note = "#application.stCOAPI[stLocal.st.coapiType].displayname# #application.stCOAPI[stLocal.st.coapiType].stProps[stLocal.st.property].metadata.ftLabel#" />
<cfelse>
<cfset stLocal.note = "#stLocal.st.coapiType# #application.stCOAPI[stLocal.st.coapiType].stProps[stLocal.st.property].metadata.ftLabel#" />
</cfif>
<cfset stLocal.args.typename = stLocal.st.coapiType />
<cfset stLocal.args["#stLocal.st.property#_in"] = stObj.objectid />
<cfset stLocal.q = application.fapi.getContentObjects(argumentCollection=stLocal.args) />
<cfloop query="stLocal.q">
<cfset stLocal.matched = false />
<cfloop query="stLocal.qRelated">
<cfif stLocal.qRelated.objectid[stLocal.qRelated.currentrow] eq stLocal.q.objectid[stLocal.q.currentrow]>
<cfset querysetcell(stLocal.qRelated,"notes",stLocal.qRelated.notes[stLocal.qRelated.currentrow] & ", #stLocal.note#",stLocal.qRelated.currentrow) />
<cfset stLocal.matched = true />
</cfif>
</cfloop>
<cfif not stLocal.matched>
<cfset queryaddrow(stLocal.qRelated) />
<cfset querysetcell(stLocal.qRelated,"objectid",stLocal.q.objectid[stLocal.q.currentrow]) />
<cfset querysetcell(stLocal.qRelated,"typename",stLocal.q.typename[stLocal.q.currentrow]) />
<cfset querysetcell(stLocal.qRelated,"notes",stLocal.note) />
</cfif>
</cfloop>
<cfelse><!--- to --->
<cfif isarray(stObj[stLocal.st.property])>
<cfset stObj[stLocal.st.property] = arraytolist(stObj[stLocal.st.property]) />
</cfif>
<cfif structkeyexists(application.stCOAPI[stLocal.st.coapiType],"displayname")>
<cfset stLocal.note = "#application.stCOAPI[stLocal.st.coapiTypeOther].displayname# #application.stCOAPI[stLocal.st.coapiTypeOther].stProps[stLocal.st.property].metadata.ftLabel#" />
<cfelse>
<cfset stLocal.note = "#stLocal.st.coapiTypeOther# #application.stCOAPI[stLocal.st.coapiTypeOther].stProps[stLocal.st.property].metadata.ftLabel#" />
</cfif>
<cfif len(stObj[stLocal.st.property])>
<cfset stLocal.q = application.fapi.getContentObjects(typename=stLocal.st.coapiType,objectid_in=stObj[stLocal.st.property]) />
<cfloop query="stLocal.q">
<cfset stLocal.matched = false />
<cfloop query="stLocal.qRelated">
<cfif stLocal.qRelated.objectid[stLocal.qRelated.currentrow] eq stLocal.q.objectid[stLocal.q.currentrow]>
<cfset querysetcell(stLocal.qRelated,"notes",stLocal.qRelated.notes[stLocal.qRelated.currentrow] & ", #stLocal.note#",stLocal.qRelated.currentrow) />
<cfset stLocal.matched = true />
</cfif>
</cfloop>
<cfif not stLocal.matched>
<cfset queryaddrow(stLocal.qRelated) />
<cfset querysetcell(stLocal.qRelated,"objectid",stLocal.q.objectid[stLocal.q.currentrow]) />
<cfset querysetcell(stLocal.qRelated,"typename",stLocal.q.typename[stLocal.q.currentrow]) />
<cfset querysetcell(stLocal.qRelated,"notes",stLocal.note) />
</cfif>
</cfloop>
</cfif>
</cfif>
</cfloop>
<cfoutput><table width="100%"><tr style="font-weight:bold;"><th>Related Object</th><th>Related Through</th></tr></cfoutput>
<cfloop query="stLocal.qRelated">
<cfoutput><tr><td></cfoutput>
<skin:view objectid="#stLocal.qRelated.objectid#" typename="#stLocal.qRelated.typename#" webskin="librarySelected" />
<cfoutput></td><td>#stLocal.qRelated.notes#</td></tr></cfoutput>
</cfloop>
<cfoutput></table></cfoutput>
<cfsetting enablecfoutputonly="false" />
, multiple selections available,
