Atenção: Você está entrando em território de desenvolvedor!
Nós recomendamos fortemente que busque ajuda caso não tenha familiaridade com desenvolvimento Web.
Liquid
Liquid é uma linguagem open-source de templates escrita em Ruby. Através da Liquid, os Temas Edools carregam conteúdo dinâmico no front-end das escolas.
O básico
O Liquid usa uma combinação de tags, objetos e filtros para carregar o conteúdo dinâmico. Eles são usados dentro dos arquivos de template, que são um grupo de arquivos que compõe um tema. Para mais informações sobre os templates disponíveis, leia Construindo temas.
Tags
As tags criam a lógica de programação que indica ao template o que fazer.
{% if user.name == ‘elvis’ %}
Hey Elvis
{% endif %}
Objetos
Os objetos contém os atributos usados para carregar o conteúdo dinâmico em uma página.
{{ product.title }}
<!— Nome do Produto —>
Filtros
Filtros são usados para modificar a saída de strings, números, variáveis e objetos.
{{ ‘sales’ | append: ‘.jpg’ }}
<!— Output: sales.jpg —>
Handles
As handles são usadas para acessar os tributos dos objetos. Por padrão, uma handle é o título em caixa baixa do objeto, com hífen (-) no lugar dos espaços e/ou caracteres especiais. A maioria dos objetos no Edools (products, courses, lessons) possuem handles.
Por exemplo, a página com o título “Sobre a escola” pode ser acessada no Liquid através da handle sobre-a-escola
, como mostrado abaixo:
<!— o conteúdo da página Sobre a Escola —>
{{ pages.sobre-a-escola.content }}
Como as handles são criadas
Um produto com o título “Matemática” terá, automaticamente, a handle matematica
. Se já existir uma com o mesmo nome, ela será estendido para matematica-1
, matematica-2
e assim por diante.
Espaços nos títulos são substituídos por hífens nas handles. O título “Este novo curso” se transforma em este-novo-curso
.
A handle também determinar a URL do objeto. Por exemplo, a página com a handle sobre-a-escola
teria a URL http://suaescola.myedools.com/pages/sobre-a-escola
.
Para preservar o design do tema e evitar links quebrados, uma handle não é atualizada automaticamente. Por exemplo, se você deseja alterar o título da página de “Sobre a escola” para “Sobre o Edools”, a handle permanecerá sobre-a-escola
.
Acessando os atributos handle
Em alguns casos, você talvez conheça a handle de um objeto o qual você deseja acessar os atributos. Você pode acessar os atributos plurarizando o nome do objeto, e depois usá-lo com notação de colchetes []
ou ponto .
.
{{ pages.sobre-a-escola.title }}
{{ pages["sobre-a-escola"].title }}
Sobre a escola
Sobre a escola
Perceba que no exemplo usamos pages
e não page
como nome do objeto.
Operadores
O Liquid tem acesso a todos os operadores lógicos e de comparação. Eles podem ser usados nas tags, como if
e unless
.
Operadores básicos
Operador | Significado |
---|---|
== | igual |
!= | diferente de |
> | maior que |
< | menor que |
>= | maior ou igual que |
<= | menor ou igual que |
or | condição A ou condição B |
and | condição A e condição B |
Por exemplo:
{% if product.title == “Curso de Matemática” %}
Esse curso é muito bom!
{% endif %}
Você pode usar mais de um operador em uma tag:
{% if product.type == “Português” or product.type == “Matemática” %}
Este curso é de matemática ou de português.
{% endif %}
O operador contains
Contains verifica a presença de uma substring
dentro de um string
.
{% if product.title contains “Lançamento” %}
O título deste produto contém a palavra “Lançamento”.
{% endif %}
Contains também pode verificar a presença de uma string dentro de um conjunto de strings.
{% if product.tags contains “Promoção”%}
Este produto possui a tag “Promoção”.
{% endif %}
Contains só busca por strings. Você não pode utilizá-lo em um conjunto de objetos.
Tipos
Os objetos Liquid possuem seis tipos diferentes. Você pode puxar as variáveis Liquid através das tags, por atribuição ou captura.
Strings
As strings são declaradas colocando o valor da variável entre aspas simples ou duplas.
{% assign my_string - “Olá, mundo!” %}
Número
Números incluem inteiros e flutuantes.
{% assign my_int = 33 %}
{% assign my_float = 24.346 %}
Boolean
Booleans são true
ou falso
. Não são necessárias aspas ao declarar um boolean.
{% assign foo = true %}
{% assign bar = false %}
Nil
Nil é retornado quando o código Liquid não tem nenhum resultado. Não é uma string com os caracteres “nil”.
Nil é tratado como false
nas condições if
e outras tags Liquid que verificam por true
ou false
.
No exemplo a seguir, se o ID do produto não existe (ou seja, product.id
retorna nil
), o Liquid não irá exibir o texto.
{% if product.id %}
Aqui está o ID do produto.
{% endif %
Tags ou outputs que retornem nil
não exibem nada na página.
ID do Produto: {{ product.id }}
ID do Produto:
Array
Arrays armazenam uma lista lista de variáveis de qualquer tipo.
Acessando itens dentro de um array
Para acessar todos os itens de um array, você pode iterar sobre cada item do array usando uma tag for
ou tablerow
.
{% for tag in product.tags %}
{{ tag }}
{% endfor %}
lançamento matemática exatas enem
Acessando itens específicos de um array
Você pode usar colchetes para acessar um item específico do array. O índice do array começa em zero.
<!— if product.tag = “lançamento”, “matemática”, “exatas”, “enem” —>
{{ site.users[0] }}
{{ site.users[1] }}
{{ site.users[3] }}
lançamento
matemática
exatas
Inicializando arrays
Você não consegue inicializar arrays usando apenas Liquid. Porém, você consegue usar o filtro split para quebrar uma única string em um array de substrings.
EmptyDrop
Um objeto EmptyDrop é retornado se você tentar acessar, através do handle, um objeto excluído (como um página ou um post). No exemplo abaixo, page_1
, page_2
e page_3
são objetos EmptyDrop.
{% assign variable = “hello” %}
{% assign page_1 = pages[variable] %}
{% assign page_2 = pages[“does-not-exist”] %}
{% assign page_3 = pages.this-handle-does-not-exist %}
Os objetos EmptyDrop
possuem apenas um atributo: empty?
. Este atributo sempre retorna true
.
Verificando a existência do objeto
Usando o atributo empty?
, você pode verificar se o objeto existe antes de tentar acessar seus atributos.
% unless pages.about.empty? %}
<!— This will only print if the page with handle “about” is not empty —>
<h1>{{ pages.frontpage.title }}</h1>
<div>{{ pages.frontpage.content }}</div>
{% endunless %}
Se você não verificar a existência do objeto primeiro, é possível que o Liquid injete um um elemento HTML vazio na página.
<h1></h1>
<div></div>
Truthy and falsy
Quando um dado não-boolean é usado neste contexto (verdadeiro ou falso), o Liquid decide se o defini como true
ou false
. Os dados que retornam true
por padrão, neste contexto, são chamados de truthy. Os dados que retornam false
por padrão são chamados de falsy.
Truthy
Todos os valores no Liquid são truthy, exceto nil
e false
.
No exemplo abaixo, o texto “João” não é um boolean, mas é truthy dentro da condicional.
{% assign name = “João” %}
{% if name == true $}
Este texto irá aparecer se `name` for definido.
{% endif %}
Strings vazias são truthy. O exemplo abaixo irá criar um tag HTML vazia se settings.fp_heading
existe porém é vazio.
{% if page.title %}
<h1>{{ page.title }}</h1>
{% endif %}
<h1></h1>
Para evitar que isso aconteça, você deve verificar se a string está vazia, como no exemplo a seguir:
{% unless settings.p_heading == blank %}
<h1>{{ settings.fp_heading }}</h1>
{% endunless %}
Um EmptyDrop também é truthy. No exemplo abaixo, se settings.page
é uma string vazia ou é um objeto oculto ou excluído, você vai acabar com um EmptyDrop. O resultado será uma <div>
vazia.
Para este input:
{% if pages[settings.page] %}
<div>{{ pages[settings.page].content }} </div>
{% endif %}
O output será:
<div></div>
Falsy
Os únicos valores que são falsy são o nil
e o false
.
nil
é retornado quando um objeto Liquid não possui nada para retornar. Por exemplo, se um curso não possui uma imagem de capa, inserir.codigo
retornará nil
. Como nil
é falsy, você pode fazer o seguinte:
{% if inserir.codigo %}
<!— output capa do curso —>
{% endif %}
O valor false
é retornado através de vários objetos liquid, como o inserir.codigo
.
Tags
As tags Liquid
Chamamos de tags Liquid a lógica de programação que indica ao template o que fazer. Tags são inseridas entre os caracteres {%
e %}
.
Algumas tags, como for
e cycle
podem utilizar parâmetros. Os detalhes de cada parâmetro podem ser encontrados em suas respectivas seções.
Tags de controle de fluxo
As tags de controle de fluxo determinam qual bloco de código será executado, de acordo com diferentes condições.
if
Executa um bloco de código se uma determinada condição é atendida.
Input:
{% if product.title == “Curso de Física!” %}
Este curso é de física!
{% endif %}
Output
Este curso é de física!
elsif/else
Adiciona mais condições dentro de uma condição if ou unless.
Input:
<!— Se student.name == ‘anônimo’ —>
{% if student.name == ‘Maria’ %}
Oi, Maria!
{% elsif student.name == ‘anônimo’ %}
Oi, anônimo!
{% else %}
Oi, desconhecido!
{% endif %}
Output:
Oi, anônimo!
case/when
Cria uma declaração switch para comparar uma variável com diferentes valores.case
inicia a declaração switch e when
compara os valores.
Input:
{% assign handle = ‘literatura’ %}
{% case handle %}
{% when ‘literatura’ %}
Estamos falando de literatura.
{% when ‘física’ %}
Estamos falando de física.
{% else %}
Não estamos falando de literatura nem de física.
{% endcase %}
Output:
Estamos falando de literatura.
unless
Similar ao if
, mas executa um bloco de código se uma certa condição não é atendida.
Input:
{% unless product.title == ‘Curso para INSS’ %}
Este curso não é para INSS.
{% endunless %}
Output:
Este curso não é para INSS.
Isso seria a mesma coisa que fazer o exemplo abaixo:
{% if product.title != ‘Curso para INSS’ %}
Este curso não é para INSS.
{% endif %}
Tags de iteração
As tags de iteração são usadas para executar um bloco de código repetidamente.
for
Executa um bloco de código repetidamente. Para uma lista completa dos atributos disponíveis dentro de um for
, veja forloop (objeto).
Input:
{% for product in collection.products %}
{{ product.title }}
{% endfor %}
Output:
matemática física química
break
Faz o loop parar de iterar quando encontra uma tag break.
Input:
{% for i in (1..5) %}
{% if i == 4 %}
{% break %}
{% else %}
{{ i }}
{% endif %}
{% endfor %}
Output:
1 2 3
continue
Faz o loop pular a iteração quando encontra a tag continue
.
Input:
{% for i in (1..5) %}
{% if 1==4 %}
{% continue %}
{% else %}
{{ i }}
{% endif %}
{% endfor %}
Output:
1 2 3 5
Parâmetros for
limit
Sai do loop for em um índice específico.
Input:
<!— if array = [1,2,3,4,5,6] —>
{% for item in array limit:2 %}
{{ item }}
{% endfor %}
Output:
1 2
offset
Inicia o loop em um índice específico.
Input:
<!— if array = [1,2,3,4,5,6] —>
{% for item in array offset:2 %}
{{ item }}
{% endfor %}
Output:
3 4 5 6
range
Define o intervalo de números para executar o loop. O intervalo pode ser definido por números absolutos ou variáveis.
Input
{% assign num = 4 %}
{% for i in (1..num) %}
{{ i }}
{% endfor %}
{% for i in (3..5) %}
{{ i }}
{% endfor %}
Output
1 2 3 4
3 4 5
reversed
Reverte a ordem do loop for.
Input
<!— if array = [1,2,3,4,5,6] —>
{% for item in array reversed %}
{{ item }}
{% endfor %}
Output
6 5 4 3 2 1
cycle
Executa o loop em um grupo de strings e as exibe na ordem na qual foram passadas como parâmetros. Cada vez que cycle
é utilizado, a próxima string que for passada como parâmetro é exibida.
cycle
deve ser usada dentro do bloco de um loop for.
Input
{% cycle ‘one’, ‘two’, ‘three’ %}
{% cycle ‘one’, ‘two’, ‘three’ %}
{% cycle ‘one’, ‘two’, ‘three’ %}
{% cycle ‘one’, ‘two’, ‘three’ %}
Output:
one
two
three
one
Usos para o cycle
incluem:
- aplicar classes ímpares/pares para as linhas de uma tabela
- aplicar uma classe única para o último thumbnail de um produto em uma linha
Parâmetros de cycle
cycle
aceita um parâmetro chamado cycle group
nos casos onde você precisa de vários blocos de cycle
em um mesmo template. Se nenhum nome for dado para o cycle group
, então assume-se que várias chamadas com os mesmos parâmetros fazem parte do mesmo grupo.
<ul>
{% for product in collections.collection-1.products %}
<li{% cycle ‘ style=“clear:both;”’, ‘’, ‘’, ‘ class=“last”’ %}>
<a href=“{{ product.url | within: collection }}”>
<img src=“{{ product.featured_image.src | product_mg_url: ‘medium’ }}” alt=“{{ product.featured_image.alt }}” />
</a>
</li>
{% endfor %}
</ul>
<ul>
{% for product in collections.collection-2.products %}
<li{% cycle ‘ style=“clear:both;”’, ‘’, ‘’, ‘ class=“last”’ %}>
<a href=“{{ product.url | within: collection }}”>
<img src=“{{ product.featured_image.src | product_mg_url: ‘medium’ }}” alt=“{{ product.featured_image.alt }}” />
</a>
</li>
{% endfor %}
</ul>
No código acima, se a primeira coleção tiver apenas dois produtos, o loop da segunda coleção irá continuar o cycle
onde o primeiro parou. Isso resultaria nesse resultado indesejado:
<ul>
<li style=“clear:both”></li>
</ul>
<ul>
<li></li>
<li class=“last”></li>
<li style=“clear:both”></li>
<li></li>
</ul>
Para evitar que isso aconteça, cycle groups são usados para cada bloco de cycle, como mostrado abaixo:
<ul>
{% for product in collections.collection-1.products %}
<li{% cycle ‘group1’: ‘ style=“clear:both;”’, ‘’, ‘’, ‘ class=“last”’ %}>
<a href=“{{ product.url | within: collection }}”>
<img src=“{{ product.featured_image.src | product_mg_url: “medium” }}” alt=“{{ product.featured_image.alt }}” />
</a>
</li>
{% endfor %}
</ul>
<ul>
{% for product in collections.collection-2.products %}
<li{% cycle ‘group2’: ‘ style=“clear:both;”’, ‘’, ‘’, ‘ class=“last”’ %}>
<a href=“{{ product.url | within: collection }}”>
<img src=“{{ product.featured_image.src | product_mg_url: “medium” }}” alt=“{{ product.featured_image.alt }}” />
</a>
</li>
{% endfor %}
</ul>
Com o código acima, os dois blocos de cycle
são independentes. O resultado é mostrado abaixo:
<ul>
<li style=“clear:both”></li>
<li></li>
</ul>
<!— new cycle group starts! —>
<ul>
<li style=“clear:both”></li>
<li></li>
<li></li>
<li class=“last”></li>
</ul>
tablerow
Gera um HTML <table>
. Deve ser inserido entre uma tag de abertura <table>
e uma de fechamento </table>
. Para uma lista complete de atributos disponíveis dentro de um loop tablerow
, veja tablerow (objeto).
Input
<table>
{% table row product in collection.products %}
{{ product.title }}
{% endtablerow %}
</table>
Output
<table>
<tr class=“row1”>
<td class=“col1”>
Cool Shirt
</td>
<td class=“col2”>
Alien Poster
</td>
<td class=“col3”>
Batman Poster
</td>
<td class=“col4”>
Bullseye Shirt
</td>
<td class=“col5”>
Another Classic Vinyl
</td>
<td class=“col6”>
Awesome Jeans
</td>
</tr>
</table>
Os parâmetros de tablerow
cols
Define quantas colunas terá a tabela.
Input
{% table row product in collection.products cols:2 %}
{{ product.title }}
{% endtablerow %}
Output
<table>
<tr class=“row1”>
<td class=“col1”>
Cool Shirt
</td>
<td class=“col2”>
Alien Poster
</td>
</tr>
<tr class=“row2”>
<td class=“col1”>
Batman Poster
</td>
<td class=“col2”>
Bullseye Shirt
</td>
</tr>
<tr class=“row3”>
<td class=“col1”>
Another Classic Vinyl
</td>
<td class=“col2”>
Awesome Jeans
</td>
</tr>
</table>
limit
Finaliza a tabela após atingir um determinado índice.
{% table row product in collection.products cols:2 limit:3 %}
{{ product.title }}
{% endtablerow %}
offset
Inicia a tabela após um índice específico.
{% table row product in collection.products cols:2 offset:3 %}
{{ product.title }}
{% endtablerow %}```
range
Define o intervalo de números que um loop deve ser executado. O intervalo pode ser definido tanto por números absolutos como variáveis.
<!—variable number example—>
{% assign num = 4 %}
<table>
{% table row i in (1..num) %}
{{ i }}
{% endtablerow %}
</table>
<!—literal number example—>
<table>
{% table row i in (3..5) %}
{{ i }}
{% endtablerow %}
</table>
Tags do tema
As tags do tema possuem várias funções diferentes, incluindo:
- Injetar markups HTML específicos de um template;
- Indicar ao tema quais layouts e snippets usar
- Dividir um array retornado em múltiplas páginas
Comment
Permite que você não renderize o código dentro de um template Liquid. Qualquer texto antes e depois da tag comment
não será exibidas, assim como qualquer código não será executado.
Input:
Meu nome é {% comment %} Forrest {% comment %} Gump.
Output:
Meu nome é Gump.
Include
Insere um snippet de dentro da pasta snippets de um tema.
{% include `snippet-name` %}
Repare que a extensão .liquid
é omitida no código acima.
Quando um snippet é incluído, o código dentro dele terá acesso às variáveis do seu template pai.
Incluindo múltiplas variáveis em um snippet
Há duas maneiras de incluir múltiplas variáveis em snippet. Você pode designá-las e incluí-las em linhas diferentes:
{% assign snippet_variable = ‘this is it’ %}
{% assign snippet_variable_two = ‘this is also it’ %}
{% include ‘snippet’ %}
Ou você pode consolidar tudo em uma linha de código:
{% include ‘snippet’, snippet_variable: ‘this is it’, snippet_variable_two: ‘this is also it’ %}
Os parâmetros include
with
O parâmetro with determina um valor para uma variável dentro de um snippet que possui o mesmo nome do próprio snippet.
Por exemplo, é possível que haja um snippet chamado color.liquid, contendo o seguinte código:
color: ‘{{ color }}’
shape: ‘{{ shape }}’
Dentro de theme.liquid, é possível inserir o snippet color.liquid da seguinte forma:
% assign shape = ‘circle’ %}
{% include ‘color’ %}
{% include ‘color’ with ‘red’ %}
{% include ‘color’ with ‘blue’ %}
{% assign shape = ‘square’ %}
{% include ‘color’ with ‘red’ %}
O resultado será:
color: shape: ‘circle’
color: ‘red’ shape: ‘circle’
color: ‘blue’ shape: ‘circle’
color: ‘red’ shape: ‘square’
Form
Cria um elemento HTML <form>
com todos os atributos necessários (action, id, etc), assim como <input>
para enviar o formulário.
Os parâmetros form
Inserir parâmetros Edools.
Paginate
Dividir produtos e resultados de uma busca em várias páginas é uma parte necessária do tema, por existir uma limitação de 50 resultados por página em um loop for.
A tag paginate trabalha em conjunto com a tag for para dividir o conteúdo em várias páginas. Ela deve conter um bloco da tag for que itera em um array, como mostrado no exemplo abaixo:
{% paginate collection.products by 5 %}
{% for product in collection.products %}
<!—show product details here —>
{% endfor %}
{% endpaginate %}
O parâmetro by
é seguido por um integer entre 1 e 50 que indica à tag paginate quantos resultados ela deve mostrar por página.
Dentro da tag paginate, você pode acessar os atributos do objeto paginate. Isso inclui os atributos para exibir os links necessários à navegação das páginas geradas.
Raw
Permite que seja exibido um código Liquid na página sem ser parseada.
Input:
{% raw %}{{ 5 | mais: 6 }}{% endear %} é igual a 11.
Output:
{{ 5 | mais: 6 }} é igual a 11.
Tags variáveis
As tags variáveis são usadas para criar novas variáveis Liquid.
Assign
Cria uma nova variável.
Input:
{% assign my_variable = false %}
{% if my_variable != true %}
Esta afirmação é válida.
{% endif %}
Output:
Esta afirmação é válida.
Use aspas para salvar a variável como uma string.
Input:
{% assign foo = “bar” %}
{{ foo }}
Output:
Capture
Captura a string dentro das tags de abertura e fechamento e a determina como variável. Variáveis criadas através de {% capture %}
são strings.
Input:
{% capture my_variable %}Estou sendo capturado.{% end capture %}
{{ my_variable }}
Output:
Estou sendo capturado.
Incremet
Cria uma nova variável de número e aumenta seu valor a cada vez que é chamada. O valor inicial é 0.
Input:
{% increment variable %}
{% increment variable %}
{% increment variable %}
Output:
0
1
2
Variáveis criadas através da tag increment
são independentes das variáveis criadas através das tags assign
e capture
.
No exemplo abaixo, a variável de nome var
é criada através da tag assign
. A tag increment
, depois, é usada várias vezes com uma variável de mesmo nome. Porém, repare que a tag incremet
não afeta o valor da var
criada pela tag assign
.
Input:
% assign var = 10 %}
{% increment var %}
{% increment var %}
{% increment var %}
{{ var }}
Output:
0
1
2
10
Decrement
Cria uma nova variável de número e decresce seu valor todas as vezes em que é chamada. O valor inicia é -1.
Input:
{% decrement variable %}
{% decrement variable %}
{% decrement variable %}
Output:
-1
-2
-3
Assim como increment
, variáveis declaradas dentro de decrement
são independentes das declaradas através de assign
e capture
.
Objetos
Adicionar conteúdo sobre os objetos.
Filtros
Adicionar conteúdo sobre os filtros.
Precisa de ajuda?
Comece visitando nossa base de conhecimento.
Depois dê uma conferida nas discussões na nossa comunidade.
Não encontrou o que procura? Fique a vontade para enviar sua dúvida/dica/sugestão/erro clicando aqui e depois no botão + Nova publicação.