Mustache Templates
Mustache Functions
If you're using templates to render out your content, you have a few helper methods to format the data how you want it.
Calling JavaScript Functions in a Template
Be sure to read through the Mustache docs on GitHub. You can call JavaScript functions and methods within your template by following the syntax.
Assuming you had 5 related products, this example:
Total related products: {{#products.length}}{{/products.length}}
Would output:
Total related products: 5
Conditionals
Mustache doesn't have conditionals, but JavaScript will interpret truthy and falsy values based on a functions return value. Most commonly, you'll only want to display a list of items if there's more than one. You could that like this:
{{#products.length}} ... {{/products.length}}
Image Size Helper
At some point, you might want to render an image of relatable. Since the API hands you back the original image, you'll likely want to fetch a different size to save on download times.
<img src="{{#img_url.small}}{{image.src}}{{/img_url.small}}">
Outputs
<img src="//cdn.shopify.com/.../potatoes_small.jpg?123...">
Money Helper
Format currency based on the settings within your shop. This methods relies on the fact that the options_selection.js file is loaded first.
<!-- You only need this if not already loaded --> {{ 'option_selection.js' | shopify_asset_url | script_tag }} <!-- Get the first variant's price formatted --> {{#product}} <span class="price">{{#money}}{{variants.0.price}}{{/money}}</span> {{/product}}
Outputs:
<span class="price">$55.00</span>
On Sale
You can check if a product is on sale with the on sale helper method:
{{#on_sale}}On Sale!{{/on_sale}}
Custom Helpers
You can define your own Mustache helpers by adding it to the Mustache.helpers
object. You must define this object after the Relatable object has been defined and before the network request happens, which normally means putting this just before loading the relatable.js script. Learn more about Mustache Functions.
Relatable.helpers = { moneyWithoutTrailingZeros: function() { return function(price, render) { var price = render(price); return "$" + price.split(".")[0]; } } }
You can then use that function by the usual syntax:
{{#moneyWithoutTrailingZeros}}{{ variants.0.price }}{{/moneyWithoutTrailingZeros}}
Events
We dispatch events when Mustache has rendered a Relatable section. The event is fired on the container and bubbles up the DOM.
<script> $(document).on('relatable:rendered', function(event) { // Run custom code console.log(event.target); // will be node of container }); </script>