Horizontal/Vertical looper code for ColdFusion. Download here.
<!--- default DW paging code ---> <cfset CurrentPage=GetFileFromPath(GetTemplatePath())> <cfparam name="PageNum_rs" default="1"> <!--- If passing rows/columns dynamically, set up defaults and validate them ---> <cfparam name="url.rows" default="4"> <cfparam name="url.columns" default="2"> <cfparam name="url.vertical" default="false"> <cfif val(url.columns) LT 1> <cfset url.columns = 1> </cfif> <cfif val(url.rows) LT 1> <cfset url.rows = 1> </cfif> <cfscript> // Horizontal looper block 1 -- set up array, row and column values HLoop_rs = ArrayNew(2); HLoop_rs_rows = url.rows; // hard-coded number or variable HLoop_rs_columns = url.columns; // hard-coded number or variable HLoop_rs_vertical = url.vertical; // true/false if(HLoop_rs_vertical EQ true) { HLoop_rs_loopTo = HLoop_rs_rows; }else{ HLoop_rs_loopTo = HLoop_rs_columns; } HLoop_rs_i = 1; HLoop_rs_ii = 1; HLoop_rs_actualrows = 0; </cfscript> <!--- This is the query for the display ---> <cfquery name="rs" datasource="northwind"> SELECT dbo.Products.ProductID, dbo.Products.ProductName, dbo.Products.UnitPrice FROM dbo.Products </cfquery> <!--- Set some bounds for rows if no rowcount is set ---> <cfif (HLoop_rs_rows LT 1)> <cfset HLoop_rs_rows = Ceiling(rs.RecordCount / HLoop_rs_columns)> </cfif> <!--- Default DW paging behaviors, modified slightly for use with HLooper code: The maxrows variable is rows * columns. ---> <cfset MaxRows_rs = HLoop_rs_rows * HLoop_rs_columns> <cfset StartRow_rs=Min((PageNum_rs-1)*MaxRows_rs+1,Max(rs.RecordCount,1))> <cfset EndRow_rs=Min(StartRow_rs+MaxRows_rs-1,rs.RecordCount)> <cfset TotalPages_rs=Ceiling(rs.RecordCount/MaxRows_rs)> <cfset QueryString_rs=Iif(CGI.QUERY_STRING NEQ "",DE("&"&XMLFormat(CGI.QUERY_STRING)),DE(""))> <cfset tempPos=ListContainsNoCase(QueryString_rs,"PageNum_rs=","&")> <cfif tempPos NEQ 0> <cfset QueryString_rs=ListDeleteAt(QueryString_rs,tempPos,"&")> </cfif> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> <title>Horizontal/Vertical Looper for ColdFusion</title> </head> <body> <!--- Looks like a repeat region, but it is saving content into an array using <cfsavecontent> tags ---> <cfoutput query="rs" startRow="#StartRow_rs#" maxrows="#MaxRows_rs#"> <cfsavecontent variable="temp"><!--- Anything within <cfsavecontent> tags gets repeated in the table display ---> <!--- Horizontal Looper block 2 ---> <div style="border:1px solid red; background-color:##FFFFCC; padding:15px; text-align:center; width:250px; height:150px;"> <h2>#rs.ProductID#</h2> <h3>#rs.ProductName#</h3> <p>#LSCurrencyFormat(rs.UnitPrice)#</p> </div> </cfsavecontent> <!--- Calculate when to change rows/columns ---> <cfscript> HLoop_rs[HLoop_rs_i][HLoop_rs_ii] = temp; HLoop_rs_ii = HLoop_rs_ii + 1; if(HLoop_rs_ii GT HLoop_rs_loopTo){ HLoop_rs_i = HLoop_rs_i + 1; HLoop_rs_ii = 1; HLoop_rs_actualrows = HLoop_rs_actualrows + 1; }; if(HLoop_rs_actualrows LTE HLoop_rs_rows AND HLoop_rs_vertical EQ "false") HLoop_rs_rows = HLoop_rs_actualrows + 1; if(HLoop_rs_actualrows LTE HLoop_rs_columns AND HLoop_rs_vertical EQ "true") HLoop_rs_columns = HLoop_rs_actualrows + 1; </cfscript> </cfoutput><!--- Done with HLooper. Content is all saved in array named HLoop_rs---> <form name="form1" method="get" action=""> <table width="200" border="0"> <tr> <td nowrap="nowrap"><p> <input name="rows" type="text" value="<cfoutput>#url.rows#</cfoutput>" size="5"> Rows <br> <input name="columns" type="text" value="<cfoutput>#url.columns#</cfoutput>" size="5"> Columns <br> <input name="vertical" type="radio" value="false" <cfif url.vertical EQ "false">checked</cfif>> Left to right <br> <input name="vertical" type="radio" value="true" <cfif url.vertical EQ "true">checked</cfif>> Up/down </p> </td> <td><input type="submit" name="Submit" value="Submit"></td> <td nowrap="nowrap"><cfoutput> <!--- Standard DW recordset stats ---> <p>Records #StartRow_rs# to #EndRow_rs# of #rs.RecordCount# </p> <!--- Recordset navigation links list ---> <cfscript> TM_counter=0; For (i=1; i LTE rs.Recordcount; i = i + MaxRows_rs) { TM_counter = TM_counter + 1; TM_endCount = Min(rs.Recordcount,i + MaxRows_rs - 1); If(TM_counter NEQ PageNum_rs) { WriteOutput('<a href="#CurrentPage#?PageNum_rs=#TM_counter##QueryString_rs#">#i#-#TM_endCount#</a>'); }Else{ WriteOutput("<b>" & i & "-" & TM_endCount & "</b>"); } If(TM_endCount neq rs.Recordcount) WriteOutput(" | ");} </cfscript> </cfoutput> </td> </tr> </table> </form> <p> <cfscript> // Horizontal Looper block 3 -- fill up array with if nothing in cell if(HLoop_rs_vertical EQ "true") { HLoop_rs_const = HLoop_rs_columns; }else{ HLoop_rs_const = HLoop_rs_rows; } if(HLoop_rs_i LTE HLoop_rs_const) { while(HLoop_rs_ii LTE HLoop_rs_loopTo) { HLoop_rs[HLoop_rs_i][HLoop_rs_ii] = " "; HLoop_rs_ii = HLoop_rs_ii + 1; } } </cfscript> </p> <!--- Finally, display the horizontal/vertical looper ---> <table> <cfloop from=1 to=#HLoop_rs_rows# index="i"> <tr> <cfloop from=1 to=#HLoop_rs_columns# index="ii"> <td><cfoutput> <cfif vertical EQ true> #HLoop_rs[ii][i]# <cfelse> #HLoop_rs[i][ii]# </cfif> </cfoutput></td> </cfloop> </tr> </cfloop> </table> <!--- Standard DW paging stuff ---> <table border="0" width="50%" align="center"> <cfoutput> <tr> <td width="23%" align="center"><cfif PageNum_rs GT 1> <a href="#CurrentPage#?PageNum_rs=1#QueryString_rs#">First</a> </cfif> </td> <td width="31%" align="center"><cfif PageNum_rs GT 1> <a href="#CurrentPage#?PageNum_rs=#Max(DecrementValue(PageNum_rs),1)##QueryString_rs#">Previous</a> </cfif> </td> <td width="23%" align="center"><cfif PageNum_rs LT TotalPages_rs> <a href="#CurrentPage#?PageNum_rs=#Min(IncrementValue(PageNum_rs),TotalPages_rs)##QueryString_rs#">Next</a> </cfif> </td> <td width="23%" align="center"><cfif PageNum_rs LT TotalPages_rs> <a href="#CurrentPage#?PageNum_rs=#TotalPages_rs##QueryString_rs#">Last</a> </cfif> </td> </tr> </cfoutput> </table> </p> </body> </html>