The question:
How to get an option value based on the option id in Magento, or get an option id based on the option code ?
Example: how to get the color attribute option id 10 from the label “Red”, and get the value “Red” if the option id is 10 ?
The Solutions:
Below are the methods you can try. The first solution is probably the best. Try others if the first one doesn’t work. Senior developers aren’t just copying/pasting – they read the methods carefully & apply them wisely to each case.
Method 1
you can do it same as magento 1,
More information in details, Visit, Get Option id and Label from configurable product
//get option label based on option id from product object
$optionId = 10;
$attr = $_product->getResource()->getAttribute('color');
if ($attr->usesSource()) {
$optionText = $attr->getSource()->getOptionText($optionId);
}
//get option text ex. Red
//get option id based on option label
$attr = $_product->getResource()->getAttribute('color');
if ($attr->usesSource()) {
$option_id = $attr->getSource()->getOptionId("Red");
}
//get option id ex. 10
Method 2
i get a simple solution.
this will only show the attribute value with the attribute code for a product. i have checked in catalog and details page.
the code is
<?php echo $_product->getAttributeText('size'); ?>
here size is the attribute name.
reference: vendor/magento/module-catalog/view/frontend/templates/product/view/attribute.phtml line: 35
Method 3
Worked for me
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Method 4
Best practice in magento is to do it via xml.
To get a standard attribute like brand
you do something like this in catalog_product_view.xml
for example:
<referenceBlock name="product.info.main">
<block class="MagentoCatalogBlockProductViewDescription" name="product.info.brand" template="product/view/attribute.phtml" before="-">
<arguments>
<argument name="at_call" xsi:type="string">getBrand</argument>
<argument name="at_code" xsi:type="string">brand</argument>
<argument name="css_class" xsi:type="string">brand</argument>
<argument name="at_label" xsi:type="string">none</argument>
<argument name="add_attribute" xsi:type="string">itemprop="brand"</argument>
</arguments>
</block>
</referenceBlock>
This will get the value of an input attribute or textarea. If you have a dropdown you should use the text type, so add this line in the list of arguments:
<argument name="at_type" xsi:type="string">text</argument>
No need to create files or write any php code to get an attribute. This way you will have consistency and use the same attribute.phtml file for all attributes. If something changes you need to change it in one place only.
Method 5
Use Factory Method
protected $_attributeLoading;
public function __construct(
.....
MagentoCatalogModelResourceModelProductFactory $attributeLoading,
....
) {
parent::__construct($context);
....
$this->_attributeLoading = $attributeLoading;
....
}
public function getAttributeOptionId($attribute,$label)
{
$poductReource=$this->_attributeLoading->create();
$attr = $poductReource->getAttribute($attribute);
if ($attr->usesSource()) {
return $option_id = $attr->getSource()->getOptionId($label);
}
}
public function getAttributeOptionText($attribute,$label)
{
$poductReource=$this->_attributeLoading->create();
$attr = $poductReource->getAttribute($attribute);
if ($attr->usesSource()) {
return $option_Text = $attr->getSource()->getOptionText($label);
}
}
in phtml file
$this->getAttributeOptionId('color','//optionLabel');
$this->getAttributeOptionText('color','//optionId');
Method 6
$product->getResource()
has a DocBlock note about being deprecated at least in v2.2.2 and so I was hesitant to code using it. Came up with this solution instead inspired by the ones already on this page:
$optionId = $product->getDataByKey('attribute_code');
$optionText = null;
$attributes = $product->getAttributes();
if ($optionId && array_key_exists('attribute_code', $attributes)) {
$attr = $attributes['attribute_code'];
if ($attr->usesSource()) {
$optionText = $attr->getSource()->getOptionText($optionId);
}
}
if ($optionText) {
//do something with $optionText
}
For reference this is the method in AbstractModel.php
/**
* Retrieve model resource
*
* @return MagentoFrameworkModelResourceModelDbAbstractDb
* @deprecated 101.0.0 because resource models should be used directly
*/
public function getResource()
{
return $this->_getResource();
}
Method 7
For everyone comes here.
If you don’t have any product entity, you could retrieve an option value with this steps.
Inject MagentoEavApiAttributeRepositoryInterface
to your class
public function __construct(
...
MagentoEavApiAttributeRepositoryInterface $attributeRepository,
...
) {
...
$this->attributeRepository = $attributeRepository;
...
}
Use the repo to get the attribute instance
// 4 is the default entity_type_id for product
$attribute = $this->attributeRepository->get('4', '[attribute_code]');
Use $attribute
to get the option id from the option value
$optionId = $attribute->getSource()->getOptionId('[option_value]');
Method 8
you can use for getting attribute label
$product->getResource()->getAttribute($key)->getFrontend()->getLabel($product);
you can using object manager :
$pid = 1;
$objectManager = MagentoFrameworkAppObjectManager::getInstance();
$pdata = $objectManager->create('MagentoCatalogModelProduct')->load($pid);
$getlable = $pdata->getResource()->getAttribute($key)->getFrontend()->getLabel($pdata);
Method 9
Please try this code
Step 1)First you have to load the products
$_productCollection = $block->getLoadedProductCollection();
Step 2)In the product listing page ,there will be a foreach loop for listing the products like this
foreach ($_productCollection as $_product)
Step3)Your code will be inside this loop.Place the below code at a place whereever you want to display the attribute label.
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Just replace your_attribute_code with whatever your attribute is named.
Method 10
You can use this method: MagentoCatalogModelProduct::getAttributeText()
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0