Estoque do Catálogo de Produtos - Layout, Uso e Consultas
Como adicionar informações de estoque no layoute realizar consultas assíncronas
O estoque é uma funcionalidade da extensão #5 - Catálogo de produtos
Exemplos
👇 Exemplo prático em variações (baunilha indisponível)
https://componentes.interago.com.br/catalogo/item/cupcakes-de-morango-chocolate-e-baunilha
👇 Exemplo prático em um produto simples
https://componentes.interago.com.br/catalogo/item/boneco-de-olinda-do-mussum
Layout
As informações estão disponíveis para serem atualizadas de forma estática na página. Não está disponível para AJAX ou listas.
$productData['productType']
Essa variável separa produtos simples de produtos com variações.
0 para simples
1 para variações
Para consultar o estoque de variações, somente são aceitas requisições por AJAX. O uso estático de consulta só funciona para produtos simples.
Ao utilizar a consulta estática, é necessário sempre atualizar a página de produtos. É adequado para poucos produtos.
$productData['productStock']
Valores:
0 => para produtos à venda
1 => para produtos que aceitam somente encomeda. Para encomendas é possível utilizar dias para fabricação e data de chegada do produto.
Exemplo de uso para imprimir informações de encomenda
//only pre-order (somente encomendas)
if($productData['productStock'] == 1) {
$item .= '<p>Somente encomenda';
//check for launch date (data para iniciar o preorder)
if($productData['productPreOrderFixedDate'] != 0) {
$item .= ' a partir de '.formatDate($productData['productPreOrderFixedDate']);
}
//check estimated time to start shipping (tempo para fabricar)
if($productData['productStockPreOrderDays'] != 0) {
$producData['productStockPreOrderDays'] == 1 ? $labelForDay = 'dia' : $labelForDay = 'dias';
$item .= '. Tempo de fabricação:'.$productData['productStockPreOrderDays'].' '.$labelForDay;
}
$item .= '</p>';
}
Exemplo para mostrar a quantidade e limitar o carrinho à quantidade máxima
$item .='<a class="cartAddProduct cartPopupView" cartitemid="'.$productData['productSKU'].'" cartitemname="'.$productData['productTitle'].'" cartitemimage="'.str_replace('w_0_', 'w_64_', $productImg).'" cartitemlink="'.$mainData['seoBaseHref'].$productData['productUrl'].'" cartitemprice="'.$productData['productPrice'].'" cartaddlimit="'.$productData['productStockQtd'].'" originalProductPrice="'.$productData['productPrice'].'">Adicionar na sacola</a>';
$item .= '<p id="stockQtdLabel">Quantidade em estoque: '.$productData['productStockQtd'].'</p>';
Chamadas por ajax para produtos simples e variações
<script type="text/javascript" src="https://www.craft.interago.com.br/App/Extensions/5/tag/stock.js" loading="lazy"></script>
//ajax check stock for simple product
if($productData['productStock'] == 0 && $productData['productType'] == 0) {
$item .= '<script>
simpleProductCheckStock("'.$mainData['siteDomainToken'].'", '.$mainData['siteId'].', '.$productData['productId'].');
function stockCallback(data) {
console.log(data);
let obj = JSON.parse(data);
if(obj.qtd == 0) {
document.querySelector("#stockQtdLabel").innerHTML = "Produto indisponível";
document.querySelectorAll(".cartAddProduct").forEach( e => e.remove());
}
}
</script>';
}
else { //variations
if($productData['productType'] == 1) {
$item .= '
<script>
document.querySelectorAll(".optionComponent").forEach( e=> {
e.addEventListener("click", f => {
let lastChild = f.target.getAttribute("lastchild");
console.log(lastChild);
if(lastChild == 0) {
let opt = f.target.getAttribute("value");
variationProductCheckStock("'.$mainData['siteDomainToken'].'", '.$mainData['siteId'].', opt);
}
});
});
function outOfStock() {
document.querySelector("#stockQtdLabel").innerHTML = "Opção indisponível";
document.querySelectorAll(".cartAddProduct").forEach( e => e.style.display = "none");
}
function inStock() {
document.querySelector("#stockQtdLabel").innerHTML = "Temos essa opção em estoque =D";
document.querySelectorAll(".cartAddProduct").forEach( e => e.style.display = "block");
}
</script>
';
}
}
É importante que os elementos do DOM estejam de acordo com os necessários para receber os retornos de informações
Estoque das opções das variações para o layout (estático)
As opções de variação retornam o item variationoptstockQtd para saber se está disponível em estoque, conforme exemplo abaixo
#para produto com variação (0 = simples; 1 = variação)
if($productData['productType'] == 1) {
$variationData = getVariationDataOfAProduct($productData['productId']);
if($variationData[0] != '{}') {
foreach($variationData as $k => $v) {
$vId = $eachVariation['variationId'];
$vName = $eachVariation['variationName'];
$vRequire = $eachVariation['variationRequire'];
$vChoices = $eachVariation['variationChoices'];
$vParentId = $eachVariation['parentId'];
$variationReqsOk = 'false';
//each variation options
$options = $eachVariation['options'];
if(!empty($options)) {
foreach($options as $o => $d) {
$optStock = $d['variationoptstockQtd'];
if($optStock == "0" || $optStock == "") {
#not avaliable
}
}
}
}