How can i get salable quantity in list.phtml file, I want to show label on those products which have 0 salable quantity.
-
Refer this link to get salable qty https://magento.stackexchange.com/a/302187/99520– Rutvik MonparaMay 13, 2022 at 4:32
-
how do I pass each product SKU in parameters when calling this function?– Afzel ArshadMay 13, 2022 at 6:04
-
The object manager is bad practice.– Afzel ArshadMay 13, 2022 at 6:05
-
You implement the same functionality without using object manager. This is a hint only not a solution.– Rutvik MonparaMay 13, 2022 at 6:28
-
Payaray Afzel, why do yo delete your questions on this platform with accepted answers? the answers are lost - maybe other people have the same questions like you. and this is the goal of this platform... i answered two questions, you deleted the questions (and my answer too). my reputation is gone away. please do not delete your questions!– Philippe AelligMay 16, 2022 at 19:43
1 Answer
Try This Code
app/code/VendorName/ModuleName/etc
di.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<preference for="Magento\Catalog\Helper\Output" type="VendorName\ModuleName\Helper\Output" />
</config>
app/code/VendorName/ModuleName/Helper
Output.php
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare (strict_types = 1);
namespace VendorName\ModuleName\Helper;
use Magento\Catalog\Helper\Data;
use Magento\Eav\Model\Config;
use Magento\Framework\App\Helper\Context;
use Magento\Framework\Escaper;
use Magento\Framework\Filter\Template;
use Magento\InventorySalesAdminUi\Model\GetSalableQuantityDataBySku;
/**
* Html output
*/
class Output extends \Magento\Catalog\Helper\Output
{
/**
* Array of existing handlers
*
* @var array
*/
protected $_handlers;
/**
* Template processor instance
*
* @var Template
*/
protected $_templateProcessor = null;
/**
* Catalog data
*
* @var Data
*/
protected $_catalogData = null;
/**
* Eav config
*
* @var Config
*/
protected $_eavConfig;
/**
* @var Escaper
*/
protected $_escaper;
/**
* @var array
*/
private $directivePatterns;
/**
* @var GetSalableQuantityDataBySku
*/
private $getSalableQuantityDataBySku;
/**
* Output constructor.
* @param Context $context
* @param Config $eavConfig
* @param Data $catalogData
* @param Escaper $escaper
* @param array $directivePatterns
* @param array $handlers
* @param GetSalableQuantityDataBySku $getSalableQuantityDataBySku
*/
public function __construct(
Context $context,
Config $eavConfig,
Data $catalogData,
Escaper $escaper,
$directivePatterns = [],
array $handlers = [],
GetSalableQuantityDataBySku $getSalableQuantityDataBySku
) {
$this->_eavConfig = $eavConfig;
$this->_catalogData = $catalogData;
$this->_escaper = $escaper;
$this->directivePatterns = $directivePatterns;
$this->_handlers = $handlers;
$this->getSalableQuantityDataBySku = $getSalableQuantityDataBySku;
parent::__construct($context, $eavConfig, $catalogData, $escaper, $directivePatterns, $handlers);
}
public function getProductSalableQty($prdSku)
{
return $this->getSalableQuantityDataBySku->execute($prdSku);
}
}
app/code/VendorName/ModuleName/view/frontend/layout
catalog_category_view.xml
<?xml version="1.0"?>
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" layout="2columns-left" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd">
<body>
<referenceBlock name="category.products.list">
<action method="setTemplate">
<argument name="template" xsi:type="string">VendorName_ModuleName::product/list.phtml</argument>
</action>
</referenceBlock>
</body>
</page>
app/code/VendorName/ModuleName/view/frontend/templates/product
list.phtml
<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
use Magento\Framework\App\Action\Action;
?>
<?php
/**
* Product list template
*
* @var $block \Magento\Catalog\Block\Product\ListProduct
* @var \Magento\Framework\Escaper $escaper
* @var \Magento\Framework\View\Helper\SecureHtmlRenderer $secureRenderer
*/
?>
<?php
$_productCollection = $block->getLoadedProductCollection();
/** @var \Magento\Catalog\Helper\Output $_helper */
$_helper = $block->getData('outputHelper');
?>
<?php if (!$_productCollection->count()): ?>
<div class="message info empty">
<div><?= $escaper->escapeHtml(__('We can\'t find products matching the selection.')) ?></div>
</div>
<?php else: ?>
<?= $block->getToolbarHtml() ?>
<?= $block->getAdditionalHtml() ?>
<?php
if ($block->getMode() === 'grid') {
$viewMode = 'grid';
$imageDisplayArea = 'category_page_grid';
$showDescription = false;
$templateType = \Magento\Catalog\Block\Product\ReviewRendererInterface::SHORT_VIEW;
} else {
$viewMode = 'list';
$imageDisplayArea = 'category_page_list';
$showDescription = true;
$templateType = \Magento\Catalog\Block\Product\ReviewRendererInterface::FULL_VIEW;
}
/**
* Position for actions regarding image size changing in vde if needed
*/
$pos = $block->getPositioned();
?>
<div class="products wrapper <?= /* @noEscape */ $viewMode ?> products-<?= /* @noEscape */ $viewMode ?>">
<ol class="products list items product-items">
<?php /** @var $_product \Magento\Catalog\Model\Product */ ?>
<?php foreach ($_productCollection as $_product): ?>
<li class="item product product-item">
<div class="product-item-info"
id="product-item-info_<?= /* @noEscape */ $_product->getId() ?>"
data-container="product-<?= /* @noEscape */ $viewMode ?>">
<?php
$productImage = $block->getImage($_product, $imageDisplayArea);
if ($pos != null) {
$position = 'left:' . $productImage->getWidth() . 'px;'
. 'top:' . $productImage->getHeight() . 'px;';
}
?>
<?php // Product Image ?>
<a href="<?= $escaper->escapeUrl($_product->getProductUrl()) ?>"
class="product photo product-item-photo"
tabindex="-1">
<?= $productImage->toHtml() ?>
</a>
<div class="product details product-item-details">
<?php $_productNameStripped = $block->stripTags($_product->getName(), null, true); ?>
<strong class="product name product-item-name">
<a class="product-item-link"
href="<?= $escaper->escapeUrl($_product->getProductUrl()) ?>">
<?=/* @noEscape */ $_helper->productAttribute($_product, $_product->getName(), 'name')?>
</a>
<?php
/* Add Salable Qty */
$qty = $_helper->getProductSalableQty($_product->getSku());
$SalableQty = 0;
if (isset($qty[0]['qty'])) {
$SalableQty = $qty[0]['qty'];
}
?>
<br/>
<span>Salable Qty : <?= $SalableQty ?> </span>
</strong>
<?= $block->getReviewsSummaryHtml($_product, $templateType) ?>
<?= /* @noEscape */ $block->getProductPrice($_product) ?>
<?= $block->getProductDetailsHtml($_product) ?>
<div class="product-item-inner">
<div class="product actions product-item-actions">
<div class="actions-primary">
<?php if ($_product->isSaleable()):?>
<?php $postParams = $block->getAddToCartPostParams($_product); ?>
<form data-role="tocart-form"
data-product-sku="<?= $escaper->escapeHtml($_product->getSku()) ?>"
action="<?= $escaper->escapeUrl($postParams['action']) ?>"
method="post">
<?php $optionsData = $block->getData('viewModel')->getOptionsData($_product); ?>
<?php foreach ($optionsData as $optionItem): ?>
<input type="hidden"
name="<?= $escaper->escapeHtml($optionItem['name']) ?>"
value="<?= $escaper->escapeHtml($optionItem['value']) ?>">
<?php endforeach; ?>
<input type="hidden"
name="product"
value="<?= /* @noEscape */ $postParams['data']['product'] ?>">
<input type="hidden"
name="<?= /* @noEscape */ Action::PARAM_NAME_URL_ENCODED ?>"
value="<?=
/* @noEscape */ $postParams['data'][Action::PARAM_NAME_URL_ENCODED]
?>">
<?= $block->getBlockHtml('formkey') ?>
<button type="submit"
title="<?= $escaper->escapeHtmlAttr(__('Add to Cart')) ?>"
class="action tocart primary"
disabled>
<span><?= $escaper->escapeHtml(__('Add to Cart')) ?></span>
</button>
</form>
<?php else:?>
<?php if ($_product->isAvailable()):?>
<div class="stock available">
<span><?= $escaper->escapeHtml(__('In stock')) ?></span></div>
<?php else:?>
<div class="stock unavailable">
<span><?= $escaper->escapeHtml(__('Out of stock')) ?></span></div>
<?php endif; ?>
<?php endif; ?>
</div>
<?= strpos($pos, $viewMode . '-primary') ?
/* @noEscape */ $secureRenderer->renderStyleAsTag(
$position,
'product-item-info_' . $_product->getId() . ' div.actions-primary'
) : '' ?>
<div data-role="add-to-links" class="actions-secondary">
<?php if ($addToBlock = $block->getChildBlock('addto')): ?>
<?= $addToBlock->setProduct($_product)->getChildHtml() ?>
<?php endif; ?>
</div>
<?= strpos($pos, $viewMode . '-secondary') ?
/* @noEscape */ $secureRenderer->renderStyleAsTag(
$position,
'product-item-info_' . $_product->getId() . ' div.actions-secondary'
) : '' ?>
</div>
<?php if ($showDescription): ?>
<div class="product description product-item-description">
<?= /* @noEscape */ $_helper->productAttribute(
$_product,
$_product->getShortDescription(),
'short_description'
) ?>
<a href="<?= $escaper->escapeUrl($_product->getProductUrl()) ?>"
title="<?= /* @noEscape */ $_productNameStripped ?>"
class="action more"><?= $escaper->escapeHtml(__('Learn More')) ?></a>
</div>
<?php endif; ?>
</div>
</div>
</div>
<?= strpos($pos, $viewMode . '-actions') ?
/* @noEscape */ $secureRenderer->renderStyleAsTag(
$position,
'product-item-info_' . $_product->getId() . ' div.product-item-actions'
) : '' ?>
</li>
<?php endforeach; ?>
</ol>
</div>
<?= $block->getChildBlock('toolbar')->setIsBottom(true)->toHtml() ?>
<script type="text/x-magento-init">
{
"[data-role=tocart-form], .form.map.checkout": {
"catalogAddToCart": {
"product_sku": "<?= $escaper->escapeJs($_product->getSku()) ?>"
}
}
}
</script>
<?php endif; ?>