Sample Promotional Tile
Overview
We needed a simple promotional tile for placing on the website. This was used to promote other areas on the site or external subsites of the clients. The tile can have either a fixed horizontal image or a vertical image. The individual tiles will be placed onto the site using the "hand-picked" publishing rule.
For the complete solution we need:
- content type
- content administration in the webtop
- webskins to display the tiles in the hand-picked rule
All code is complete, and the file location is given relative to the project root.
Content Type
<!--- || LEGAL || $Copyright: Daemon Pty Limited 1995-2007, http://www.daemon.com.au $ || DESCRIPTION || $Description: Promotional Tile Type $ || DEVELOPER || $Developer: Geoff Bowers (modius@daemon.com.au) $ ---> <cfcomponent extends="farcry.core.packages.types.types" displayname="Promo Tile" hint="Promotional tile for highlighting cross referenced content." bSchedule="true" bFriendly="false" bObjectBroker="true"> <!------------------------------------------------------------------------ type properties -------------------------------------------------------------------------> <cfproperty ftseq="1" ftfieldset="General Details" name="title" type="string" hint="Promo title." required="no" default="" ftlabel="Title" ftvalidation="required" /> <cfproperty fthelptitle="Select A Location" fthelpsection="Clicking on the promotion tile will redirect the user to the nominated location. You can choose either a folder in the navigation hierarchy or nominate a fully qualified URL for external addresses." ftseq="2" ftfieldset="Redirection" name="linkNavigation" type="string" hint="Link to a navigation folder within the site." required="no" default="" fttype="navigation" ftalias="home" ftrendertype="tree" ftSelectMultiple="false" ftlabel="Navigation Folder" /> <cfproperty ftseq="3" ftfieldset="Redirection" name="linkExternal" type="string" hint="Link to an external website." required="no" default="" fttype="url" ftlabel="External Link" /> <cfproperty ftseq="11" ftfieldset="Badge Image" name="imgHorizontal" type="string" hint="Horizontal promotional tile." required="false" default="" ftlabel="Horizontal Tile" fttype="image" ftimagewidth="280" ftdestination="/images/promotile/imgHorizontal" /> <cfproperty ftseq="12" ftfieldset="Badge Image" name="imgVertical" type="string" hint="Vertical promotional tile." required="false" default="" ftlabel="Vertical Tile" fttype="image" ftimagewidth="144" ftdestination="/images/promotile/imgVertical" /> <!------------------------------------------------------------------------ object methods -------------------------------------------------------------------------> </cfcomponent>
Webtop Administration
webtop XML config
Just using the standard scaffold export here. Obviously this is something you would update or integrate into the overall webtop strategy for the client.
<?xml version="1.0" encoding="utf-8"?> <webtop> <section mergeType="merge" id="thisSection" label="Custom Content" labelType="value"> <subsection mergeType="merge" id="thisSubSection" label="Custom Content" labelType="value"> <menu mergeType="merge" id="thisMenu" label="Custom Content" labelType="value"> <menuitem mergeType="merge" id="bslPromoTileMenuItem" label="bslPromoTile" link="/admin/customadmin.cfm?module=customlists/bslPromoTile.cfm" /> </menu> </subsection> </section> </webtop>
Admin Grid
This is pretty close to the type of master drill down you could get from the scaffold. These things are so easy to whip up, change and finesse its hardly worth hitting the scaffold button.
<cfsetting enablecfoutputonly="true" /> <cfimport taglib="/farcry/core/tags/formtools" prefix="ft" /> <cfimport taglib="/farcry/core/tags/admin/" prefix="admin" /> <!--- set up page header ---> <admin:header title="Promotion Tiles" /> <ft:objectAdmin title="Promotion Tiles" typename="bslPromoTile" ColumnList="title,datetimelastupdated,imgHorizontal" SortableColumns="title,datetimelastupdated" lFilterFields="title" sqlorderby="" /> <admin:footer /> <cfsetting enablecfoutputonly="false" />
Webskins
Only need a couple of different teasers for the contributor to choose from; horizontal tile and vertical tile displays.
The only unusual thing here is the use of ft:object to get hold of the image. This is a nice little short cut using formtools and the display output instead of having to workout the HTML I just get the formtool machinery to do it for me.
<cfsetting enablecfoutputonly="true" /> <!-------------------------------------------------------------------- bslPromoTile: displayTeaserHorizontal.cfm ---------------------------------------------------------------------> <!--- @@displayname: Horizontal Image Tile ---> <!--- @@author: Geoff Bowers (modius@daemon.com.au) ---> <!--- @@description: Horizontal promotional tile image; typically used top of home page. ---> <!--- import tag libraries ---> <cfimport prefix="skin" taglib="/farcry/core/tags/webskin" /> <cfimport prefix="ft" taglib="/farcry/core/tags/formtools" /> <ft:object stobject="#stobj#" format="display" r_stfields="stfields" /> <cfoutput><div class="promo horizontal"></cfoutput> <cfif len(stobj.linkNavigation)> <skin:buildlink objectid="#stobj.linkNavigation#"> <cfoutput>#stfields.imgHorizontal.html#</cfoutput> </skin:buildlink> <cfelse> <cfoutput><a href="#stobj.linkExternal#">#stfields.imgHorizontal.html#</a></cfoutput> </cfif> <cfoutput></div></cfoutput> <cfsetting enablecfoutputonly="false" />
<cfsetting enablecfoutputonly="true" /> <!-------------------------------------------------------------------- bslPromoTile: displayTeaserVertical.cfm ---------------------------------------------------------------------> <!--- @@displayname: Vertical Image Tile ---> <!--- @@author: Geoff Bowers (modius@daemon.com.au) ---> <!--- @@description: Vertical promotional tile image; typically used in side bar. ---> <!--- import tag libraries ---> <cfimport prefix="skin" taglib="/farcry/core/tags/webskin" /> <cfimport prefix="ft" taglib="/farcry/core/tags/formtools" /> <ft:object stobject="#stobj#" format="display" r_stfields="stfields" /> <cfoutput><div class="promo vertical"></cfoutput> <cfif len(stobj.linkNavigation)> <skin:buildlink objectid="#stobj.linkNavigation#"> <cfoutput>#stfields.imgVertical.html#</cfoutput> </skin:buildlink> <cfelse> <cfoutput><a href="#stobj.linkExternal#">#stfields.imgVertical.html#</a></cfoutput> </cfif> <cfoutput></div></cfoutput> <cfsetting enablecfoutputonly="false" />
Extending Hand-Picked Rule
There is a useful publishing rule available in the FarCry CMS Plugin called "Hand Picked Rule". This allows you to hand-pick a specific content type for inclusion on a page using a specific teaser display. However, the hand-picked rule needs to be told which content types are eligible to be picked. As your bslPromoTile content type is brand-new you'll need to override the default list of content types and add your own.
You can override the behaviour of an existing rule in the core code base or any plugin by referencing and extending the rule from within your project code base.
<cfcomponent displayname="Utility: Handpicked Rule" extends="farcry.plugins.farcrycms.packages.rules.rulehandpicked" hint="Hand-pick and display individual content items with a specified displayTeaser* handler."> <cfproperty ftSeq="2" ftFieldSet="Selected Objects" name="aObjects" type="array" ftJoin="dmEvent,dmFacts,dmFlash,dmFile,dmImage,dmInclude,dmLink,dmNews,dmHTML,bslPromoTile" ftLabel="Select Objects" /> </cfcomponent>
Note that you only need to specify the specific properties that you want to override.