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 AJAXO 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 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
            }
        }
    }
}

Você também pode gostar de ler

Guia completo para o catálogo de produtos (Extensão)

Em 14/06/2022 às 13h38 - Atualizado em 11/04/2025 às 13h17

Guia da Extensão #11 Promoções

Em 04/09/2023 às 10h41 - Atualizado em 12/02/2025 às 09h16

Carrinho de compras cart2.js

Em 29/11/2022 às 12h54 - Atualizado em 03/02/2025 às 11h54

Buscas e Pesquisas no Catálogo de produtos

Em 01/03/2023 às 09h23 - Atualizado em 16/12/2024 às 11h48

Extensão #9 Envios e cálculos de frete

Em 23/03/2023 às 20h22 - Atualizado em 15/09/2023 às 09h49

Checkout e Pedidos - Extensão #10

Em 01/06/2023 às 14h35 - Atualizado em 18/08/2023 às 08h36

Catálogo de Produtos - Listar Produtos com AJAX

Em 09/08/2022 às 11h03 - Atualizado em 26/12/2022 às 09h37

001. Catálogo em Lista - Formato Imobiliária

Em 29/06/2022 às 11h22 - Atualizado em 16/08/2022 às 09h09