Magento2, show unselectable configurable option for out of stock simple products
I'm trying to add an unselectable out of stock option with details to a configurable product drop down.
This is so that customers know when product options will be in stock.
I've worked out how to show out of stock configurable options using di injection of the code below.
- How do we disable the product from being selected in knockoutjs?
- How do we add the preorder date to the name of the option?
- Ideally the solution doesn't use deprecated classes
I'm trying to achieve something like this:
Here's the simple product's attributes:
Here's the code I've got so far, which allows the simple product to show even if it's out of stock: It is using deprecated class StockRegistryInterface
use MagentoCatalogHelperImage as ImageHelper;
use MagentoConfigurableProductHelperData as ConfigurableHelper;
use MagentoCatalogInventoryApiStockRegistryInterface;
/**
* Class Data
* Helper class for getting options
*/
class Data extends ConfigurableHelper
{
/**
* @var MagentoCatalogInventoryApiStockRegistryInterface
*/
protected $stockRegistry;
/**
* Data constructor.
*
* @param MagentoCatalogHelperImage $imageHelper
* @param MagentoCatalogInventoryApiStockRegistryInterface $stockRegistry // This is deprecated
*/
public function __construct(
ImageHelper $imageHelper,
StockRegistryInterface $stockRegistry
)
{
parent::__construct($imageHelper);
$this->stockRegistry = $stockRegistry;
}
/**
* Get Options for Configurable Product Options
*
* @param MagentoCatalogModelProduct $currentProduct
* @param array $allowedProducts
* @return array
*/
public function getOptions($currentProduct, $allowedProducts)
{
$options = ;
foreach ($allowedProducts as $product) {
$productId = $product->getId();
//$stockItem = $this->stockRegistry->getStockItem($productId, $product->getStore()->getWebsiteId());
//if ($stockItem->getQty() < 1) continue;
$images = $this->getGalleryImages($product);
if ($images) {
foreach ($images as $image) {
$options['images'][$productId] =
[
'thumb' => $image->getData('small_image_url'),
'img' => $image->getData('medium_image_url'),
'full' => $image->getData('large_image_url'),
'caption' => $image->getLabel(),
'position' => $image->getPosition(),
'isMain' => $image->getFile() == $product->getImage(),
];
}
}
foreach ($this->getAllowAttributes($currentProduct) as $attribute) {
$productAttribute = $attribute->getProductAttribute();
$productAttributeId = $productAttribute->getId();
$attributeValue = $product->getData($productAttribute->getAttributeCode());
$options[$productAttributeId][$attributeValue] = $productId;
$options['index'][$productId][$productAttributeId] = $attributeValue;
}
}
return $options;
}
}
magento2 configurable-product knockoutjs out-of-stock drop-downs
add a comment |
I'm trying to add an unselectable out of stock option with details to a configurable product drop down.
This is so that customers know when product options will be in stock.
I've worked out how to show out of stock configurable options using di injection of the code below.
- How do we disable the product from being selected in knockoutjs?
- How do we add the preorder date to the name of the option?
- Ideally the solution doesn't use deprecated classes
I'm trying to achieve something like this:
Here's the simple product's attributes:
Here's the code I've got so far, which allows the simple product to show even if it's out of stock: It is using deprecated class StockRegistryInterface
use MagentoCatalogHelperImage as ImageHelper;
use MagentoConfigurableProductHelperData as ConfigurableHelper;
use MagentoCatalogInventoryApiStockRegistryInterface;
/**
* Class Data
* Helper class for getting options
*/
class Data extends ConfigurableHelper
{
/**
* @var MagentoCatalogInventoryApiStockRegistryInterface
*/
protected $stockRegistry;
/**
* Data constructor.
*
* @param MagentoCatalogHelperImage $imageHelper
* @param MagentoCatalogInventoryApiStockRegistryInterface $stockRegistry // This is deprecated
*/
public function __construct(
ImageHelper $imageHelper,
StockRegistryInterface $stockRegistry
)
{
parent::__construct($imageHelper);
$this->stockRegistry = $stockRegistry;
}
/**
* Get Options for Configurable Product Options
*
* @param MagentoCatalogModelProduct $currentProduct
* @param array $allowedProducts
* @return array
*/
public function getOptions($currentProduct, $allowedProducts)
{
$options = ;
foreach ($allowedProducts as $product) {
$productId = $product->getId();
//$stockItem = $this->stockRegistry->getStockItem($productId, $product->getStore()->getWebsiteId());
//if ($stockItem->getQty() < 1) continue;
$images = $this->getGalleryImages($product);
if ($images) {
foreach ($images as $image) {
$options['images'][$productId] =
[
'thumb' => $image->getData('small_image_url'),
'img' => $image->getData('medium_image_url'),
'full' => $image->getData('large_image_url'),
'caption' => $image->getLabel(),
'position' => $image->getPosition(),
'isMain' => $image->getFile() == $product->getImage(),
];
}
}
foreach ($this->getAllowAttributes($currentProduct) as $attribute) {
$productAttribute = $attribute->getProductAttribute();
$productAttributeId = $productAttribute->getId();
$attributeValue = $product->getData($productAttribute->getAttributeCode());
$options[$productAttributeId][$attributeValue] = $productId;
$options['index'][$productId][$productAttributeId] = $attributeValue;
}
}
return $options;
}
}
magento2 configurable-product knockoutjs out-of-stock drop-downs
add a comment |
I'm trying to add an unselectable out of stock option with details to a configurable product drop down.
This is so that customers know when product options will be in stock.
I've worked out how to show out of stock configurable options using di injection of the code below.
- How do we disable the product from being selected in knockoutjs?
- How do we add the preorder date to the name of the option?
- Ideally the solution doesn't use deprecated classes
I'm trying to achieve something like this:
Here's the simple product's attributes:
Here's the code I've got so far, which allows the simple product to show even if it's out of stock: It is using deprecated class StockRegistryInterface
use MagentoCatalogHelperImage as ImageHelper;
use MagentoConfigurableProductHelperData as ConfigurableHelper;
use MagentoCatalogInventoryApiStockRegistryInterface;
/**
* Class Data
* Helper class for getting options
*/
class Data extends ConfigurableHelper
{
/**
* @var MagentoCatalogInventoryApiStockRegistryInterface
*/
protected $stockRegistry;
/**
* Data constructor.
*
* @param MagentoCatalogHelperImage $imageHelper
* @param MagentoCatalogInventoryApiStockRegistryInterface $stockRegistry // This is deprecated
*/
public function __construct(
ImageHelper $imageHelper,
StockRegistryInterface $stockRegistry
)
{
parent::__construct($imageHelper);
$this->stockRegistry = $stockRegistry;
}
/**
* Get Options for Configurable Product Options
*
* @param MagentoCatalogModelProduct $currentProduct
* @param array $allowedProducts
* @return array
*/
public function getOptions($currentProduct, $allowedProducts)
{
$options = ;
foreach ($allowedProducts as $product) {
$productId = $product->getId();
//$stockItem = $this->stockRegistry->getStockItem($productId, $product->getStore()->getWebsiteId());
//if ($stockItem->getQty() < 1) continue;
$images = $this->getGalleryImages($product);
if ($images) {
foreach ($images as $image) {
$options['images'][$productId] =
[
'thumb' => $image->getData('small_image_url'),
'img' => $image->getData('medium_image_url'),
'full' => $image->getData('large_image_url'),
'caption' => $image->getLabel(),
'position' => $image->getPosition(),
'isMain' => $image->getFile() == $product->getImage(),
];
}
}
foreach ($this->getAllowAttributes($currentProduct) as $attribute) {
$productAttribute = $attribute->getProductAttribute();
$productAttributeId = $productAttribute->getId();
$attributeValue = $product->getData($productAttribute->getAttributeCode());
$options[$productAttributeId][$attributeValue] = $productId;
$options['index'][$productId][$productAttributeId] = $attributeValue;
}
}
return $options;
}
}
magento2 configurable-product knockoutjs out-of-stock drop-downs
I'm trying to add an unselectable out of stock option with details to a configurable product drop down.
This is so that customers know when product options will be in stock.
I've worked out how to show out of stock configurable options using di injection of the code below.
- How do we disable the product from being selected in knockoutjs?
- How do we add the preorder date to the name of the option?
- Ideally the solution doesn't use deprecated classes
I'm trying to achieve something like this:
Here's the simple product's attributes:
Here's the code I've got so far, which allows the simple product to show even if it's out of stock: It is using deprecated class StockRegistryInterface
use MagentoCatalogHelperImage as ImageHelper;
use MagentoConfigurableProductHelperData as ConfigurableHelper;
use MagentoCatalogInventoryApiStockRegistryInterface;
/**
* Class Data
* Helper class for getting options
*/
class Data extends ConfigurableHelper
{
/**
* @var MagentoCatalogInventoryApiStockRegistryInterface
*/
protected $stockRegistry;
/**
* Data constructor.
*
* @param MagentoCatalogHelperImage $imageHelper
* @param MagentoCatalogInventoryApiStockRegistryInterface $stockRegistry // This is deprecated
*/
public function __construct(
ImageHelper $imageHelper,
StockRegistryInterface $stockRegistry
)
{
parent::__construct($imageHelper);
$this->stockRegistry = $stockRegistry;
}
/**
* Get Options for Configurable Product Options
*
* @param MagentoCatalogModelProduct $currentProduct
* @param array $allowedProducts
* @return array
*/
public function getOptions($currentProduct, $allowedProducts)
{
$options = ;
foreach ($allowedProducts as $product) {
$productId = $product->getId();
//$stockItem = $this->stockRegistry->getStockItem($productId, $product->getStore()->getWebsiteId());
//if ($stockItem->getQty() < 1) continue;
$images = $this->getGalleryImages($product);
if ($images) {
foreach ($images as $image) {
$options['images'][$productId] =
[
'thumb' => $image->getData('small_image_url'),
'img' => $image->getData('medium_image_url'),
'full' => $image->getData('large_image_url'),
'caption' => $image->getLabel(),
'position' => $image->getPosition(),
'isMain' => $image->getFile() == $product->getImage(),
];
}
}
foreach ($this->getAllowAttributes($currentProduct) as $attribute) {
$productAttribute = $attribute->getProductAttribute();
$productAttributeId = $productAttribute->getId();
$attributeValue = $product->getData($productAttribute->getAttributeCode());
$options[$productAttributeId][$attributeValue] = $productId;
$options['index'][$productId][$productAttributeId] = $attributeValue;
}
}
return $options;
}
}
magento2 configurable-product knockoutjs out-of-stock drop-downs
magento2 configurable-product knockoutjs out-of-stock drop-downs
edited 8 mins ago
Pathfinder
asked 14 mins ago
PathfinderPathfinder
13811
13811
add a comment |
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "479"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f257921%2fmagento2-show-unselectable-configurable-option-for-out-of-stock-simple-products%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Magento Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fmagento.stackexchange.com%2fquestions%2f257921%2fmagento2-show-unselectable-configurable-option-for-out-of-stock-simple-products%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
var $window = $(window),
onScroll = function(e) {
var $elem = $('.new-login-left'),
docViewTop = $window.scrollTop(),
docViewBottom = docViewTop + $window.height(),
elemTop = $elem.offset().top,
elemBottom = elemTop + $elem.height();
if ((docViewTop elemBottom)) {
StackExchange.using('gps', function() { StackExchange.gps.track('embedded_signup_form.view', { location: 'question_page' }); });
$window.unbind('scroll', onScroll);
}
};
$window.on('scroll', onScroll);
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown