How can we get all the possible options for an attribute by attribute id?
I tried this but getting an empty data:
protected $optionFactory;
protected $_attributeOptionCollection;
public function __construct(
\Magento\Eav\Api\Data\AttributeOptionInterfaceFactory $optionFactory,
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection $attributeOptionCollection
){
$this->optionFactory = $optionFactory;
$this->_attributeOptionCollection = $attributeOptionCollection;
}$optionValue = 53; // your attribute value
$optionFactory = $this->optionFactory->create();
$optionFactory->load($optionValue); // load by option value
$attributeId = $optionFactory->getAttributeId(); // atribute id of given option value
$optionData = $this->_attributeOptionCollection
->setPositionOrder('asc')
->setAttributeFilter($attributeId)
->setIdFilter($optionValue)
->setStoreFilter()
->load(); // load option data by attribute id and given option value
echo "<pre>"; print_r($optionData->getData()); exit;
Solved! Go to Solution.
Hello @tvgarden,
Please check below code and I have created sample code of color attribute, you can replace with your attribute
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require 'app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$app = $bootstrap->createApplication('Magento\Framework\App\Http');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Magento\Framework\App\State')->setAreaCode('frontend'); // adminhtml
$eavConfig = $objectManager->create('\Magento\Eav\Model\Config');
$attributeCode = 'color';
$attribute = $eavConfig->getAttribute('catalog_product', $attributeCode);
$options = $attribute->getSource()->getAllOptions();
print '<pre>';
print_r($options);
// $bootstrap->run($app);You can also check result https://www.screencast.com/t/o6veC3NT43
--
If my answer is useful, please Accept as Solution & give Kudos
Hello @tvgarden
Using Dependency Injection (DI)
Sample File Path: app/code/YourCompanyName/YourModuleName/Block/YourCustomBlock.php
<?php
namespace YourCompanyName\YourModuleName\Block;
class YourCustomBlock extends \Magento\Framework\View\Element\Template {
/**
* @var \Magento\Eav\Model\Entity\Attribute
*/
protected $_entityAttribute;
/**
* @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection
*/
protected $_entityAttributeCollection;
/**
* @var \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection
*/
protected $_entityAttributeOptionCollection;
/**
* @param \Magento\Framework\View\Element\Template\Context $context
* @param \Magento\Eav\Model\Entity\Attribute $entityAttribute
* @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection $eavEntityAttributeCollection
* @param \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection $entityAttributeOptionCollection
* @param array $data
*/
public function __construct(
\Magento\Framework\View\Element\Template\Context $context,
\Magento\Eav\Model\Entity\Attribute $entityAttribute,
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection $entityAttributeCollection,
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection $entityAttributeOptionCollection,
array $data = []
) {
$this->_entityAttribute = $entityAttribute;
$this->_entityAttributeCollection = $entityAttributeCollection;
$this->_entityAttributeOptionCollection = $entityAttributeOptionCollection;
parent::__construct($context, $data);
}
/**
* Get attribute info by attribute code and entity type
*
* @param mixed $entityType can be integer, string, or instance of class Mage\Eav\Model\Entity\Type
* @param string $attributeCode
* @return \Magento\Eav\Model\Entity\Attribute
*/
public function getAttributeInfo($entityType, $attributeCode)
{
return $this->_entityAttribute->loadByCode($entityType, $attributeCode);
}
/**
* Get all options name and value of the attribute
*
* @param int $attributeId
* @return \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection
*/
public function getAttributeOptionAll($attributeId)
{
return $this->_attributeOptionCollection
->setPositionOrder('asc')
->setAttributeFilter($attributeId)
->setStoreFilter()
->load();
}
/**
* Get particular option's name and value of the attribute
*
* @param int $attributeId
* @param int $optionId
* @return \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection
*/
public function getAttributeOptionById($attributeId, $optionId)
{
return $this->_attributeOptionCollection
->setPositionOrder('asc')
->setAttributeFilter($attributeId)
->setIdFilter($optionId)
->setStoreFilter()
->load();
}
/**
* Get the first option's name and value of the attribute
*
* @param int $attributeId
* @return \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection
*/
public function getAttributeFirstOption($attributeId)
{
return $this->_attributeOptionCollection
->setPositionOrder('asc')
->setAttributeFilter($attributeId)
->load()
->getFirstItem();
}
}Now, we can use the functions in our view (.phtml) file as follows. Here, we will be fetching attribute data for attribute “style_bags”.$attributeCode = 'style_bags'; $entityType = 'catalog_product'; $attributeInfo = $block->getAttributeInfo($entityType, $attributeCode); var_dump($attributeInfo->getData()); $attributeId = $attributeInfo->getAttributeId(); $optionId = 26; $attributeOptionAll = $block->getAttributeOptionAll($attributeId); var_dump($attributeOptionAll->getData()); $attributeOptionSingle = $block->getAttributeOptionById($attributeId, $optionId); var_dump($attributeOptionSingle->getData()); $attributeOptionSingle = $block->getAttributeFirstOption($attributeId); var_dump($attributeOptionSingle->getData());
/**
* Get attribute info by attribute code and entity type
*/
$attributeCode = 'style_bags';
$entityType = 'catalog_product';
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$attributeInfo = $objectManager->get(\Magento\Eav\Model\Entity\Attribute::class)
->loadByCode($entityType, $attributeCode);
var_dump($attributeInfo->getData());
/**
* Get all options name and value of the attribute
*/
$attributeId = $attributeInfo->getAttributeId();
$attributeOptionAll = $objectManager->get(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection::class)
->setPositionOrder('asc')
->setAttributeFilter($attributeId)
->setStoreFilter()
->load();
var_dump($attributeOptionAll->getData());
/**
* Get particular option's name and value of the attribute
*/
$optionId = 26;
$attributeOptionSingle = $objectManager->get(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection::class)
->setPositionOrder('asc')
->setAttributeFilter($attributeId)
->setIdFilter($optionId)
->setStoreFilter()
->load();
var_dump($attributeOptionSingle->getData());
/**
* Get the first option's name and value of the attribute
*/
$attributeOptionSingle = $objectManager->get(\Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection::class)
->setPositionOrder('asc')
->setAttributeFilter($attributeId)
->setStoreFilter()
->load()
->getFirstItem();
var_dump($attributeOptionSingle->getData());Cheers Hello @tvgarden,
Please check below code and I have created sample code of color attribute, you can replace with your attribute
<?php
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
require 'app/bootstrap.php';
$bootstrap = \Magento\Framework\App\Bootstrap::create(BP, $_SERVER);
$app = $bootstrap->createApplication('Magento\Framework\App\Http');
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$objectManager->get('Magento\Framework\App\State')->setAreaCode('frontend'); // adminhtml
$eavConfig = $objectManager->create('\Magento\Eav\Model\Config');
$attributeCode = 'color';
$attribute = $eavConfig->getAttribute('catalog_product', $attributeCode);
$options = $attribute->getSource()->getAllOptions();
print '<pre>';
print_r($options);
// $bootstrap->run($app);You can also check result https://www.screencast.com/t/o6veC3NT43
--
If my answer is useful, please Accept as Solution & give Kudos
Hello @Manish Mittal,
Thank you for your reply.
I tried the first solution but it's returning an empty array.
At the moment I hard coded the attribute id for 'color'.
This code is called by ajax.
<?php
namespace Vendor\Module\Controller\Adminhtml\Index;
class Customajax extends \Magento\Backend\App\Action
{
protected $resultPageFactory;
protected $resultJsonFactory;
protected $attribute_id;
protected $optionFactory;
protected $_attributeOptionCollection;
protected $_productAttributeRepository;
public function __construct(
\Magento\Backend\App\Action\Context $context,
\Magento\Framework\Controller\Result\JsonFactory $resultPageFactory,
\Magento\Framework\Controller\Result\JsonFactory $resultJsonFactory,
\Magento\Eav\Api\Data\AttributeOptionInterfaceFactory $optionFactory,
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection $attributeOptionCollection,
\Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository ,
\Magento\Eav\Model\Entity\Attribute $entityAttribute,
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Collection $entityAttributeCollection,
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection $entityAttributeOptionCollection,
array $data = []
) {
parent::__construct($context);
$this->resultPageFactory = $resultPageFactory;
$this->resultJsonFactory = $resultJsonFactory;
$this->optionFactory = $optionFactory;
$this->_attributeOptionCollection = $attributeOptionCollection;
$this->_productAttributeRepository = $productAttributeRepository;
$this->_entityAttribute = $entityAttribute;
$this->_entityAttributeCollection = $entityAttributeCollection;
$this->_entityAttributeOptionCollection = $entityAttributeOptionCollection;
/*
*/
}
public function execute()
{
if($this->getRequest()->isAjax()){
$this->attribute_id = $this->getRequest()->getParam('value');
$array = $this->getArray();
return $this->resultJsonFactory->create()->setData(['message' => 'hi', 'value' => $this->attribute_id, 'array' => $array]);
}
return $this->resultJsonFactory->create();
}
public function getArray(){
// This hard coded array works
$array = array(
array("value"=>"1","label"=>"Value 1","labeltitle"=>"value 1"),
array("value"=>"2","label"=>"Value 1","labeltitle"=>"value 1"),
array("value"=>"3","label"=>"Value 1","labeltitle"=>"value 1")
);
// I would like this code to work
//For testing purpose I hard coded attribute_id
$array = $this->getAttributeOptionAll(93);
return $array;
}
/**
* Get all options name and value of the attribute
*
* @param int $attributeId
* @return \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection
*/
public function getAttributeOptionAll($attributeId)
{
return $this->_attributeOptionCollection
->setPositionOrder('asc')
->setAttributeFilter($attributeId)
->setStoreFilter()
->load();
}
}
I have tried the first solution from yours, it was returning an empty array.
I used attribute_id and it works without problems.
Thank you very much for your reply.