Question

I am trying to show the attribute's dropdown values selected in product. For that I am using this way.

<?php $parentIds = $objectManager->create('Magento\ConfigurableProduct\Model\ResourceModel\Product\Type\Configurable')->getParentIdsByChild($_product->getId());

if(count($parentIds)>0 && $_product->getTypeId() == "simple")
    {
        /*?><script>console.log('<?php echo $_product->getSku(); ?>')</script><?php */
    }
else { 
        foreach ($_productCollection as $_product) :
            $_p = $objectManager->get('Magento\Catalog\Model\Product')->load($_product->getId());
            $productList[] = $_p;
            $priceRuleCats = $_p->getprice_rule_category();

            if(!empty($priceRuleCats)){
                $priceRuleList = array_unique(array_merge($priceRuleList,explode(',',$priceRuleCats)));
            }
        endforeach;    
    // save the full list 
    $fullList = $productList;

    $objectManager = \Magento\Framework\App\ObjectManager::getInstance(); 
    $price_rules = $objectManager->get('Startupready\PriceRules\Model\Quantitybreaks');
    $price_rules->load($priceRuleList);
    $price_rules->getPricingTables();

    $current_table = 0;
    $size_options = array();
    $price_breaks = array();

    // use first product from loop to see what the size options are & load price breaks for those options
    $firstProduct = array_shift($productList);

    // this product's price rule category
    $price_rule_category = $firstProduct->getprice_rule_category();

    // loop through simple products
    $conf = $objectManager->create('Magento\ConfigurableProduct\Model\Product\Type\Configurable')->setProduct($firstProduct);
    $simple_collection = $conf->getUsedProductCollection()->addAttributeToSelect('*')->addFilterByRequiredOptions();
    foreach($simple_collection as $simple){
        echo $simple->getsize_option();
        //also i tried like this
        //echo "<pre>"; print_r($simple['size_option']); echo "</pre>";
    }
?>

but when I am putting my code inside the list.phtml file, no any products are displaying on this page.

Meanwhile I am just trying to get that product attribute inside this array so that if a product have assigned this values (doropdown values) then I'll show those values in frontend. Kindly please help me to do this. Thank in advance.

Was it helpful?

Solution

First, I should start by saying that it is NOT recommended practice to directly instantiate the Object Manager. You can read more about that here. Although, it is not preventing your code from working.

Second, this logic does not belong in a template phtml file. You should be creating your own module, a small one, that runs through the logic and lets it echo out onto the page via a method call within your phtml file. Also, if you had a module, you could implement the necessary dependency injection to retrieve your data.

Thirdly, inside of the $_productCollection loop, you are calling $_p->load($_product->getId()). This is not only unnecessary but super inefficient.

Let it be known that the code sample below is enough to obtain the info you want to display, but by no means would I recommend implementing your custom code in this manner. So, once you get the data you seek, please see Alan Storm's Magento 2 Tutorial Series and patiently go through them from beginning to end. This will help you gain a better understanding as to how certain crucial elements on Magento 2 work.


Here is the quick and dirty way to get the data requested in your original question:

Find the line in the list.phtml file that looks like this <?php foreach($_productCollection as $_product): ?>. This is not the loop you created, but the loop that was already in the file before you edited it.

Completely replace this line:

<?php foreach($_productCollection as $_product): ?>

With this:

<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
/** @var \Magento\ConfigurableProduct\Model\Product\Type\ConfigurableFactory $configurableFactory */
$configurableFactory = $objectManager->create('Magento\ConfigurableProduct\Model\Product\Type\ConfigurableFactory');
?>

<?php /** @var $_product \Magento\Catalog\Model\Product */ ?>
<?php foreach($_productCollection as $_product): ?>

    <?php
    if($_product->getTypeId() == \Magento\ConfigurableProduct\Model\Product\Type\Configurable::TYPE_CODE) {
        /** @var \Magento\ConfigurableProduct\Model\Product\Type\Configurable $configurable */
        $configurable = $configurableFactory->create();

        // 3 options to get attributes, but i am using
        # $attributes = $configurable->getConfigurableAttributes($_product);
        # $attributes = $configurable->getConfigurableAttributeCollection($_product);

        $attributes = $configurable->getConfigurableAttributesAsArray($_product);
        foreach($attributes as $attrId => $attribute){
            echo '<pre>',print_r($attribute),'</pre>';
        }
    }
    ?>

This will expose all of the available data for each product and then you can do whatever you need to.

Licensed under: CC-BY-SA with attribution
Not affiliated with magento.stackexchange
scroll top