Página de categorias de produtos com paginação dinâmica
Modelo completo da página de categorias de produtos com paginação dinâmica.
Você vai precisar além da página padrão, criar um widget adicional, o qual será chamado dinamicamente. O widget deverá se chamar "pagina-categorias-produtos.html" e seu conteúdo encontra-se abaixo.
# HTML da página de categorias
{% set dados = page_category %}
<div class="central">
<main class="block categorias">
{% if filiais|length >= 1 %}
<section id="filiais" class="block">
<h2 class="titulo mb-3">FORNECEDORES</h2>
<div class="block">
<div class="itens owl-auto owl-carousel owl-theme" data-items="4" data-responsive800="2" data-loop="false" data-margin="10">
{% for item in filiais %}
<div class="item">
<a href="{{ item.url_interna_matriz }}"><img src="{{ item.logo }}" alt="{{ item.nome }}" class="img-fluid" /></a>
</div>
{% endfor %}
</div>
</div>
</section>
{% endif %}
<section id="departamentos" class="block">
<nav class="mb-3" aria-label="breadcrumb">
<ol class="breadcrumb" itemprop="breadcrumb" itemscope itemtype="https://schema.org/BreadcrumbList">
<li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="{{ base }}/" itemprop="item">
<span itemprop="name">Página inicial</span>
</a>
<meta itemprop="position" content="1" />
</li>
<li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="{{ dados.page.cl1.url }}" itemprop="item">
<span itemprop="name">{{ dados.page.cl1.nome }}</span>
</a>
<meta itemprop="position" content="2" />
</li>
{% if dados.page.cl2.nome %}
<li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="{{ dados.page.cl2.url }}" itemprop="item">
<span itemprop="name">{{ dados.page.cl2.nome }}</span>
</a>
<meta itemprop="position" content="3" />
</li>
{% endif %}
{% if dados.page.cl3.nome %}
<li class="breadcrumb-item" itemprop="itemListElement" itemscope itemtype="https://schema.org/ListItem">
<a href="{{ dados.page.cl3.url }}/" itemprop="item">
<span itemprop="name">{{ dados.page.cl3.nome }}</span>
</a>
<meta itemprop="position" content="4" />
</li>
{% endif %}
</ol>
</nav>
<div class="d-flex d-md-none mobile-filtro">
<div class="item">
<a href="" class="action filtrar-por"><i class="fa fa-filter fa-fw"></i> Filtrar</a>
</div>
<div class="item">
<a href="" class="action ordenar-por"><i class="fa fa-sort fa-fw"></i> Ordenar</a>
<div class="drop-filtro">
{% for item in dados.filters %}
<a href="{{ item.data_url }}" class="{{ item.selected ? ' selected' : '' }}">{{ item.name }}</a>
{% endfor %}
</div>
</div>
</div>
<div class="mobile-filtro-suspended d-block d-md-none">
<div class="cover-filtro"></div>
<div class="drop-filtro">
<div class="drop-header">
<h3>FILTRAR</h3>
<span class="fechar">×</span>
</div>
<div class="drop-list">
{% if dados.prices.items|length > 0 or extra.vl1 %}
<div class="listing vars">
<h3 class="t block">
<span class="float-left">POR PREÇO</span>
{% if extra.vl1 %}
<span class="float-right"><a href="{{ dados.prices.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for item in dados.prices.items %}
{% set texto_valor = item.de == "0.01" ? ("até R$"~item.ate|valor) : ("de R$"~item.de|valor~" até R$"~item.ate|valor) %}
<a href="{{ item.url }}"{{ extra.vl1 == item.de ? ' class="active"' : '' }}>{{ texto_valor }}</a>
{% endfor %}
</div>
</div>
{% endif %}
{% if dados.colors.items|length >= 1 %}
<div class="listing colors">
<h3 class="t block">
<span class="float-left">COR</span>
{% if extra.cor %}
<span class="float-right"><a href="{{ dados.colors.url_all }}" style="font-size: 10px;">Ver todos </a></span>
{% endif %}
</h3>
<div class="b">
{% for cor in dados.colors.items %}
<a href="{{ cor.url }}"{{ extra.cor == cor.id ? ' class="active"' : '' }}>{{ cor.nome }}</a>
{% endfor %}
</div>
</div>
{% endif %}
{% for variacao in dados.variations %}
<div class="listing vars">
<h3 class="t block">
<span class="float-left">{{ variacao.nome|upper }}</span>
{% if extra.var %}
<span class="float-right"><a href="{{ variacao.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for item in variacao.items %}
<a href="{{ item.url }}"{{ extra.var == item.id ? ' class="active"' : '' }}>{{ item.valor }}</a>
{% endfor %}
</div>
</div>
{% endfor %}
{% for variacao in dados.attributes %}
<div class="listing vars">
<h3 class="t block">
<span class="float-left">{{ variacao.nome|upper }}</span>
{% if extra.attr %}
<span class="float-right"><a href="{{ variacao.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for item in variacao.items %}
<a href="{{ item.url }}"{{ extra.attr == item.id ? ' class="active"' : '' }}>{{ item.nome }}</a>
{% endfor %}
</div>
</div>
{% endfor %}
{% if dados.brands.items|length >= 1 %}
<div class="listing vars">
<h3 class="t block">
<span class="float-left">MARCA</span>
{% if extra.b %}
<span class="float-right"><a href="{{ dados.brands.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for item in dados.brands.items %}
<a href="{{ item.url }}"{{ extra.b == item.id ? ' class="active"' : '' }}>{{ item.marca }}</a>
{% endfor %}
</div>
</div>
{% endif %}
{% if dados.categories_l2|length >= 1 %}
<div class="listing">
<h3 class="t"><span class="c">{{ dados.page.cl1.nome|upper }}</span></h3>
<div class="b">
{% for categoria in dados.categories_l2 %}
<a href="{{ categoria.url }}"{{ extra.clevel2 and extra.clevel2 in categoria.url ? ' class="active"' : '' }}>{{ categoria.nome }} ({{ categoria.total_produtos_ativos }})</a>
{% endfor %}
</div>
</div>
{% endif %}
{% if dados.categories_l3|length >= 1 %}
<div class="listing">
<h3 class="t"><span class="c">{{ dados.page.cl2.nome|upper }}</span></h3>
<div class="b">
{% for categoria in dados.categories_l3 %}
<a href="{{ categoria.url }}"{{ extra.clevel3 and extra.clevel3 in categoria.url ? ' class="active"' : '' }}>{{ categoria.nome }} ({{ categoria.total_produtos_ativos }})</a>
{% endfor %}
</div>
</div>
{% endif %}
</div>
</div>
</div>
{% if geral.hasPerformaAI %}
<performa></performa>
{% endif %}
<h2 class="titulo my-0 mb-3">{{ dados.page.title|upper }}</h2>
<p class="text-muted mb-3 d-block d-md-none"><span>{{ dados.products.total ~ plural(dados.products.total, ' ', 'produto encontrado', 'produtos encontrados') }}</span></p>
{% if dados.kits|length > 0 %}
<div class="block prod-kits">
<div class="row justify-content-center">
{% for kit in dados.kits %}
<div class="col-md-3 mb-4 text-center">
<div class="block item">
<a href="{{ kit.url }}">
<div class="foto">
<img src="{{ kit.foto }}" alt="{{ kit.titulo }}" class="img-cover" />
</div>
</a>
<div class="det">
<h3 class="t">{{ kit.titulo }} </h3>
<p class="mb-2">{{ kit.produtos ~ plural(kit.produtos, ' ite', 'm', 'ns') }}</p>
<div class="valores">
{% if kit.isPromo %}
<p class="valor_de">R${{ kit.valor_base|valor }}</p>
{% endif %}
<p class="valor_por">R${{ kit.valor_final|valor }}</p>
</div>
<a href="{{ kit.url }}" class="bt-comprar">COMPRAR O KIT</a>
</div>
{% if kit.frete_gratis %}
<p class="frete-gratis"><span class="px-2 py-1">FRETE GRÁTIS</span></p>
{% endif %}
{% if kit.desconto_percentual %}
<span class="desconto">-{{ kit.desconto_percentual|round(0, 'floor') }}%</span>
{% endif %}
</div>
</div>
{% endfor %}
</div>
</div>
<h2 class="titulo my-0 mb-3">PRODUTOS</h2>
{% endif %}
<div class="row d-none d-md-flex">
<div class="col-md-6">
<span>{{ dados.products.total ~ plural(dados.products.total, ' ', 'produto encontrado', 'produtos encontrados') }}</span>
</div>
<div class="col-md-6 text-md-right">
<span>Ordenar por</span>
<select class="border border-dark p-1 mx-2 orderby" style="width: 150px; font-size: 12px;">
{% for item in dados.filters %}
<option value="{{ item.value }}" data-url="{{ item.data_url }}"{{ item.selected ? ' selected' : '' }}>{{ item.name }}</option>
{% endfor %}
</select>
</div>
</div>
{% if dados.page.hasMenuLateral %}
<div class="cln p d-none d-md-block">
<div class="block d-block d-md-none text-center filtrar">
<h4 class="t"><span class="border border-dark p-2 d-inline-block">FILTRAR <i class="fa fa-caret-down"></i></span></h4>
</div>
<div class="block d-none d-md-block animated fadeIn filtros">
{% if dados.prices.items|length > 0 or extra.vl1 %}
<div class="listing vars">
<h3 class="t block">
<span class="float-left">POR PREÇO</span>
{% if extra.vl1 %}
<span class="float-right"><a href="{{ dados.prices.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for item in dados.prices.items %}
{% set texto_valor = item.de == "0.01" ? ("até R$"~item.ate|valor) : ("de R$"~item.de|valor~" até R$"~item.ate|valor) %}
<a href="{{ item.url }}"{{ extra.vl1 == item.de ? ' class="active"' : '' }}>{{ texto_valor }}</a>
{% endfor %}
</div>
</div>
{% endif %}
{% if dados.categories_l2|length >= 1 %}
<div class="listing">
<h3 class="t"><span class="c">{{ dados.page.cl1.nome|upper }}</span></h3>
<div class="b">
{% for categoria in dados.categories_l2 %}
<a href="{{ categoria.url }}"{{ extra.clevel2 and extra.clevel2 in categoria.url ? ' class="active"' : '' }}>{{ categoria.nome }} ({{ categoria.total_produtos_ativos }})</a>
{% endfor %}
</div>
</div>
{% endif %}
{% if dados.categories_l3|length >= 1 %}
<div class="listing">
<h3 class="t"><span class="c">{{ dados.page.cl2.nome|upper }}</span></h3>
<div class="b">
{% for categoria in dados.categories_l3 %}
<a href="{{ categoria.url }}"{{ extra.clevel3 and extra.clevel3 in categoria.url ? ' class="active"' : '' }}>{{ categoria.nome }} ({{ categoria.total_produtos_ativos }})</a>
{% endfor %}
</div>
</div>
{% endif %}
{% if dados.colors.items|length >= 1 %}
<div class="listing colors">
<h3 class="t block">
<span class="float-left">COR</span>
{% if extra.cor %}
<span class="float-right"><a href="{{ dados.colors.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for cor in dados.colors.items %}
<a href="{{ cor.url }}"{{ extra.cor == cor.id ? ' class="active"' : '' }}>{{ cor.nome }}</a>
{% endfor %}
</div>
</div>
{% endif %}
{% for variacao in dados.variations %}
<div class="listing vars">
<h3 class="t block">
<span class="float-left">{{ variacao.nome|upper }}</span>
{% if extra.var %}
<span class="float-right"><a href="{{ variacao.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for item in variacao.items %}
<a href="{{ item.url }}"{{ extra.var == item.id ? ' class="active"' : '' }}>{{ item.valor }}</a>
{% endfor %}
</div>
</div>
{% endfor %}
{% for variacao in dados.attributes %}
<div class="listing vars">
<h3 class="t block">
<span class="float-left">{{ variacao.nome|upper }}</span>
{% if extra.var %}
<span class="float-right"><a href="{{ variacao.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for item in variacao.items %}
<a href="{{ item.url }}"{{ extra.attr == item.id ? ' class="active"' : '' }}>{{ item.nome }}</a>
{% endfor %}
</div>
</div>
{% endfor %}
{% if dados.brands.items|length >= 1 %}
<div class="listing vars">
<h3 class="t block">
<span class="float-left">MARCA</span>
{% if extra.b %}
<span class="float-right"><a href="{{ dados.brands.url_all }}" style="font-size: 10px;">Ver todos</a></span>
{% endif %}
</h3>
<div class="b">
{% for item in dados.brands.items %}
<a href="{{ item.url }}"{{ extra.b == item.id ? ' class="active"' : '' }}>{{ item.marca }}</a>
{% endfor %}
</div>
</div>
{% endif %}
</div>
</div>
{% endif %}
<div class="cln s{{ not dados.page.hasMenuLateral ? ' w-100' : ''}}">
{% if dados.page.banner %}
<div class="block mb-4 text-center">
{{ dados.page.banner_raw|raw }}
</div>
{% endif %}
{% if dados.page.infotexto %}
<div id="seo_info" class="texto mb-4">
{{ dados.page.infotexto|raw }}
</div>
{% endif %}
<!--
<div class="produtos">
<div class="row">
{% for produto in dados.products.data %}
<div class="{{dados.page.hasMenuLateral ? 'col-md-4' : 'col-md-3' }} {{ dados.page.mobile.coluna_dupla ? 'col-6' : 'col-12' }}">
{{ store.productBoxDefault(produto) }}
</div>
{% else %}
<div class="col">
<div class="alert alert-info text-center">
<p>Nenhum produto encontrado no momento em: {{ dados.page.title }}</p>
</div>
</div>
{% endfor %}
</div>
</div>
-->
<div class="produtos">
<div class="row">
{% for produto in dados.products.data %}
<div class="{{dados.page.hasMenuLateral ? 'col-md-4' : 'col-md-3' }} {{ dados.page.mobile.coluna_dupla ? 'col-6' : 'col-12' }}">
{{ include('widgets/box-do-produto.html') }}
</div>
{% else %}
<div class="col">
<div class="alert alert-info text-center">
<p>Nenhum produto encontrado no momento em: {{ dados.page.title }}</p>
</div>
</div>
{% endfor %}
</div>
<span class="loading_item hide"></span>
</div>
<div class="row">
<div class="col text-center">
<button class="produtos_carregar_mais">Carregar mais produtos</button>
</div>
</div>
</div>
{% if geral.hasSmartHint %}
<div id="smarthint-position-1"></div>
<div id="smarthint-position-2"></div>
<div id="smarthint-position-3"></div>
<div id="smarthint-position-4"></div>
<div id="smarthint-position-5"></div>
{% endif %}
{% if geral.hasPerformaAI %}
<performa></performa>
{% endif %}
</section>
</div>
<script>
var pageAtual = 1;
var totalPaginas = parseInt('{{ dados.pagination.page_total }}');
$(function(){
{% if geral.hasSmartHint %}
SmartHint.Call('setPage',{type:'category', data: {content: '{{ dados.page.title }}'} });
{% endif %}
if(pageAtual >= totalPaginas){
$('.produtos_carregar_mais').hide();
return false;
}
$('button.produtos_carregar_mais').click(function(e){
e.preventDefault();
// não carrega mais páginas caso a pagina atual for maior do que o total de paginas
if(pageAtual >= totalPaginas)
return false;
// carrega a nova página
pageAtual++;
$('.produtos_carregar_mais').hide();
$('.loading_item').removeClass('hide');
setTimeout(function(){
$('.loading_item').addClass('hide');
}, 200);
params = JSON.parse('{{ json_encode(dados.page.querystring)|raw }}');
params.widget = 'widgets/pagina-categorias-produtos.html';
params.page = pageAtual;
params.pageAtual = pageAtual;
$.get('load-widget.php', params, function(d){
$('.produtos .row:first').append(d);
loadCompraRapida();
});
if(pageAtual < totalPaginas) {
setTimeout(function(){
$('.produtos_carregar_mais').show();
}, 200);
}
});
$('.filtrar').click(function(){
$(this).toggleClass('mb-4');
$('.filtros').toggleClass('d-none');
});
$('.orderby').change(function(){
var url = $('option:selected', this).data('url');
location.href = url;
});
});
</script>
{{ dados.page.seo_scripts|raw }}
</main>
# HTML do widget pagina-categorias-produtos.html
{% set dados = store.pageProductsFull(extra) %}
{% for produto in dados.products.data %}
<div class="{{dados.page.hasMenuLateral ? 'col-md-4' : 'col-md-3' }} {{ dados.page.mobile.coluna_dupla ? 'col-12' : 'col-6' }}">
{{ include('widgets/box-do-produto.html') }}
</div>
{% endfor %}
// CSS
#geral{
overflow: inherit;
}
main.categorias{
padding: 0 50px;
}
#filiais{
margin-bottom: 30px;
.itens{
.item{
padding: 5px;
background-color: #FFF;
border: solid 1px #EEE;
border-radius: 3px;
a{
width: 100%;
height: 100%;
display: flex;
justify-content: center;
align-items: center;
img{
width: auto;
max-height: 100px;
}
}
}
}
}
.produtos_carregar_mais{
padding: 10px 15px;
background-color: #FFF;
border: solid 1px #CCC;
border-radius: 10px;
margin-bottom: 20px;
outline: none;
&:hover{
background-color: #EEE;
}
}