Magento 2.0中如何通过属性代码获取产品属性选项
How to get Product Attribute Options by attribute code in Magento 2.0
我正在尝试检索下拉属性列表并检查该值是否存在(如果存在,我需要获取该值并将其分配给产品),如果不存在,我将不得不创建它并获取它的价值分配给产品。
$attribute = $this->objectManager->create('Magento\Eav\Model\Entity\Attribute');
$attributeId = $attribute->getIdByCode('catalog_product','manufacturer');
$model = $this->objectManager->create('Magento\Catalog\Model\ResourceModel\Eav\Attribute');
$model->load($attributeId);
print_r($model->getFrontendLabel());
下面的代码有助于查找特定的属性值。就像这里的颜色在我的属性上,使用下面的代码我们可以得到什么,所有颜色都映射到这个属性。
$attributeId = Mage::getResourceModel(‘eav/entity_attribute’)>getIdByCode(‘catalog_product’,’color’);
$collection =Mage::getResourceModel(‘eav/entity_attribute_option_collection’)>setPositionOrder(‘asc’)->setAttributeFilter($attributeId)->setStoreFilter(0)->load();
print_r($collection->getData());
根据 Magento 2 指南,您不应该自己使用 ObjectManager。相反,您必须使用依赖注入。 More info here
在你的 Block/Controller/Helper... 中,创建一个构造函数并注入 \Magento\Catalog\Api\ProductAttributeRepositoryInterface
class。例如:
private \Magento\Catalog\Api\ProductAttributeRepositoryInterface $productAttributeRepository;
public function __construct(
\Magento\Catalog\Api\ProductAttributeRepositoryInterface $productAttributeRepository
) {
$this->productAttributeRepository = $productAttributeRepository;
}
然后,在您的专用方法中,您想调用 (为清楚起见添加了 PHPDoc) :
/** @var \Magento\Eav\Api\Data\AttributeOptionInterface[] $manufacturerOptions */
$manufacturerOptions = $this->productAttributeRepository->get('manufacturer')->getOptions();
您现在可以通过这种方式获取选项值和标签:
foreach ($manufacturerOptions as $manufacturerOption) {
$manufacturerOption->getValue(); // Value
$manufacturerOption->getLabel(); // Label
}
<?php echo $_product->getResource()->getAttribute('movement')->getFrontend()->getValue($_product);?>
$_product是Product的对象
上面的代码returns 属性名称的属性值"movement".
在你的构造函数中注入一个 \Magento\Catalog\Model\Product\Attribute\Repository
的实例(在一个块中,助手 class 或任何地方):
/**
* @var \Magento\Catalog\Model\Product\Attribute\Repository $_productAttributeRepository
*/
protected $_productAttributeRepository;
/**
* ...
* @param \Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository
* ...
*/
public function __construct(
...
\Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository,
...
) {
...
$this->_productAttributeRepository = $productAttributeRepository;
...
}
然后在你的class中创建一个方法来通过代码获取属性:
/**
* Get single product attribute data
*
* @return Magento\Catalog\Api\Data\ProductAttributeInterface
*/
public function getProductAttributeByCode($code)
{
$attribute = $this->_productAttributeRepository->get($code);
return $attribute;
}
然后您可以像这样调用此方法,例如在 .phtml 文件中
$attrTest = $block->getProductAttributeByCode('test');
然后你可以调用属性对象,例如
- 获取选项:
$attrTest->getOptions()
- 获取每个商店的前端标签:
$attrTest->getFrontendLabels()
- 调试数据数组:
echo '> ' . print_r($attrTest->debug(), true);
debug: Array (
[attribute_id] => 274
[entity_type_id] => 4
[attribute_code] => product_manual_download_label
[backend_type] => varchar
[frontend_input] => text
[frontend_label] => Product Manual Download Label
[is_required] => 0
[is_user_defined] => 1
[default_value] => Product Manual Download
[is_unique] => 0
[is_global] => 0
[is_visible] => 1
[is_searchable] => 0
[is_filterable] => 0
[is_comparable] => 0
[is_visible_on_front] => 0
[is_html_allowed_on_front] => 1
[is_used_for_price_rules] => 0
[is_filterable_in_search] => 0
[used_in_product_listing] => 0
[used_for_sort_by] => 0
[is_visible_in_advanced_search] => 0
[position] => 0
[is_wysiwyg_enabled] => 0
[is_used_for_promo_rules] => 0
[is_required_in_admin_store] => 0
[is_used_in_grid] => 1
[is_visible_in_grid] => 1
[is_filterable_in_grid] => 1
[search_weight] => 1 )
使用API服务层,对于任何实体类型的EAV属性,如下在构造函数中注入服务数据成员。
protected $eavAttributeRepository;
public function __construct(
...
\Magento\Eav\Api\AttributeRepositoryInterface $eavAttributeRepositoryInterface,
...
){
...
$this->eavAttributeRepository = $eavAttributeRepositoryInterface;
...
}
并且您可以使用它来获取属性。
$attribute = $this->eavAttributeRepository->get('catalog_product', 'attribute_code_here');
// vardump($attribute->getData());
为了获得属性选项值数组,使用这个。
$options = $attribute->getSource()->getAllOptions();
Try the following code
$attribute_code = "coffe_type";
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$eavConfig = $objectManager->get('\Magento\Eav\Model\Config');
$attribute = $eavConfig->getAttribute('catalog_product',$attribute_code );
$options = $attribute->getSource()->getAllOptions();
foreach($options as $option) {
$optionsExists[] = array('label' => $option['label'], 'value'=> $option['value'] );
}
print_r($optionsExists);
我正在尝试检索下拉属性列表并检查该值是否存在(如果存在,我需要获取该值并将其分配给产品),如果不存在,我将不得不创建它并获取它的价值分配给产品。
$attribute = $this->objectManager->create('Magento\Eav\Model\Entity\Attribute');
$attributeId = $attribute->getIdByCode('catalog_product','manufacturer');
$model = $this->objectManager->create('Magento\Catalog\Model\ResourceModel\Eav\Attribute');
$model->load($attributeId);
print_r($model->getFrontendLabel());
下面的代码有助于查找特定的属性值。就像这里的颜色在我的属性上,使用下面的代码我们可以得到什么,所有颜色都映射到这个属性。
$attributeId = Mage::getResourceModel(‘eav/entity_attribute’)>getIdByCode(‘catalog_product’,’color’);
$collection =Mage::getResourceModel(‘eav/entity_attribute_option_collection’)>setPositionOrder(‘asc’)->setAttributeFilter($attributeId)->setStoreFilter(0)->load();
print_r($collection->getData());
根据 Magento 2 指南,您不应该自己使用 ObjectManager。相反,您必须使用依赖注入。 More info here
在你的 Block/Controller/Helper... 中,创建一个构造函数并注入 \Magento\Catalog\Api\ProductAttributeRepositoryInterface
class。例如:
private \Magento\Catalog\Api\ProductAttributeRepositoryInterface $productAttributeRepository;
public function __construct(
\Magento\Catalog\Api\ProductAttributeRepositoryInterface $productAttributeRepository
) {
$this->productAttributeRepository = $productAttributeRepository;
}
然后,在您的专用方法中,您想调用 (为清楚起见添加了 PHPDoc) :
/** @var \Magento\Eav\Api\Data\AttributeOptionInterface[] $manufacturerOptions */
$manufacturerOptions = $this->productAttributeRepository->get('manufacturer')->getOptions();
您现在可以通过这种方式获取选项值和标签:
foreach ($manufacturerOptions as $manufacturerOption) {
$manufacturerOption->getValue(); // Value
$manufacturerOption->getLabel(); // Label
}
<?php echo $_product->getResource()->getAttribute('movement')->getFrontend()->getValue($_product);?>
$_product是Product的对象 上面的代码returns 属性名称的属性值"movement".
在你的构造函数中注入一个 \Magento\Catalog\Model\Product\Attribute\Repository
的实例(在一个块中,助手 class 或任何地方):
/**
* @var \Magento\Catalog\Model\Product\Attribute\Repository $_productAttributeRepository
*/
protected $_productAttributeRepository;
/**
* ...
* @param \Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository
* ...
*/
public function __construct(
...
\Magento\Catalog\Model\Product\Attribute\Repository $productAttributeRepository,
...
) {
...
$this->_productAttributeRepository = $productAttributeRepository;
...
}
然后在你的class中创建一个方法来通过代码获取属性:
/**
* Get single product attribute data
*
* @return Magento\Catalog\Api\Data\ProductAttributeInterface
*/
public function getProductAttributeByCode($code)
{
$attribute = $this->_productAttributeRepository->get($code);
return $attribute;
}
然后您可以像这样调用此方法,例如在 .phtml 文件中
$attrTest = $block->getProductAttributeByCode('test');
然后你可以调用属性对象,例如
- 获取选项:
$attrTest->getOptions()
- 获取每个商店的前端标签:
$attrTest->getFrontendLabels()
- 调试数据数组:
echo '> ' . print_r($attrTest->debug(), true);
debug: Array ( [attribute_id] => 274 [entity_type_id] => 4 [attribute_code] => product_manual_download_label [backend_type] => varchar [frontend_input] => text [frontend_label] => Product Manual Download Label [is_required] => 0 [is_user_defined] => 1 [default_value] => Product Manual Download [is_unique] => 0 [is_global] => 0 [is_visible] => 1 [is_searchable] => 0 [is_filterable] => 0 [is_comparable] => 0 [is_visible_on_front] => 0 [is_html_allowed_on_front] => 1 [is_used_for_price_rules] => 0 [is_filterable_in_search] => 0 [used_in_product_listing] => 0 [used_for_sort_by] => 0 [is_visible_in_advanced_search] => 0 [position] => 0 [is_wysiwyg_enabled] => 0 [is_used_for_promo_rules] => 0 [is_required_in_admin_store] => 0 [is_used_in_grid] => 1 [is_visible_in_grid] => 1 [is_filterable_in_grid] => 1 [search_weight] => 1 )
使用API服务层,对于任何实体类型的EAV属性,如下在构造函数中注入服务数据成员。
protected $eavAttributeRepository;
public function __construct(
...
\Magento\Eav\Api\AttributeRepositoryInterface $eavAttributeRepositoryInterface,
...
){
...
$this->eavAttributeRepository = $eavAttributeRepositoryInterface;
...
}
并且您可以使用它来获取属性。
$attribute = $this->eavAttributeRepository->get('catalog_product', 'attribute_code_here');
// vardump($attribute->getData());
为了获得属性选项值数组,使用这个。
$options = $attribute->getSource()->getAllOptions();
Try the following code
$attribute_code = "coffe_type";
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$eavConfig = $objectManager->get('\Magento\Eav\Model\Config');
$attribute = $eavConfig->getAttribute('catalog_product',$attribute_code );
$options = $attribute->getSource()->getAllOptions();
foreach($options as $option) {
$optionsExists[] = array('label' => $option['label'], 'value'=> $option['value'] );
}
print_r($optionsExists);