Commandbox-ssg with data and updated pagination support
Commandbox-ssg now with data import and pagination enhancements
January 17, 2024 / Robert Zehnder
In the tech world, it's always exciting to see tools evolve, and the latest update to commandbox-ssg
is no exception. This update introduces some key enhancements, primarily focused on integrating external data into applications with greater ease and efficiency. Let's delve into what this means for developers.
Enhanced Data Integration
One of the standout features in this update is the automated data loading capability. Now, any data residing in the _data/
directory is automatically loaded and made accessible in the collections.global
scope, named according to the file name. For instance, a file named _data/myData.json
becomes readily available in views as collections.global.myData
. This is a significant step towards simplifying data management, although the current version does not support nested directories. However, plans are underway to incorporate this feature.
Advanced Pagination Capabilities
Pagination has received a substantial upgrade. commandbox-ssg
now supports pagination through arrays and objects within the collections
scope. To illustrate, consider the following example that demonstrates generating pages based on post tags:
<!---
layout: main
view: page
permalink: /tag/{{tag}}.html
pagination:
alias: tag
data: collections.tags
--->
<cfoutput>
<h4>Posts tagged as #prc.tag#</h4>
<cfloop array="#collections.byTag[generateSlug(prc.tag)]#" index="i">
<p><a href="#i.permalink#" class="post-link text-decoration-none">#i.title#</a></p>
</cfloop>
</cfoutput>
When dealing with paginated templates, there are several nuances to consider:
- The default return value for paged data is
pagedData
if no alias is set. - Data can be specified either using Yaml or directly within the
collections
scope. - A permalink is crucial for correct page generation.
Dynamic tokens in permalinks offer flexibility in content generation. In this case, the pagination of collections.tags
data utilizes the {{tag}}
alias for permalink generation. In the absence of a set alias, pagedData
would be used by default.
Paginating through structures yields an array of struct keys, providing immediate access to the data of the current element.
Practical Application: The CFDocs Site
A prime example of these capabilities in action is the CFDocs site. Organized in JSON files named by function/tag, the site demonstrates the ease of creating templates to display data. Here's a sample JSON structure from the abs.json
file:
{
"name":"abs",
"type":"function",
"syntax":"abs(number)",
"returns":"numeric",
"related":["sgn"],
"description":" Absolute-value function. The absolute value of a number is\n the number without its sign.",
"params": [
{"name":"number","description":"","required":true,"default":"","type":"numeric","values":[]}
],
"engines": {
"coldfusion": {"minimum_version":"", "notes":"", "docs":"https://helpx.adobe.com/coldfusion/cfml-reference/coldfusion-functions/functions-a-b/abs.html"},
"lucee": {"minimum_version":"", "notes":"", "docs":"https://docs.lucee.org/reference/functions/abs.html"},
"railo": {"minimum_version":"", "notes":"", "docs":"http://railodocs.org/index.cfm/function/abs"},
"openbd": {"minimum_version":"", "notes":"", "docs":"http://openbd.org/manual/?/function/abs"}
},
"links": [],
"examples": [
{
"title":"Absolute Value of -4.3",
"description":"",
"code":"abs(-4.3)",
"result":"4.3",
"runnable":true
}
]
}
By integrating all CFDocs data files into the _data
directory, one could leverage pagination to generate comprehensive documentation while maintaining the directory structure.
<!---
type: docs
permalink: /{{element}}.html
pagination:
data: collections.global
alias: element
--->
<cfoutput>
<cfdump var="#prc#"/>
</cfoutput>
While the system still has room for refinement, its current iteration is both functional and efficient, capable of generating over 990 templates in under 30 seconds.
Deployment
These updates are set to go live with the release of version 0.0.17 of commandbox-ssg
. This marks a significant milestone in the tool's development, offering developers enhanced capabilities for managing and displaying data in their applications.