Respostas:
você pode fazer o mesmo que magento 1,
Mais informações em detalhes, Visita, Obter ID da opção e Etiqueta do produto configurável
// obtém o rótulo da opção com base no ID da opção do objeto do produto
$optionId = 10;
$attr = $_product->getResource()->getAttribute('color');
if ($attr->usesSource()) {
$optionText = $attr->getSource()->getOptionText($optionId);
}
//get option text ex. Red
// obtém o ID da opção com base no rótulo da opção
$attr = $_product->getResource()->getAttribute('color');
if ($attr->usesSource()) {
$option_id = $attr->getSource()->getOptionId("Red");
}
//get option id ex. 10
A melhor prática no magento é fazê-lo via xml.
Para obter um atributo padrão como brand
você faz algo parecido com isto, catalog_product_view.xml
por exemplo:
<referenceBlock name="product.info.main">
<block class="Magento\Catalog\Block\Product\View\Description" 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>
Isso obterá o valor de um atributo de entrada ou área de texto. Se você tiver uma lista suspensa, use o tipo de texto; adicione esta linha na lista de argumentos:
<argument name="at_type" xsi:type="string">text</argument>
Não há necessidade de criar arquivos ou escrever qualquer código php para obter um atributo. Dessa forma, você terá consistência e usará o mesmo arquivo attribute.phtml para todos os atributos. Se algo mudar, você precisará alterá-lo apenas em um local.
Trabalhou para mim
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Usar método de fábrica
protected $_attributeLoading;
public function __construct(
.....
\Magento\Catalog\Model\ResourceModel\ProductFactory $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);
}
}
no arquivo phtml
$this->getAttributeOptionId('color','//optionLabel');
$this->getAttributeOptionText('color','//optionId');
eu recebo uma solução simples. isso mostrará apenas o valor do atributo com o código do atributo para um produto. Eu verifiquei na página de catálogo e detalhes.
o código é
<?php echo $_product->getAttributeText('size'); ?>
aqui size é o nome do atributo.
referência: vendor / magento / catalog-module / view / frontend / templates / product / view / attribute.phtml line: 35
$product->getResource()
tem uma nota do DocBlock sobre ser descontinuado pelo menos na v2.2.2 e, portanto, hesitei em codificá-lo. Criamos essa solução, inspirada nas que já estão nesta página:
$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
}
Para referência, este é o método em AbstractModel.php
/**
* Retrieve model resource
*
* @return \Magento\Framework\Model\ResourceModel\Db\AbstractDb
* @deprecated 101.0.0 because resource models should be used directly
*/
public function getResource()
{
return $this->_getResource();
}
getResource()
método neste modelo: github.com/magento/magento2/blob/2.3-develop/app/code/Magento/…
getResource()
era um método que existia anteriormente. Na v2.2.2, como mencionei, ele já estava programado para ser descontinuado. No ramo de desenvolvimento 2.3, suspeito que tenha sido concluído. Assim, meu exemplo que não requer essa função.
Para todo mundo vem aqui.
Se você não tiver nenhuma entidade do produto, poderá recuperar um valor de opção com estas etapas.
Injetar \Magento\Eav\Api\AttributeRepositoryInterface
na sua turma
public function __construct(
...
\Magento\Eav\Api\AttributeRepositoryInterface $attributeRepository,
...
) {
...
$this->attributeRepository = $attributeRepository;
...
}
Use o repositório para obter a instância do atributo
// 4 is the default entity_type_id for product
$attribute = $this->attributeRepository->get('4', '[attribute_code]');
Use $attribute
para obter o ID da opção no valor da opção
$optionId = $attribute->getSource()->getOptionId('[option_value]');
você pode usar para obter o rótulo do atributo
$product->getResource()->getAttribute($key)->getFrontend()->getLabel($product);
você pode usar o gerenciador de objetos:
$pid = 1;
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$pdata = $objectManager->create('Magento\Catalog\Model\Product')->load($pid);
$getlable = $pdata->getResource()->getAttribute($key)->getFrontend()->getLabel($pdata);
Por favor, tente este código
Etapa 1) Primeiro você precisa carregar os produtos
$_productCollection = $block->getLoadedProductCollection();
Etapa 2) Na página de listagem de produtos, haverá um loop foreach para listar produtos como este
foreach ($_productCollection as $_product)
Etapa 3) Seu código estará dentro desse loop. Coloque o código abaixo em um local onde você deseja exibir o rótulo do atributo.
$_product->getResource()->getAttribute('your_attribute_code')->getFrontend()->getValue($_product);
Apenas substitua your_attribute_code pelo nome do seu atributo.