Dentro da pasta /layouts você encontrará um único .tpl chamado layout.tpl que é usado como uma estrutura para todo o layout. O conteúdo deste arquivo será replicado em todas as telas e seções da loja.
<html><head>
Você encontrará as tags de todos os html, que determinam as propriedades do documento. Sugerimos que você mantenha esses códigos, pois eles são otimizados para operação com mídias sociais e componentes de SEO.
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:fb="http://www.facebook.com/2008/fbml" xmlns:og="http://opengraphprotocol.org/schema/" lang="{% for language in languages %}{% if language.active %}{{ language.lang }}{% endif %}{% endfor %}"> <head> <link rel="preconnect" href="https://d26lpennugtm8s.cloudfront.net" /> <link rel="dns-prefetch" href="https://d26lpennugtm8s.cloudfront.net" /> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /> <meta name="viewport" content="width=device-width, initial-scale=1" /> <title>{{ page_title }}</title> <meta name="description" content="{{ page_description }}" /> {% if settings.fb_admins %} <meta property="fb:admins" content="{{ settings.fb_admins }}" /> {% endif %} {% if store_fb_app_id %} <meta property="fb:app_id" content="{{ store_fb_app_id }}" /> {% elseif not store.has_custom_domain %} <meta property="fb:app_id" content="{{ fb_app.id }}" /> {% endif %} {{ store.name | og('site_name') }} {% if template == 'home' and store.logo %} {{ ('http:' ~ store.logo) | og('image') }} {{ ('https:' ~ store.logo) | og('image:secure_url') }} {% endif %} {# Preload of first image of Slider to improve LCP #} {% if template == 'home'%} {% snipplet 'preload-images.tpl' %} {% endif %} {# OG tags to control how the page appears when shared on Facebook. See http://ogp.me/ #} {% snipplet "metas/facebook-og.tpl" %} {# Twitter tags to control how the page appears when shared on Twitter. See https://dev.twitter.com/cards/markup #} {% if template == 'product' %} {# Twitter #} {% snipplet "metas/twitter-product.tpl" %} {# Facebook #} {% snipplet "metas/facebook-product-og.tpl" %} {% elseif template == 'category' %} {# Facebook #} {% snipplet "metas/facebook-category-og.tpl" %} {% endif %} {#/*============================================================================ #CSS and fonts ==============================================================================*/#} {# Critical CSS needed to show first elements of store while CSS async is loading #} <style> {# Font families #} {% if params.preview %} {# If page is loaded from customization page on the admin, load all fonts #} @import url('https://fonts.googleapis.com/css?family=Muli:400,700|Lato:400,700|Open+Sans:400,700|Lora:400,700|Slabo+27px|Playfair+Display:400,700|Droid+Sans:400,700|Poppins:400,700,900|Niramit:400,700&display=swap'); {% else %} {# If page is NOT loaded from customization only load saved fonts #} {# Get only the saved fonts on settings #} @import url('{{ [settings.font_headings, settings.font_rest] | google_fonts_url('300, 400, 700') | raw }}'); {% endif %} {% include "static/css/style-critical.tpl" %} </style> {# Colors and fonts used from settings.txt and defined on theme customization #} {{ 'css/style-colors.scss.tpl' | static_url | css_tag }} {# Load async styling not mandatory for first meaningfull paint #} {% include "static/js/load-css-async.tpl" %} {# Loads custom CSS added from Advanced Settings on the admin´s theme customization screen #} <style> {{ settings.css_code | raw }} </style> {#/*============================================================================ #Javascript: Needed before HTML loads ==============================================================================*/#} {# Defines if async JS will be used by using script_tag(true) #} {% set async_js = true %} {# Defines the usage of jquery loaded below, if nojquery = true is deleted it will fallback to jquery 1.5 #} {% set nojquery = true %} {# Jquery async by adding script_tag(true) #} {% if load_jquery %} {{ '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js' | script_tag(true) }} {% endif %} {# Loads private Tiendanube JS #} {% head_content %} {# Structured data to provide information for Google about the page content #} {% include 'snipplets/structured_data/webpage-structured-data.tpl' %} </head>
CSS y Fonts
Em nossos layouts, usamos o Google Fonts. Seu rápido carregamento e otimização nos permite oferecer um resultado de alta qualidade e versatilidade ao oferecer opções.
Primeiro, listamos todas as opções para que, a partir do “administrador” > “Personalizar seu layout atual”, você possa visualizar as fontes. Na condição {% if params.preview %}, fazemos a chamada das Google Fonts específicas e suas variantes.
Depois de {% else %}, chamamos as fontes da vitrine, que são configuradas a partir do arquivo setting.txt
{% if params.preview %} {# If page is loaded from customization page on the admin, load all fonts #} @import url('https://fonts.googleapis.com/css?family=Muli:400,700|Lato:400,700|Open+Sans:400,700|Lora:400,700|Slabo+27px|Playfair+Display:00,700|Droid+Sans:400,700'); {% else %} {# If page is NOT loaded from customization only load saved fonts #} {# Get only the saved fonts on settings #} @import url('{{ [settings.font_headings, settings.font_rest] | google_fonts_url }}'); {% endif %}
Em seguida, adicionamos a chamada à stylesheet “style-critical.tpl” dentro da tag <style> </ style, pois estes estilos devem estar inline.
{% include "static/css/style-critical.tpl" %}
Continuamos com a chamada para o SCSS de cores e o tpl que inclui todos os arquivos de estilo com carregamento assíncrono:
{% include "static/js/load-css-async.tpl" %}
Concluímos com estilos personalizados que os usuários podem inserir em "Personalizar o layout atual” > “Edição avançada de CSS" no administrador da loja.
<style> {{ settings.css_code | raw }} </style>
<head> JavaScript
Os últimos chamados no <head> </ head> serão os arquivos JavaScript necessários antes de carregar o <body>.
Por padrão, o layout chama a versão 1.5 do jQuery, mas se você precisar de outra versão, primeiro terá que desabilitar o padrão com:
{% set nojquery = true %}
⚠️ A partir do dia 30 de janeiro de 2023, a biblioteca jQuery será removida do código de nossas lojas, então este passo não será mais necessário.
E então faça a chamada para a versão que você precisa, como:
{{ '//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js' | script_tag(true) }}
Importante!
Antes de fechar o <head> </ head> você deve incluir a tag {% head_content %} que contém importantes JavaScripts da Nuvemshop, que não podem ser editados.
<html><body>
Assim que fecharmos o <head>, você iniciará todo o container da loja. Dentro da tag <body> </ body>, todas as seções, componentes, layouts e snipplets que criam a loja são desenvolvidos.
Primeiro vamos encontrar algumas linhas de JavaScript para a integração de alguns componentes das redes sociais, como:
- Comentários no Facebook
- Login e cadastro no Facebook
- Botão de compartilhamento do Pinterest
Em seguida, teremos um rótulo que pertence à barra superior da loja que contém o atalho para o Administrador Nuvem. Ele só aparece quando o administrador da loja estiver logado:
{{back_to_admin}}
Começamos então a incluir o conteúdo HTML do <body> por meio de alguns snipplets e a tag fundamental nesse arquivo: {% template_content%}
Essa tag gera o espaço para o conteúdo dos diferentes templates. O conteúdo que você vai chamar é variável para cada seção, como: home.tpl, category.tpl, etc.
Acima dessa tag, vamos encontrar o snipplet header.tpl, que é fixo para toda a loja que contém o logotipo, o menu de navegação, o mecanismo de busca, entre outros componentes que serão exibidos em todas as seções da loja.
O snipplet footer.tpl que chamamos depois da tag {% template_content%} se comporta da mesma forma.
Para finalizar o arquivo, vamos encontrar o carregamento dos arquivos JavaScript. Primeiro o arquivo com códigos críticos e sem dependência do jQuery, e depois, dentro da função LS.ready.then, os 2 js restantes.
Para entender mais sobre nossos arquivos javaScript, você pode ver o artigo: Static JS
Otros Layout
Se houver uma tela que não deve conter esses elementos, um layout alternativo pode ser usado. Isto é obtido com a criação de um novo arquivo tpl na pasta layouts, por exemplo: “special-layout.tpl”, com a estrutura e o conteúdo apropriados a um layout, e no início do modelo desejado, você especifica o layout que deseja usar da seguinte maneira:
{% layout “special-layout.tpl” %}
Por exemplo, se quisermos que o login do cliente use um layout alternativo, podemos criar no diretório de layouts um arquivo chamado alternativo.tpl, que é como layout.tpl com as alterações desejadas. Então do login.tpl você deve incluir a tag {% layout “alternativo.tpl”%} no começo do arquivo.
Vale a pena notar que modelos como product.tpl, contact.tpl, etc. não compartilham variáveis com layouts. Ou seja, se uma variável for definida em layout.tpl usando a tag {% set variable = value%}, essa variável não estará disponível em product.tpl.
Variáveis en layout.tpl
Todas as variáveis disponíveis no layout.tpl também estão disponíveis em todos os arquivos.
Variáveis | Tipo | Default | Descrição |
---|---|---|---|
store | object | n/a | Armazenar objeto que representa a loja. |
powered_by_url | HTML | n/a | Markup da URL que você deve incluir para indicar que o site é feito com a tecnologia Nuvemshop (Use powered_by_link). |
new_powered_by_link | HTML | n/a | Novo markup da URL que você deve incluir para indicar que o site é feito com a tecnologia Nuvemshop. |
powered_by_link | HTML | n/a | Markup do link que você deve incluir para indicar que o site é feito com a tecnologia Nuvemshop. |
back_to_admin | HTML | n/a | Markup para adicionar o iframe que permite ao administrador da loja retornar ao Administrador Nuvem (se estiver logado). |
settings | object | n/a | Objeto Settings que representa as configurações de design. |
sections | array | n/a | Disposição de objetos Section que representam as seções do design. |
languages | array | n/a | Disposição de objetos Language que representam os idiomas da loja. |
current_language | object | n/a | Objeto Language que representa o idioma selecionado pelo usuário na loja. |
has_logo | boolean | false | True se a loja tiver um logótipo. False caso contrário. |
categories | array | n/a | Disposição do objetos Category que representam as categorias de primeiro nível. |
fb_app | object | n/a | Objeto FB_App, representando o aplicativo do Facebook da Nuvemshop. |
pages | array | n/a | Disposição do objeto Page que representam as páginas da loja que foram criadas pelo usuário. |
ebit | HTML | n/a | Markup para incluir o código ebit |
siteforte | HTML | n/a | Marcação para incluir o código do siteforte |
current_url | string | n/a | URL atual mostrado no navegador |
customer | object | n/a | Objeto de cliente que representa um cliente da loja (se estiver logado). |
menus | array | n/a | Dicionário das matrizes do objeto Navigation_Item que representam os menus de navegação da loja. |
navigation | array | n/a | Organização de objetos navigation_item representando o menu de navegação principal da loja. Equivalente a menus.navigation |
cart | object | n/a | Carrinho objeto que representa o carrinho de compras |
params | array | n/a | Arranjo contendo os parâmetros GET do URL. |