Logic
From Shopify Wiki
(→Operators) |
|||
| (9 intermediate revisions not shown) | |||
| Line 1: | Line 1: | ||
Logic are conditional Liquid statements. | Logic are conditional Liquid statements. | ||
| - | ===Example of a logic statement=== | + | === Example of a logic statement === |
| - | Lets say we are working on product.liquid template and want to display the message | + | Lets say we are working on product.liquid template and want to display the message "Free shipping", but only on products whose price is greater than $100. Since the product will either have a price greater than $100 or less than $100, the if logic statement is the most appropriate statement to use... |
| - | <pre> | + | <pre>{% if product.price > 100 %} |
| - | {% if product.price | + | |
Free Shipping | Free Shipping | ||
| - | {% | + | {% else %} |
No free shipping | No free shipping | ||
| - | {% end | + | {% end if %}</pre> |
| - | </pre> | + | |
| - | + | ||
Notice how we use the {% %} logic tags and not the {{ }} output tags | Notice how we use the {% %} logic tags and not the {{ }} output tags | ||
| - | ===Operators=== | + | === Operators === |
| + | |||
You can use different operators when using logic statements... | You can use different operators when using logic statements... | ||
| - | * '''< | + | |
| - | + | * '''==''' - Equal | |
| - | + | * '''!=''' - Not equal | |
| - | * '''< | + | * '''>''' - Bigger than |
| - | * '''< | + | * '''<''' - Smaller than |
| + | * '''>=''' - Bigger than or equal | ||
| + | * '''<=''' - Less than or equal | ||
| + | * '''or''' - either this or that | ||
| + | * '''and''' - must be this and that | ||
| + | |||
| + | === If/Else Logic === | ||
| + | |||
| + | You can use use 3 statements inside of your if statement: {% if %}, {% elsif %} or {% else %}. Let's go through some examples: | ||
| + | |||
| + | Simple if statement | ||
| + | |||
| + | <pre>{% if product.price > 5000 %} | ||
| + | Free shipping | ||
| + | {% endif %}</pre> | ||
| + | if/else statement | ||
| + | |||
| + | <pre>{% if product.available %} | ||
| + | This product is available | ||
| + | {% else %} | ||
| + | Sorry, this product is not available | ||
| + | {% endif %}</pre> | ||
| + | if/elseif/else statement | ||
| + | |||
| + | <pre>{% if product.price > 5000 %} | ||
| + | Free shipping | ||
| + | {% elsif product.price == 5000 %} | ||
| + | half price shipping | ||
| + | {% else %} | ||
| + | Shipping is $20 | ||
| + | {% endif %}</pre> | ||
| + | === Case Statements === | ||
| + | |||
| + | If you need to test more than one condition. Here is the liquid syntax: | ||
| + | |||
| + | <pre>{% case condition %} | ||
| + | {% when 1 %} | ||
| + | red | ||
| + | {% when 2 %} | ||
| + | blue | ||
| + | {% else %} | ||
| + | green | ||
| + | {% endcase %} </pre> | ||
| + | Example case statement... | ||
| + | |||
| + | <pre>{% case template %} | ||
| + | {% when 'index' %} | ||
| + | Welcome | ||
| + | {% when 'product' %} | ||
| + | {{ product.vendor | link_to_vendor }} / {{ product.title }} | ||
| + | {% else %} | ||
| + | {{ page_title }} | ||
| + | {% endcase %}</pre> | ||
| + | === Cycle === | ||
| + | |||
| + | If you need to alternate between things. Example of a cycle statement.... | ||
| + | |||
| + | <pre>{% cycle 'one', 'two', 'three' %} | ||
| + | |||
| + | {% cycle 'one', 'two', 'three' %} | ||
| + | |||
| + | {% cycle 'one', 'two', 'three' %} | ||
| + | |||
| + | {% cycle 'one', 'two', 'three' %} </pre> | ||
| + | <pre class="output">one | ||
| + | two | ||
| + | three | ||
| + | one</pre> | ||
| + | You can give a cycle a group name. This is useful if you use multiple cycles in your template... | ||
| + | |||
| + | <pre>{% cycle 'group 1': 'one', 'two', 'three' %} | ||
| + | |||
| + | {% cycle 'group 1': 'one', 'two', 'three' %} | ||
| + | |||
| + | {% cycle 'group 2': 'one', 'two', 'three' %} | ||
| + | |||
| + | {% cycle 'group 2': 'one', 'two', 'three' %} </pre> | ||
| + | <pre class="output">one | ||
| + | two | ||
| + | one | ||
| + | two</pre> | ||
| + | === For Loop === | ||
| + | |||
| + | A loop is used when you need to repeat something multiple times. Here is an example of the liquid syntax | ||
| + | |||
| + | <pre>{% for item in array %} | ||
| + | do something | ||
| + | {% endfor %} </pre> | ||
| + | There is also some loop objects you can use to help style your layout | ||
| + | |||
| + | * '''forloop.length''' - length of the entire for loop | ||
| + | * '''forloop.index''' - index of the current iteration | ||
| + | * '''forloop.index0''' - index of the current iteration (zero based) | ||
| + | * '''forloop.rindex''' - how many items are still left? | ||
| + | * '''forloop.rindex0''' - how many items are still left? (zero based) | ||
| + | * '''forloop.first''' - is this the first iteration? | ||
| + | * '''forloop.last''' - is this the last iteration? | ||
| + | |||
| + | You can use 2 attributes to change how your loop works: | ||
| + | |||
| + | * '''Limit''' - restricts the number of times the loop repeats | ||
| + | * '''Offset''' - lets you start the loop on whatever number you want | ||
| + | |||
| + | Lets say we are viewing a collection with a total of 5 products (a,b,c,d,e). Using the example below... | ||
| + | |||
| + | <pre>{% for product in collections.frontpage.products limit:2 offset:2 %} | ||
| + | Product Name: {{ product.name }} | ||
| + | {% endfor %}</pre> | ||
| + | <pre class="output">Product Name: c | ||
| + | Product Name: d</pre> | ||
| + | We can also define a range of numbers to loop through. The range can be define literally or variable numbers. Here is an example if item.quantity is 4... | ||
| + | |||
| + | <pre>{% for i in (1..item.quantity) %} | ||
| + | '''Bold text'''{{ i }} | ||
| + | {% endfor %}</pre> | ||
| + | <pre class="output">1, 2, 3, 4</pre> | ||
| + | === Tables === | ||
| + | |||
| + | Liquid can automatically generate table row and cells. Use this syntax: | ||
| + | |||
| + | <pre>{% tablerow product in collection.frontpage cols: 3 limit: 12 %} | ||
| + | {{ product.name }} | ||
| + | {% endtablerow %}</pre> | ||
| + | There are two attributes you can use with tablerow | ||
| + | |||
| + | * '''Limit:''' limits the number of whatever you are generating (in the exampel above it's products) | ||
| + | * '''Cols:''' specifies the number of columns you want in your table | ||
| + | |||
| + | <br /> | ||
| + | You can also use a series of tablerowloop objects to help style your design: | ||
| + | |||
| + | * '''tablerowloop.length''' - length of the entire for loop | ||
| + | * '''tablerowloop.index''' - index of the current iteration | ||
| + | * '''tablerowloop.index0''' - index of the current iteration (zero based) | ||
| + | * '''tablerowloop.rindex''' - how many items are still left? | ||
| + | * '''tablerowloop.rindex0''' - how many items are still left? (zero based) | ||
| + | * '''tablerowloop.first''' - is this the first iteration? | ||
| + | * '''tablerowloop.last''' - is this the last iteration? | ||
| + | * '''tablerowloop.col''' - index of column in the current row | ||
| + | * '''tablerowloop.col0'''- index of column in the current row (zero based) | ||
| + | * '''tablerowloop.col_first''' - is this the first column in the row? | ||
| + | * '''tablerowloop.col_last''' - is this the last column in the row? | ||
| + | |||
| + | Example on how to use tablerowloop.col_first: | ||
| + | |||
| + | <pre>{% tablerow product in collections.frontpage.products cols: 3 %} | ||
| + | {% if col_first %} | ||
| + | This is the first column | ||
| + | {% else %} | ||
| + | This is not the first column | ||
| + | {% endif %} | ||
| + | {% endtablerow %}</pre> | ||
| + | === Variable Assignment === | ||
| + | |||
| + | You can store data in your own variables to be used in output or other tags. The easiest way to create a variable is the assign tag which looks like this... | ||
| + | |||
| + | <pre>{% assign name = 'bananas' %} | ||
| + | {% for product in collections.frontpage.products %} | ||
| + | {% if product.title == name %} | ||
| + | The product name matches my variable! | ||
| + | {% endif %} | ||
| + | {% endfor %}</pre> | ||
| + | You can also store a true or false value in your variable: | ||
| + | |||
| + | <pre> {% assign bananas = false %} | ||
| + | |||
| + | {% for product in collections.frontpage.products %} | ||
| + | {% if product.name == 'bananas' %} | ||
| + | {% assign bananas = true %} | ||
| + | {% endif %} | ||
| + | {% endfor %} | ||
| + | |||
| + | {% if bananas %} | ||
| + | Yes we have a banana! | ||
| + | {% endif %} </pre> | ||
| + | You can also store a number in a variable with assign: | ||
| + | |||
| + | <pre> {% assign number = 3 %} | ||
| + | |||
| + | {% for product in collections.frontpage.products %} | ||
| + | {% if forloop.index == number %} | ||
| + | This is the 3rd iteration! | ||
| + | {% endif %} | ||
| + | {% endfor %} </pre> | ||
| + | If you want to combine a number of strings into a single string and save it to a variable, you can do that with the capture tag. This tag is a block which "captures" whatever is rendered inside it and assigns it to the given variable instead of rendering it to the screen. Here's how it works: | ||
| + | |||
| + | <pre>{% capture attribute_name %}{{ product.title | handleize }}-{{ i }}-color{% endcapture %} | ||
| + | <label for="{{ attribute_name }}">Color:</label> | ||
| + | <select name="attributes[{{ attribute_name }}]" id="{{ attribute_name }}"> | ||
| + | <option value="red">Red</option> | ||
| + | <option value="green">Green</option> | ||
| + | <option value="blue">Blue</option> | ||
| + | </select></pre> | ||
| + | '''Note''': what you store in a variable using '''capture''' is always a string (text). You have to remember this! | ||
| + | |||
| + | <pre> {% capture value %}10{% endcapture %} | ||
| + | {% if value == 10 %} | ||
| + | This will never be output. | ||
| + | {% endif %} | ||
| + | {% if value == '10' %} | ||
| + | This will be output. | ||
| + | {% endif %}</pre> | ||
Revision as of 17:25, 20 December 2011
Logic are conditional Liquid statements.
Contents |
Example of a logic statement
Lets say we are working on product.liquid template and want to display the message "Free shipping", but only on products whose price is greater than $100. Since the product will either have a price greater than $100 or less than $100, the if logic statement is the most appropriate statement to use...
{% if product.price > 100 %}
Free Shipping
{% else %}
No free shipping
{% end if %}
Notice how we use the {% %} logic tags and not the {{ }} output tags
Operators
You can use different operators when using logic statements...
- == - Equal
- != - Not equal
- > - Bigger than
- < - Smaller than
- >= - Bigger than or equal
- <= - Less than or equal
- or - either this or that
- and - must be this and that
If/Else Logic
You can use use 3 statements inside of your if statement: {% if %}, {% elsif %} or {% else %}. Let's go through some examples:
Simple if statement
{% if product.price > 5000 %}
Free shipping
{% endif %}
if/else statement
{% if product.available %}
This product is available
{% else %}
Sorry, this product is not available
{% endif %}
if/elseif/else statement
{% if product.price > 5000 %}
Free shipping
{% elsif product.price == 5000 %}
half price shipping
{% else %}
Shipping is $20
{% endif %}
Case Statements
If you need to test more than one condition. Here is the liquid syntax:
{% case condition %}
{% when 1 %}
red
{% when 2 %}
blue
{% else %}
green
{% endcase %}
Example case statement...
{% case template %}
{% when 'index' %}
Welcome
{% when 'product' %}
{{ product.vendor | link_to_vendor }} / {{ product.title }}
{% else %}
{{ page_title }}
{% endcase %}
Cycle
If you need to alternate between things. Example of a cycle statement....
{% cycle 'one', 'two', 'three' %}
{% cycle 'one', 'two', 'three' %}
{% cycle 'one', 'two', 'three' %}
{% cycle 'one', 'two', 'three' %}
one two three one
You can give a cycle a group name. This is useful if you use multiple cycles in your template...
{% cycle 'group 1': 'one', 'two', 'three' %}
{% cycle 'group 1': 'one', 'two', 'three' %}
{% cycle 'group 2': 'one', 'two', 'three' %}
{% cycle 'group 2': 'one', 'two', 'three' %}
one two one two
For Loop
A loop is used when you need to repeat something multiple times. Here is an example of the liquid syntax
{% for item in array %}
do something
{% endfor %}
There is also some loop objects you can use to help style your layout
- forloop.length - length of the entire for loop
- forloop.index - index of the current iteration
- forloop.index0 - index of the current iteration (zero based)
- forloop.rindex - how many items are still left?
- forloop.rindex0 - how many items are still left? (zero based)
- forloop.first - is this the first iteration?
- forloop.last - is this the last iteration?
You can use 2 attributes to change how your loop works:
- Limit - restricts the number of times the loop repeats
- Offset - lets you start the loop on whatever number you want
Lets say we are viewing a collection with a total of 5 products (a,b,c,d,e). Using the example below...
{% for product in collections.frontpage.products limit:2 offset:2 %}
Product Name: {{ product.name }}
{% endfor %}
Product Name: c Product Name: d
We can also define a range of numbers to loop through. The range can be define literally or variable numbers. Here is an example if item.quantity is 4...
{% for i in (1..item.quantity) %}
'''Bold text'''{{ i }}
{% endfor %}
1, 2, 3, 4
Tables
Liquid can automatically generate table row and cells. Use this syntax:
{% tablerow product in collection.frontpage cols: 3 limit: 12 %}
{{ product.name }}
{% endtablerow %}
There are two attributes you can use with tablerow
- Limit: limits the number of whatever you are generating (in the exampel above it's products)
- Cols: specifies the number of columns you want in your table
You can also use a series of tablerowloop objects to help style your design:
- tablerowloop.length - length of the entire for loop
- tablerowloop.index - index of the current iteration
- tablerowloop.index0 - index of the current iteration (zero based)
- tablerowloop.rindex - how many items are still left?
- tablerowloop.rindex0 - how many items are still left? (zero based)
- tablerowloop.first - is this the first iteration?
- tablerowloop.last - is this the last iteration?
- tablerowloop.col - index of column in the current row
- tablerowloop.col0- index of column in the current row (zero based)
- tablerowloop.col_first - is this the first column in the row?
- tablerowloop.col_last - is this the last column in the row?
Example on how to use tablerowloop.col_first:
{% tablerow product in collections.frontpage.products cols: 3 %}
{% if col_first %}
This is the first column
{% else %}
This is not the first column
{% endif %}
{% endtablerow %}
Variable Assignment
You can store data in your own variables to be used in output or other tags. The easiest way to create a variable is the assign tag which looks like this...
{% assign name = 'bananas' %}
{% for product in collections.frontpage.products %}
{% if product.title == name %}
The product name matches my variable!
{% endif %}
{% endfor %}
You can also store a true or false value in your variable:
{% assign bananas = false %}
{% for product in collections.frontpage.products %}
{% if product.name == 'bananas' %}
{% assign bananas = true %}
{% endif %}
{% endfor %}
{% if bananas %}
Yes we have a banana!
{% endif %}
You can also store a number in a variable with assign:
{% assign number = 3 %}
{% for product in collections.frontpage.products %}
{% if forloop.index == number %}
This is the 3rd iteration!
{% endif %}
{% endfor %}
If you want to combine a number of strings into a single string and save it to a variable, you can do that with the capture tag. This tag is a block which "captures" whatever is rendered inside it and assigns it to the given variable instead of rendering it to the screen. Here's how it works:
{% capture attribute_name %}{{ product.title | handleize }}-{{ i }}-color{% endcapture %}
<label for="{{ attribute_name }}">Color:</label>
<select name="attributes[{{ attribute_name }}]" id="{{ attribute_name }}">
<option value="red">Red</option>
<option value="green">Green</option>
<option value="blue">Blue</option>
</select>
Note: what you store in a variable using capture is always a string (text). You have to remember this!
{% capture value %}10{% endcapture %}
{% if value == 10 %}
This will never be output.
{% endif %}
{% if value == '10' %}
This will be output.
{% endif %}
