Themes
Page Templates Reference for Mustache page templates that control the layout of key Print Store pages.
Page templates are Mustache HTML files stored in the page-templates/ folder of your theme. They control the layout and presentation of specific storefront pages — shopping cart, account dashboard, order options, and more. PrintNow renders these templates server-side, injecting data variables before sending the HTML to the browser.
Page templates use Mustache syntax:
Syntax Description Example {{ variable }}Output a value (HTML-escaped). {{ Name }}{{{ variable }}}Output raw HTML (unescaped). {{{ CmsContent }}}{{ #section }} ... {{ /section }}Conditional block — renders if value is truthy. Also used for loops over arrays. {{ #Items }} ... {{ /Items }}{{ ^section }} ... {{ /section }}Inverted block — renders if value is falsy or empty. {{ ^CartEmpty }} ... {{ /CartEmpty }}{{ . }}Current item in a loop or section. {{ #Comments }}{{ . }}{{ /Comments }}{{ ! comment }}Comment — not rendered in output. {{ ! if cart is empty }}
Template for the My Account dashboard page (/my-account). Displays a welcome message and navigation cards for account sections.
Variable Type Description CmsContentHTML (raw) CMS content configured for the My Account page. Use triple braces: {{{ CmsContent }}} userfirstnameString Logged-in customer's first name. userlastnameString Logged-in customer's last name. usernameString Logged-in customer's username. MyOrdersTitleString Label for the orders section (translatable). myordersurlString URL to the orders page. myorderscountNumber Count of customer orders. MyOrdersExistBoolean True if the customer has orders. Use as section: {{ #MyOrdersExist }} MyProjectsTitleString Label for the projects section. myprojectsurlString URL to the projects page. myprojectscountNumber Count of saved projects. MyProjectsExistBoolean True if the customer has saved projects. MyImagesTitleString Label for the images section. myimagesurlString URL to the images page. myimagescountNumber Count of uploaded images. MyImagesExistBoolean True if the customer has uploaded images. MyApprovalsTitleString Label for the approvals section. myapprovalsurlString URL to the approvals page. myapprovalscountNumber Count of orders pending approval. MyApprovalsExistBoolean True if the customer has pending approvals. myinfourlString URL to the account info page.
< h4 >Welcome, {'{{'} userfirstname {'}}'}!</ h4 >
{'{{{'} CmsContent {'}}}'}
< a href = "{'{{'} myordersurl {'}}'}" >
My Orders
{'{{'} #MyOrdersExist {'}}'}< span class = "badge" >{'{{'} myorderscount {'}}'}</ span >{'{{'} /MyOrdersExist {'}}'}
</ a >
Template for the Shopping Cart page (/view-cart). Displays cart items with thumbnails, descriptions, quantities, pricing, and checkout actions.
Variable Type Description CartEmptyBoolean True when the cart has no items. Use to show empty cart message. PageContentHTML (raw) CMS content for the cart page. SubTotalString Formatted cart subtotal. ItemsArray Array of cart line items (see below).
Variable Type Description ItemIdInteger Cart line item ID. Used by edit/delete buttons via data-item attribute. ProductIdInteger Product ID. Used for thumbnail URLs. NameString Product name. CategoryString Parent category name. DescriptionHTML (raw) Product description HTML. QuantityString Order quantity. PriceString Formatted line item price. ProductTypeString Product type label. CommentsString Customer comments/notes for this item. IsDataListBoolean True if this item is a data list (mailing list). ListNameString Data list name (when IsDataList is true). ListCountNumber Number of records in the data list. OptionsArray Selected product options. Each has Name and Value. ImageFeeBoolean True if a premium image fee applies.
The view cart template uses special CSS classes that PrintNow's JavaScript binds to for button actions:
CSS Class Action custom-deleteRemoves the cart item. Requires data-item="{{ ItemId }}" attribute. custom-editOpens the item for editing. Requires data-item="{{ ItemId }}" attribute. custom-checkoutProceeds to checkout. custom-continueReturns to continue shopping.
Template for the Order Options page (/order-options). Displayed after file upload or editor, showing an order preview with the calculator, proof download, and approval checkbox.
Variable Type Description PageContentHTML (raw) CMS content for the page. IdInteger Product ID (used for thumbnail URL). NameString Product name. DescriptionString Product description. CalculatorHTML (raw) Rendered pricing calculator. Use triple braces: {{{ Calculator }}} CommentsString Existing customer comments. NeedsApprovalBoolean True if the product requires approval before production. CanEditBoolean True if the item can be re-edited. ShowProofBoolean True if a PDF proof is available for download. ShowCommentsBoolean True if the comments field should be displayed. ticksString Cache-busting timestamp for thumbnail URLs.
CSS Class Action custom-editReturns to the editor to modify the design. custom-proofDownloads the low-resolution PDF proof. custom-approvalCheckbox input for order approval confirmation. custom-commentsTextarea for customer comments/notes. custom-cancelCancels and returns to the previous page. custom-nextProceeds to the next checkout step.
Template for the All Products page (/products). Displays a grid of categories with their sub-category links and thumbnails.
Variable Type Description categoryArray Array of category objects to display.
Variable Type Description idInteger Category ID. nameString Category display name. subcategoryArray Array of sub-categories, each with name and url.
{'{{'} #category {'}}'}
< div class = "col-md-6" >
< div class = "card mb-4" >
< div class = "card-header" >{'{{'} name {'}}'}</ div >
< div class = "card-body" >
< img src = "/thumbnails/c/{'{{'} id {'}}'}?width=400&height=400&fit=fill" alt = "{'{{'} name {'}}'}" class = "img-fluid" />
< ul >
{'{{'} #subcategory {'}}'}
< li >< a href = "{'{{'} url {'}}'}" >{'{{'} name {'}}'}</ a ></ li >
{'{{'} /subcategory {'}}'}
</ ul >
</ div >
</ div >
</ div >
{'{{'} /category {'}}'}
Template for Landing Pages (/your-landing-page-url). Controls the layout of landing pages created in Content > Landing Pages. If this template exists in your theme's page-templates/ folder, it replaces the default card-based layout for all landing pages.
Variable Type Description PageContentHTML (raw) CMS content configured for the landing page. Use triple braces: {{{ PageContent }}} ChildrenArray All child items (categories, landing pages, and groups) sorted by display order. Each has name, url, thumbnail.url, and isGroup. CategoriesArray Only the category-type children. PagesArray Only the landing page-type children. GroupsArray Only the group-type children. Each group has a nested children array containing its own categories and landing pages.
Variable Type Description nameString Display name (category name, landing page title, or group name). urlString SEO-friendly URL to the category or landing page. Empty for groups. thumbnail.urlString Thumbnail image URL. Append ?width=200&height=200 for sizing. isGroupBoolean True if the item is a group container. Use {{ #isGroup }} / {{ ^isGroup }} for conditional rendering. childrenArray Nested child items (only present on group items).
{'{{{'} PageContent {'}}}'}
{'{{'} #Children {'}}'}
{'{{'} #isGroup {'}}'}
< div class = "group-panel" >
< h4 >{'{{'} name {'}}'}</ h4 >
< div class = "row" >
{'{{'} #children {'}}'}
< div class = "col-md-4" >
< a href = "{'{{'} url {'}}'}" >
< img src = "{'{{'} thumbnail.url {'}}'}?width=200&height=200" alt = "{'{{'} name {'}}'}" />
< span >{'{{'} name {'}}'}</ span >
</ a >
</ div >
{'{{'} /children {'}}'}
</ div >
</ div >
{'{{'} /isGroup {'}}'}
{'{{'} ^isGroup {'}}'}
< div class = "col-md-4" >
< a href = "{'{{'} url {'}}'}" >
< img src = "{'{{'} thumbnail.url {'}}'}?width=200&height=200" alt = "{'{{'} name {'}}'}" />
< span >{'{{'} name {'}}'}</ span >
</ a >
</ div >
{'{{'} /isGroup {'}}'}
{'{{'} /Children {'}}'}
Template for the File Upload page. Controls the layout of the print-ready file upload interface. This is a larger template with variables for file handling, size selection, and upload progress. Customize the upload.mustache file in your theme's page-templates/ folder.
Theme Structure — Where page-templates/ fits in the theme folder layout
Calculator — The pricing calculator embedded in order-options.mustache
Page Content — Manage the CMS content injected into page template variables
Landing Pages — Configure landing pages rendered by landing-page.mustache