Zend certified PHP/Magento developer

Get all associated products from configurable product. (Magento 2)

Currently, I am not getting the out-of-stock products from the configurable product on the product page (product/view controller).

File :

<?php
/**
* Product view controller
*/
namespace MagentoProductRedirectionControllerIndex;
use MagentoCatalogApiProductRepositoryInterface;
use MagentoCatalogModelDesign;
use MagentoFrameworkAppActionHttpPostActionInterface as HttpPostActionInterface;
use MagentoFrameworkAppActionHttpGetActionInterface as HttpGetActionInterface;
use MagentoFrameworkAppActionContext;
use MagentoFrameworkAppObjectManager;
use MagentoFrameworkControllerResultForward;
use MagentoFrameworkControllerResultForwardFactory;
use MagentoFrameworkControllerResultRedirect;
use MagentoFrameworkDataObject;
use MagentoFrameworkExceptionNoSuchEntityException;
use MagentoFrameworkJsonHelperData;
use MagentoFrameworkViewResultPageFactory;
use MagentoCatalogControllerProduct as ProductAction;
use MagentoStoreModelStoreManagerInterface;
use PsrLogLoggerInterface;
use MagentoCatalogModelProduct;
/**
* View a product on storefront. Needs to be accessible by POST because of the store switching
*
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class View extends MagentoCatalogControllerProductView
{
/**
* @var MagentoCatalogHelperProductView
*/
protected $viewHelper;
/**
* @var ForwardFactory
*/
protected $resultForwardFactory;
/**
* @var PageFactory
*/
protected $resultPageFactory;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var Data
*/
private $jsonHelper;
/**
* @var Design
*/
private $catalogDesign;
/**
* @var ProductRepositoryInterface
*/
private $productRepository;
/**
* @var StoreManagerInterface
*/
private $storeManager;
/**
* @var MagentoCatalogInventoryApiStockStateInterface
*/
protected $_stockState;
/**
* Constructor
*
* @param Context $context
* @param MagentoCatalogHelperProductView $viewHelper
* @param ForwardFactory $resultForwardFactory
* @param PageFactory $resultPageFactory
* @param LoggerInterface|null $logger
* @param Data|null $jsonHelper
* @param Design|null $catalogDesign
* @param ProductRepositoryInterface|null $productRepository
* @param StoreManagerInterface|null $storeManager
*/
public function __construct(
Context $context,
MagentoCatalogHelperProductView $viewHelper,
ForwardFactory $resultForwardFactory,
PageFactory $resultPageFactory,
?LoggerInterface $logger = null,
?Data $jsonHelper = null,
?Design $catalogDesign = null,
?ProductRepositoryInterface $productRepository = null,
?StoreManagerInterface $storeManager = null,
MagentoCatalogInventoryApiStockStateInterface $stockState,
MagentoCatalogModelProductFactory $_productloader,
MagentoCatalogModelCategoryRepository $categoryRepository
) {
parent::__construct($context,$viewHelper,$resultForwardFactory,$resultPageFactory,$logger,$jsonHelper,$catalogDesign,$productRepository,$storeManager);
$this->viewHelper = $viewHelper;
$this->resultForwardFactory = $resultForwardFactory;
$this->resultPageFactory = $resultPageFactory;
$this->logger = $logger ?: ObjectManager::getInstance()
->get(LoggerInterface::class);
$this->jsonHelper = $jsonHelper ?: ObjectManager::getInstance()
->get(Data::class);
$this->catalogDesign = $catalogDesign ?: ObjectManager::getInstance()
->get(Design::class);
$this->productRepository = $productRepository ?: ObjectManager::getInstance()
->get(ProductRepositoryInterface::class);
$this->storeManager = $storeManager ?: ObjectManager::getInstance()
->get(StoreManagerInterface::class);
$this->_stockState = $stockState;
$this->_productloader = $_productloader;
$this->categoryRepository = $categoryRepository;
}
/**
* Redirect if product failed to load
*
* @return Redirect|Forward
*/
protected function noProductRedirect()
{
$store = $this->getRequest()->getQuery('store');
if (isset($store) && !$this->getResponse()->isRedirect()) {
$resultRedirect = $this->resultRedirectFactory->create();
return $resultRedirect->setPath('');
} elseif (!$this->getResponse()->isRedirect()) {
$resultForward = $this->resultForwardFactory->create();
$resultForward->forward('noroute');
return $resultForward;
}
}
/**
* Category redirection
*
* @return Forward|Redirect
*/
public function categoryRedirect($productId)
{   
$product = $this->_productloader->create()->load($productId);
// Check if product is configurable.
if($product->getTypeId() == MagentoConfigurableProductModelProductTypeConfigurable::TYPE_CODE){
$allChildrenproducts = $product->getTypeInstance()->getUsedProducts($product);
foreach ($allChildrenproducts as $childrednProducts) {
$qty = $this->_stockState->getStockQty($childrednProducts->getID());
if($qty < 1){
$categories = $product->getCategoryIds();
foreach($categories as $category){
$categorydata = $this->categoryRepository->get($category);
$categoryurl = $categorydata->getUrl();
return $categoryurl;
}
}
}
} else {
$qty = $this->_stockState->getStockQty($productId);
if($qty < 1){
$categories = $product->getCategoryIds();
foreach($categories as $category){
$categorydata = $this->categoryRepository->get($category);
$categoryurl = $categorydata->getUrl();
return $categoryurl;
}
}
} 
}
/**
* Product view action
*
* @return Forward|Redirect
*/
public function execute()
{
// Get initial data from request
$categoryId = (int) $this->getRequest()->getParam('category', false);
$productId = (int) $this->getRequest()->getParam('id');
$specifyOptions = $this->getRequest()->getParam('options');
$redirectOosProduct = $this->categoryRedirect($productId);
if($redirectOosProduct){
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setUrl($redirectOosProduct)->setHttpResponseCode('301');
return $resultRedirect;
}
if ($this->getRequest()->isPost() && $this->getRequest()->getParam(self::PARAM_NAME_URL_ENCODED)) {
$product = $this->_initProduct();
if (!$product) {
return $this->noProductRedirect();
}
if ($specifyOptions) {
$notice = $product->getTypeInstance()->getSpecifyOptionMessage();
$this->messageManager->addNoticeMessage($notice);
}
if ($this->getRequest()->isAjax()) {
$this->getResponse()->representJson(
$this->jsonHelper->jsonEncode(
[
'backUrl' => $this->_redirect->getRedirectUrl()
]
)
);
return;
}
$resultRedirect = $this->resultRedirectFactory->create();
$resultRedirect->setUrl($this->_url->getCurrentUrl());
return $resultRedirect;
}
// Prepare helper and params
$params = new DataObject();
$params->setCategoryId($categoryId);
$params->setSpecifyOptions($specifyOptions);
// Render page
try {
$this->applyCustomDesign($productId);
$page = $this->resultPageFactory->create();
$this->viewHelper->prepareAndRender($page, $productId, $this, $params);
return $page;
} catch (NoSuchEntityException $e) {
return $this->noProductRedirect();
} catch (Exception $e) {
$this->logger->critical($e);
$resultForward = $this->resultForwardFactory->create();
$resultForward->forward('noroute');
return $resultForward;
}
}
/**
* Apply custom design from product design settings
*
* @param int $productId
* @throws NoSuchEntityException
*/
private function applyCustomDesign(int $productId): void
{
$product = $this->productRepository->getById($productId, false, $this->storeManager->getStore()->getId());
$settings = $this->catalogDesign->getDesignSettings($product);
if ($settings->getCustomDesign()) {
$this->catalogDesign->applyCustomDesign($settings->getCustomDesign());
}
}
}