Magento2, show unselectable configurable option for out of stock simple products












0















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:



goal example



Here's the simple product's attributes:



configuration so far



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









share|improve this question





























    0















    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:



    goal example



    Here's the simple product's attributes:



    configuration so far



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









    share|improve this question



























      0












      0








      0








      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:



      goal example



      Here's the simple product's attributes:



      configuration so far



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









      share|improve this question
















      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:



      goal example



      Here's the simple product's attributes:



      configuration so far



      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 8 mins ago







      Pathfinder

















      asked 14 mins ago









      PathfinderPathfinder

      13811




      13811






















          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
          });


          }
          });














          draft saved

          draft discarded


















          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
















          draft saved

          draft discarded




















































          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.




          draft saved


          draft discarded














          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





















































          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







          Popular posts from this blog

          Polycentropodidae

          Magento 2 Error message: Invalid state change requested

          Paulmy